@thierrynakoa/fire-flow 12.2.2 → 13.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CREDITS.md +25 -0
- package/DOMINION-FLOW-OVERVIEW.md +182 -38
- package/README.md +399 -690
- package/TROUBLESHOOTING.md +264 -367
- package/agents/fire-debugger.md +54 -0
- package/agents/fire-executor.md +1610 -1033
- package/agents/fire-fact-checker.md +1 -1
- package/agents/fire-planner.md +85 -17
- package/agents/fire-project-researcher.md +1 -1
- package/agents/fire-researcher.md +4 -22
- package/agents/{fire-phoenix-analyst.md → fire-resurrection-analyst.md} +394 -394
- package/agents/fire-reviewer.md +552 -499
- package/agents/fire-verifier.md +114 -19
- package/bin/cli.js +18 -101
- package/commands/fire-0-orient.md +2 -2
- package/commands/fire-1a-new.md +50 -15
- package/commands/fire-1c-setup.md +33 -5
- package/commands/fire-1d-discuss.md +87 -1
- package/commands/fire-2-plan.md +556 -527
- package/commands/fire-3-execute.md +2046 -1356
- package/commands/fire-4-verify.md +975 -906
- package/commands/fire-5-handoff.md +46 -5
- package/commands/fire-6-resume.md +2 -31
- package/commands/fire-add-new-skill.md +138 -19
- package/commands/fire-autonomous.md +14 -2
- package/commands/fire-complete-milestone.md +1 -1
- package/commands/fire-cost.md +179 -183
- package/commands/fire-debug.md +1 -6
- package/commands/fire-loop-resume.md +2 -2
- package/commands/fire-loop-stop.md +1 -1
- package/commands/fire-loop.md +2 -15
- package/commands/fire-map-codebase.md +1 -1
- package/commands/fire-migrate-database.md +548 -0
- package/commands/fire-new-milestone.md +1 -1
- package/commands/fire-reflect.md +1 -2
- package/commands/fire-research.md +142 -21
- package/commands/{fire-phoenix.md → fire-resurrect.md} +859 -603
- package/commands/fire-scaffold.md +297 -0
- package/commands/fire-search.md +1 -2
- package/commands/fire-security-scan.md +483 -484
- package/commands/fire-setup.md +359 -0
- package/commands/fire-skill.md +770 -0
- package/commands/fire-skills-diff.md +506 -506
- package/commands/fire-skills-history.md +388 -388
- package/commands/fire-skills-rollback.md +7 -7
- package/commands/fire-skills-sync.md +470 -470
- package/commands/fire-test.md +5 -5
- package/commands/fire-todos.md +1 -1
- package/commands/fire-update.md +5 -5
- package/commands/fire-validate-skills.md +282 -0
- package/commands/fire-verify-uat.md +9 -177
- package/commands/fire-vuln-scan.md +492 -493
- package/hooks/run-hook.sh +8 -8
- package/hooks/run-session-end.sh +7 -7
- package/hooks/session-end.sh +90 -90
- package/hooks/session-start.sh +1 -1
- package/package.json +4 -25
- package/plugin.json +7 -7
- package/references/autonomy-levels.md +235 -0
- package/references/behavioral-directives.md +95 -3
- package/references/blocker-tracking.md +1 -1
- package/references/circuit-breaker.md +93 -2
- package/references/context-engineering.md +227 -9
- package/references/honesty-protocols.md +70 -1
- package/references/issue-to-pr-pipeline.md +149 -150
- package/references/metrics-and-trends.md +1 -2
- package/references/research-improvements.md +4 -108
- package/references/sdlc-mapping.md +73 -0
- package/references/state-machine.md +151 -0
- package/skills-library/AVAILABLE_TOOLS_REFERENCE.md +333 -0
- package/skills-library/SKILLS-INDEX.md +57 -558
- package/skills-library/SKILLS_LIBRARY_INDEX.md +532 -0
- package/skills-library/_general/api-patterns/api-field-name-mismatch.md +107 -0
- package/skills-library/_general/api-patterns/streaming-command-timeout.md +122 -0
- package/skills-library/_general/api-patterns/streaming-proxy-cors-bypass.md +102 -0
- package/skills-library/_general/automation/settings-gui-generator.md +172 -0
- package/skills-library/_general/database-solutions/data-type-mapping-reference.md +181 -0
- package/skills-library/_general/database-solutions/mysql-limit-offset-string-coercion.md +102 -0
- package/skills-library/_general/database-solutions/mysql-to-pg-migration.md +195 -0
- package/skills-library/_general/database-solutions/orm-schema-portability.md +193 -0
- package/skills-library/_general/database-solutions/persistent-analysis-storage.md +207 -0
- package/skills-library/_general/database-solutions/pg-to-mysql-schema-migration-methodology.md +190 -0
- package/skills-library/_general/database-solutions/sql-dialect-compatibility-matrix.md +306 -0
- package/skills-library/_general/database-solutions/sqlite-to-pg-migration.md +219 -0
- package/skills-library/_general/frontend/canvas-bubble-animation-grouping.md +270 -0
- package/skills-library/_general/frontend/color-token-migration.md +112 -0
- package/skills-library/_general/frontend/framer-motion-layoutid-grouping.md +150 -0
- package/skills-library/_general/frontend/pyqt6-settings-dialog.md +191 -0
- package/skills-library/_general/frontend/react-flow-animated-layout-switching.md +101 -0
- package/skills-library/_general/frontend/react-hooks-order-debugging.md +141 -0
- package/skills-library/_general/frontend/redux-localstorage-auth-desync.md +126 -0
- package/skills-library/_general/frontend/safari-csp-theme-color-debugging.md +124 -0
- package/skills-library/_general/frontend/safari-sw-cache-poisoning.md +138 -0
- package/skills-library/_general/frontend/svg-sparkline-no-charting-library.md +131 -0
- package/skills-library/_general/growth-marketing/oss-daily-growth-intelligence.md +224 -0
- package/skills-library/_general/integrations/claude-code-local-mcp-integration.md +250 -0
- package/skills-library/_general/integrations/mcp-composite-tool-orchestration.md +200 -0
- package/skills-library/_general/methodology/AGENT_SDK_STANDALONE_TOOLING.md +181 -0
- package/skills-library/_general/methodology/AGENT_TEAMS_GUIDE.md +169 -0
- package/skills-library/_general/methodology/ALAS_STATEFUL_EXECUTION.md +207 -0
- package/skills-library/_general/methodology/AUTO_REVIEWER_SUBAGENT.md +211 -0
- package/skills-library/_general/methodology/CONSISTENCY_CHECK_AMBIGUITY_GATE.md +96 -0
- package/skills-library/_general/methodology/DEAD_ENDS_SHELF.md +4 -4
- package/skills-library/_general/methodology/DISTILL_NOT_DUMP.md +108 -0
- package/skills-library/_general/methodology/EXECUTION_PROGRESS_MONITOR.md +157 -0
- package/skills-library/_general/methodology/HIERARCHICAL_REVIEW_MARS.md +122 -0
- package/skills-library/_general/methodology/MCP_INTER_AGENT_BRIDGE.md +207 -0
- package/skills-library/_general/methodology/MERMAID_WIZARD_DIAGRAMS.md +77 -0
- package/skills-library/_general/methodology/MISSING_DIMENSION_DETECTOR.md +89 -0
- package/skills-library/_general/methodology/MULTI_AGENT_COORDINATION.md +397 -0
- package/skills-library/_general/methodology/OBSERVATION_MASKING.md +100 -0
- package/skills-library/_general/methodology/PHOENIX_REBUILD_METHODOLOGY.md +82 -11
- package/skills-library/_general/methodology/REVIEW_BACKTRACK_PANEL.md +140 -0
- package/skills-library/_general/methodology/REVIEW_FIX_LOOP.md +117 -0
- package/skills-library/_general/methodology/VOTING_VERDICT_ARBITRATION.md +155 -0
- package/skills-library/_general/methodology/ZERO_FRICTION_CLI_SETUP.md +2 -2
- package/skills-library/_general/methodology/dead-code-activation.md +123 -0
- package/skills-library/_general/methodology/debug-swarm-researcher-escape-hatch.md +240 -240
- package/skills-library/_general/methodology/shell-autonomous-loop-fixplan.md +1 -1
- package/skills-library/_general/patterns-standards/GOF_DESIGN_PATTERNS_FOR_AI_AGENTS.md +5 -5
- package/skills-library/_general/patterns-standards/cascading-failure-diagnosis.md +119 -0
- package/skills-library/_general/patterns-standards/domain-specific-layout-algorithms.md +209 -0
- package/skills-library/_general/patterns-standards/python-desktop-app-architecture.md +399 -0
- package/skills-library/_general/patterns-standards/realtime-monitoring-dashboard.md +457 -0
- package/skills-library/_general/patterns-standards/togglable-processing-pipeline.md +169 -0
- package/skills-library/_general/performance/liveclock-extraction.md +112 -0
- package/skills-library/_general/performance/ref-based-canvas-animation.md +117 -0
- package/skills-library/_general/performance/use-visible-interval.md +131 -0
- package/skills-library/_general/testing/playwright-firefox-withcredentials-auth-issue.md +104 -0
- package/skills-library/_quarantine/README.md +30 -0
- package/skills-library/api-patterns/BROADCAST_SCHEDULER_SHARED_EXECUTE_FUNCTION.md +150 -0
- package/skills-library/api-patterns/ERROR_RESPONSE_STANDARDS.md +145 -0
- package/skills-library/api-patterns/EXPRESS_ROUTE_ORDERING_MIDDLEWARE_INTERCEPTION.md +326 -0
- package/skills-library/api-patterns/PAGINATION_PATTERNS.md +137 -0
- package/skills-library/api-patterns/PODCAST_PROGRESS_TRACKING_THREE_ROOT_CAUSES.md +277 -0
- package/skills-library/api-patterns/RATE_LIMITING_TOGGLE.md +155 -0
- package/skills-library/api-patterns/graphql-content-queries.md +708 -0
- package/skills-library/appointment-scheduler-design.md +423 -0
- package/skills-library/automation/AUTO_POPULATE_COMPLETE_GUIDE.md +631 -0
- package/skills-library/automation/CC_WORKFLOW_STUDIO.md +83 -0
- package/skills-library/automation/CLAUDE_CODE_SWARM_MODE.md +95 -0
- package/skills-library/automation/DAEMON_TRIGGER_FILE_IPC.md +195 -0
- package/skills-library/automation/scheduled-content-publishing.md +608 -0
- package/skills-library/awesome-workflows/Blogging-Platform-Instructions/view_commands.md +25 -0
- package/skills-library/awesome-workflows/CREDENTIAL-SECURITY-WORKFLOW.md +109 -0
- package/skills-library/awesome-workflows/DEBUGGING-WORKFLOW.md +124 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/README.md +31 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-principles-example.md +129 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-agent.md +107 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-claude-md-snippet.md +24 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-slash-command.md +38 -0
- package/skills-library/awesome-workflows/PARALLEL-RESEARCH-WORKFLOW.md +89 -0
- package/skills-library/awesome-workflows/PHASE-EXECUTION-WORKFLOW.md +97 -0
- package/skills-library/awesome-workflows/SESSION-HANDOFF-WORKFLOW.md +116 -0
- package/skills-library/cms-patterns/content-branch-preview.md +515 -0
- package/skills-library/cms-patterns/inline-visual-editing.md +666 -0
- package/skills-library/cms-patterns/mdx-component-content.md +649 -0
- package/skills-library/cms-patterns/media-manager-abstraction.md +827 -0
- package/skills-library/cms-patterns/schema-driven-form-generator.md +838 -0
- package/skills-library/complexity-metrics/complexity-divider.md +707 -0
- package/skills-library/complexity-metrics/work-with-complexity.md +193 -0
- package/skills-library/creative-multimedia/animation-stack-guide.md +577 -0
- package/skills-library/creative-multimedia/audio-enhancement-pipeline.md +625 -0
- package/skills-library/creative-multimedia/content-repurposing-pipeline.md +1146 -0
- package/skills-library/creative-multimedia/data-visualization-generator.md +862 -0
- package/skills-library/creative-multimedia/doc-to-podcast-pipeline.md +2184 -0
- package/skills-library/creative-multimedia/ffmpeg-command-generator.md +405 -0
- package/skills-library/creative-multimedia/image-optimization-pipeline.md +605 -0
- package/skills-library/creative-multimedia/multi-format-content-generator.md +1759 -0
- package/skills-library/creative-multimedia/og-image-generator.md +635 -0
- package/skills-library/creative-multimedia/podcast-audio-composition.md +1355 -0
- package/skills-library/creative-multimedia/podcast-quality-evaluation.md +1452 -0
- package/skills-library/creative-multimedia/podcast-script-generation.md +1841 -0
- package/skills-library/creative-multimedia/svg-generation.md +750 -0
- package/skills-library/creative-multimedia/text-to-speech-provider-selector.md +1414 -0
- package/skills-library/creative-multimedia/transcription-pipeline-selector.md +677 -0
- package/skills-library/creative-multimedia/video-streaming-setup.md +559 -0
- package/skills-library/database-solutions/AI_RESPONSE_DATABASE_CACHING.md +520 -0
- package/skills-library/database-solutions/CONDITIONAL_SQL_MIGRATION_PATTERN.md +119 -0
- package/skills-library/database-solutions/DATABASE_COLUMN_NAME_MISMATCH.md +393 -0
- package/skills-library/database-solutions/DATABASE_SCHEMA.md +394 -0
- package/skills-library/database-solutions/DATABASE_SCHEMA_VERIFICATION_GUIDE.md +348 -0
- package/skills-library/database-solutions/DATABASE_STRATEGY.md +71 -0
- package/skills-library/database-solutions/ES_MODULE_SEED_SCRIPT_PATTERN.md +52 -0
- package/skills-library/database-solutions/MIGRATION_GUIDE.md +3 -0
- package/skills-library/database-solutions/PLPGSQL_VARIABLE_CONFLICT_FIX.md +208 -0
- package/skills-library/database-solutions/POSTGRESQL_JSONB_DOUBLE_STRINGIFY_FIX.md +245 -0
- package/skills-library/database-solutions/POSTGRESQL_LICENSE_TABLE_DESIGN.md +393 -0
- package/skills-library/database-solutions/POSTGRESQL_UUID_DOCUMENT_RAG_DUAL_SCOPE.md +732 -0
- package/skills-library/database-solutions/POSTGRES_SQL_TEMPLATE_BINDING_ERROR.md +240 -0
- package/skills-library/database-solutions/PRISMA_DB_PUSH_DATA_LOSS_PREVENTION.md +141 -0
- package/skills-library/database-solutions/PRODUCTION_QUERY_OPTIMIZATION_RESTART_FIX.md +389 -0
- package/skills-library/database-solutions/RLS_SECURITY_GUIDE.md +107 -0
- package/skills-library/database-solutions/SCHEMA_ENHANCEMENTS_GUIDE.md +373 -0
- package/skills-library/database-solutions/SCHEMA_MIGRATION_GUIDE.md +368 -0
- package/skills-library/database-solutions/SCHEMA_VERIFICATION_QUICK_REFERENCE.md +104 -0
- package/skills-library/database-solutions/ai-erd-generator.md +1213 -0
- package/skills-library/database-solutions/content-publishing-states.md +631 -0
- package/skills-library/database-solutions/database-schema-designer.md +522 -0
- package/skills-library/database-solutions/er-diagram-components.md +569 -0
- package/skills-library/database-solutions/er-to-ddl-mapping.md +1405 -0
- package/skills-library/database-solutions/erd-creator-textbook-research.md +433 -0
- package/skills-library/database-solutions/erd-react-flow-architecture.md +1965 -0
- package/skills-library/database-solutions/mariadb-aggregate-function-replacement.md +145 -0
- package/skills-library/database-solutions/normalization-validator.md +778 -0
- package/skills-library/database-solutions/postgres-full-text-search-content.md +494 -0
- package/skills-library/database-solutions/postgresql-to-mysql-runtime-translation.md +286 -0
- package/skills-library/database-solutions/regex-alternation-ordering-sql-types.md +92 -0
- package/skills-library/database-solutions/reserved-word-context-aware-quoting.md +142 -0
- package/skills-library/database-solutions/sql-ddl-generator.md +756 -0
- package/skills-library/database-solutions/supabase-connection-pooler-fix.md +102 -0
- package/skills-library/deployment-security/CPANEL_NODE_DEPLOYMENT.md +166 -0
- package/skills-library/deployment-security/DEPLOYMENT.md +275 -0
- package/skills-library/deployment-security/DEPLOYMENT_CHECKLIST.md +363 -0
- package/skills-library/deployment-security/DEPLOYMENT_PLAN.md +669 -0
- package/skills-library/deployment-security/KNEX_DATABASE_ABSTRACTION.md +444 -0
- package/skills-library/deployment-security/LICENSE_KEY_SYSTEM.md +206 -0
- package/skills-library/deployment-security/NODE18_DEPENDENCY_COMPATIBILITY.md +284 -0
- package/skills-library/deployment-security/PHP_INSTALLER_WIZARD_GUIDE.md +315 -0
- package/skills-library/deployment-security/PM2_ENVIRONMENT_VARIABLE_CACHING.md +256 -0
- package/skills-library/deployment-security/PM2_MEMORY_EXHAUSTION_FIX.md +370 -0
- package/skills-library/deployment-security/PRODUCTION_DEPLOYMENT_GUIDE.md +592 -0
- package/skills-library/deployment-security/PRODUCTION_HARDENING_DOCUMENTATION.md +307 -0
- package/skills-library/deployment-security/PRODUCTION_RECOVERY_CHERRY_PICK_PATTERN.md +202 -0
- package/skills-library/deployment-security/PYINSTALLER_CUDA_WHISPER_BUNDLING.md +236 -0
- package/skills-library/deployment-security/SECURITY.md +41 -0
- package/skills-library/deployment-security/SMTP_SSL_HOSTNAME_MISMATCH_SHARED_HOSTING.md +220 -0
- package/skills-library/deployment-security/SPA_SEO_OPTIMIZATION_CPANEL.md +200 -0
- package/skills-library/deployment-security/SUPABASE_EDGE_FUNCTIONS.md +338 -0
- package/skills-library/deployment-security/VERCEL_GITHUB_DEPLOYMENT_GUIDE.md +858 -0
- package/skills-library/deployment-security/VPS_DEPLOYMENT_READINESS.md +356 -0
- package/skills-library/deployment-security/deployment-changes-not-applying.md +241 -0
- package/skills-library/deployment-security/env-file-management-production-local.md +203 -0
- package/skills-library/deployment-security/express-secure-file-downloads.md +413 -0
- package/skills-library/deployment-security/react-production-deployment-desktop-guide.md +2011 -0
- package/skills-library/deployment-security/self-hosted-supabase-coolify-guide.md +1684 -0
- package/skills-library/deployment-security/unique-features-ai-strategy-plaid-security.md +1613 -0
- package/skills-library/deployment-security/vps-deployment.md +135 -0
- package/skills-library/document-processing/WORD_EXPORT_MARKDOWN_FORMATTING.md +482 -0
- package/skills-library/document-processing/document-ai-landingai-integration.md +677 -0
- package/skills-library/document-processing/express-secure-file-downloads-mern.md +413 -0
- package/skills-library/document-processing/express-secure-file-downloads.md +413 -0
- package/skills-library/document-processing/md-to-word-converter.md +318 -0
- package/skills-library/document-processing/pdf-forms-integration/README.md +101 -0
- package/skills-library/document-processing/pdf-forms-integration/SKILL.md +662 -0
- package/skills-library/ecommerce/ADMIN_PRODUCTS_GUIDE.md +428 -0
- package/skills-library/ecommerce/ECOMMERCE_API_REFERENCE.md +776 -0
- package/skills-library/ecommerce/ECOMMERCE_COMPLETION_SUMMARY.md +673 -0
- package/skills-library/ecommerce/ECOMMERCE_IMPLEMENTATION_GUIDE.md +729 -0
- package/skills-library/ecommerce/ECOMMERCE_QUICK_REFERENCE.md +521 -0
- package/skills-library/ecommerce/ECOMMERCE_TESTING_CHECKLIST.md +565 -0
- package/skills-library/ecommerce/ECOMMERCE_WORKFLOW_GUIDE.md +1059 -0
- package/skills-library/ecommerce/PRODUCT_CREATION_EXPANDED.md +522 -0
- package/skills-library/ecommerce/agentic-commerce-protocol.md +203 -0
- package/skills-library/ecommerce/cart-abandonment-recovery.md +236 -0
- package/skills-library/ecommerce/cart-architecture-patterns.md +300 -0
- package/skills-library/ecommerce/cart-item-count-indicator.md +264 -0
- package/skills-library/ecommerce/checkout-ux-conversion.md +227 -0
- package/skills-library/ecommerce/composable-commerce-selection.md +166 -0
- package/skills-library/ecommerce/ecommerce-analytics-patterns.md +167 -0
- package/skills-library/ecommerce/fraud-detection-patterns.md +179 -0
- package/skills-library/ecommerce/inventory-stock-management.md +270 -0
- package/skills-library/ecommerce/order-saga-state-machine.md +336 -0
- package/skills-library/ecommerce/payment-provider-abstraction.md +245 -0
- package/skills-library/ecommerce/pci-compliance-checklist.md +192 -0
- package/skills-library/ecommerce/refund-chargeback-handling.md +177 -0
- package/skills-library/ecommerce/shipping-carrier-integration.md +218 -0
- package/skills-library/ecommerce/webhook-idempotency-patterns.md +253 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/ci.yml +558 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/prompt-gallery.yml +448 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/release.yml +42 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/test-reusable-ci.yml +25 -0
- package/skills-library/excalidraw-diagrams/CLAUDE.md +57 -0
- package/skills-library/excalidraw-diagrams/LICENSE +21 -0
- package/skills-library/excalidraw-diagrams/README.md +178 -0
- package/skills-library/excalidraw-diagrams/SKILL.md +715 -0
- package/skills-library/form-solutions/BUTTON_TYPE_FORM_SUBMISSION.md +336 -0
- package/skills-library/form-solutions/FILLABLE_PDF_IMPLEMENTATION.md +226 -0
- package/skills-library/form-solutions/SURVEYJS_QUESTIONNAIRE_SYSTEM.md +367 -0
- package/skills-library/form-solutions/tiptap-minimal-setup.md +690 -0
- package/skills-library/frontend/scholarly-classification-bubble-map.md +149 -0
- package/skills-library/infrastructure/ci-cd-pipeline-builder.md +517 -0
- package/skills-library/infrastructure/observability-designer.md +264 -0
- package/skills-library/infrastructure/performance-profiler.md +621 -0
- package/skills-library/installer-wizard-patterns.md +249 -0
- package/skills-library/integrations/CLAUDE_CODE_TOKEN_ANALYTICS.md +160 -0
- package/skills-library/integrations/CONFIGURABLE_AI_PROVIDER_SELECTION.md +728 -0
- package/skills-library/integrations/SOCKET_IO_BROADCAST_ALL_VS_ROOM.md +141 -0
- package/skills-library/integrations/VIRTUAL_MEETINGS_IMPLEMENTATION.md +374 -0
- package/skills-library/integrations/WORDPRESS_LEARNDASH_DATA_RECOVERY.md +53 -0
- package/skills-library/integrations/YOUTUBE_API_SETUP.md +141 -0
- package/skills-library/integrations/YOUTUBE_BOOKMARKING_EXPLANATION.md +252 -0
- package/skills-library/integrations/YOUTUBE_BOOKMARKING_SOLUTION.md +268 -0
- package/skills-library/integrations/YOUTUBE_OAUTH_SETUP_GUIDE.md +200 -0
- package/skills-library/integrations/YOUTUBE_VIDEO_FIX_COMPLETE.md +192 -0
- package/skills-library/integrations/ai-ml/GEMINI_AI_RAG_PIPELINE_COMPLETE_GUIDE.md +195 -0
- package/skills-library/integrations/ai-ml/GEMINI_IMAGE_GENERATION_SETUP.md +64 -0
- package/skills-library/integrations/cloudflare/cloudflare-turnstile-debugging.md +202 -0
- package/skills-library/integrations/cloudflare/cloudflare-turnstile-implementation.md +476 -0
- package/skills-library/integrations/cloudflare-turnstile-debugging.md +202 -0
- package/skills-library/integrations/cloudflare-turnstile-implementation.md +476 -0
- package/skills-library/integrations/ghost-creator-monetization-pattern.md +454 -0
- package/skills-library/integrations/headless-cms-architecture.md +484 -0
- package/skills-library/integrations/headless-cms-stack-selection.md +183 -0
- package/skills-library/integrations/payload-cms-patterns.md +674 -0
- package/skills-library/integrations/realtimestt-openwakeword-cuda-windows.md +229 -0
- package/skills-library/integrations/rss-podcast-integration.md +300 -0
- package/skills-library/integrations/wordpress/WORDPRESS_LEARNDASH_DATA_RECOVERY.md +53 -0
- package/skills-library/integrations/youtube/YOUTUBE_API_SETUP.md +141 -0
- package/skills-library/integrations/youtube/YOUTUBE_BOOKMARKING_EXPLANATION.md +252 -0
- package/skills-library/integrations/youtube/YOUTUBE_BOOKMARKING_SOLUTION.md +268 -0
- package/skills-library/integrations/youtube/YOUTUBE_OAUTH_SETUP_GUIDE.md +200 -0
- package/skills-library/integrations/youtube/YOUTUBE_VIDEO_FIX_COMPLETE.md +192 -0
- package/skills-library/marketing/campaign-analytics.md +97 -0
- package/skills-library/marketing/content-creator.md +105 -0
- package/skills-library/marketing/marketing-strategy-pmm.md +94 -0
- package/skills-library/marketing/social-media-analyzer.md +81 -0
- package/skills-library/methodology/ADVANCED_ORCHESTRATION_PATTERNS.md +401 -0
- package/skills-library/methodology/AGENT_SELF_IMPROVEMENT_LOOP.md +179 -0
- package/skills-library/methodology/BREATH_BASED_PARALLEL_EXECUTION.md +1 -1
- package/skills-library/methodology/CLEANSING_CYCLE.md +358 -0
- package/skills-library/methodology/CONFIDENCE_ANNOTATION_PATTERN.md +143 -0
- package/skills-library/methodology/CRITICAL_PATTERNS_DOCUMENTATION_COMPLETE.md +204 -0
- package/skills-library/methodology/DELIVERABLES_SUMMARY.md +341 -0
- package/skills-library/methodology/DIFFICULTY_AWARE_AGENT_ROUTING.md +252 -0
- package/skills-library/methodology/EVOLUTIONARY_SKILL_SYNTHESIS.md +219 -0
- package/skills-library/methodology/GLOMERULUS_DECISION_GATE.md +223 -0
- package/skills-library/methodology/HIBERNATION_SYSTEM.md +231 -0
- package/skills-library/methodology/INSTRUMENTATION_OVER_RESTRICTION.md +192 -0
- package/skills-library/methodology/MASTER_COMPLETION_SUMMARY.md +444 -0
- package/skills-library/methodology/MASTER_SESSION_COMPLETION.md +743 -0
- package/skills-library/methodology/MERN_QUICK_REFERENCE.md +358 -0
- package/skills-library/methodology/ORGAN_AGENT_MAPPING.md +177 -0
- package/skills-library/methodology/PARALLEL_WAVE_BASED_REFACTORING.md +440 -0
- package/skills-library/methodology/QUICK_REFERENCE.md +358 -0
- package/skills-library/methodology/SDFT_ONPOLICY_SELF_DISTILLATION.md +186 -0
- package/skills-library/methodology/SELF_QUESTIONING_TASK_GENERATION.md +270 -0
- package/skills-library/methodology/SESSION_COMPLETION_SUMMARY.md +304 -0
- package/skills-library/methodology/SESSION_SUMMARY.md +432 -0
- package/skills-library/methodology/WARRIOR_WORKFLOW_DEBUGGING_PROTOCOL.md +252 -0
- package/skills-library/methodology/tech-debt-tracker.md +570 -0
- package/skills-library/parallel-debug/SKILL.md +60 -0
- package/skills-library/patterns-standards/API_PATTERN_FIX_SUMMARY.md +236 -0
- package/skills-library/patterns-standards/BATCH_OPERATIONS_WITH_PROGRESS_MODAL.md +362 -0
- package/skills-library/patterns-standards/CRITICAL_CODING_PATTERNS.md +639 -0
- package/skills-library/patterns-standards/DARK_MODE_MODAL_VISIBILITY.md +258 -0
- package/skills-library/patterns-standards/ERROR_RESILIENCE_IMPLEMENTATION.md +375 -0
- package/skills-library/patterns-standards/ES_MODULE_IMPORT_HOISTING_DOTENV.md +298 -0
- package/skills-library/patterns-standards/NESTED_BACKDROP_FILTER_CSS_ARTIFACT_FIX.md +76 -0
- package/skills-library/patterns-standards/ORDERED_DETECTOR_PIPELINE_GRACEFUL_FALLBACK.md +333 -0
- package/skills-library/patterns-standards/PHASE_IMPORT_ERROR_DEBUGGING.md +271 -0
- package/skills-library/patterns-standards/PYNPUT_GLOBAL_HOTKEY_VK_MATCHING.md +252 -0
- package/skills-library/patterns-standards/REACT_USEEFFECT_CASCADE_RESET_FIX.md +132 -0
- package/skills-library/patterns-standards/SUBMENU_HOVER_DROPDOWN_PATTERN.md +225 -0
- package/skills-library/patterns-standards/TAILWIND_TEXT_VISIBILITY_OVERRIDE.md +322 -0
- package/skills-library/patterns-standards/THEME_AWARE_CSS_VARIABLES_PATTERN.md +209 -0
- package/skills-library/patterns-standards/THEME_USER_OBJECT_PROPERTY_NAMING.md +194 -0
- package/skills-library/patterns-standards/TOOLTIP_BLOCKING_CLICKS_FIX.md +267 -0
- package/skills-library/patterns-standards/claude-code-plugin-structure.md +235 -0
- package/skills-library/patterns-standards/react-i18next-setup.md +429 -0
- package/skills-library/patterns-standards/thesys-c1-generative-ui-integration.md +967 -0
- package/skills-library/plugin-development/CLAUDE_CODE_COMMAND_REGISTRATION_SILENT_FAILURE.md +315 -0
- package/skills-library/plugin-development/plugin-command-namespace-vs-global.md +390 -0
- package/skills-library/plugin-development/plugin-doc-auto-generation.md +172 -0
- package/skills-library/security/GITHUB_REPO_SECURITY_AUDIT.md +115 -0
- package/skills-library/security/admin-deletion-safety.md +396 -0
- package/skills-library/security/application-vuln-patterns.md +477 -0
- package/skills-library/security/env-secrets-manager.md +686 -0
- package/skills-library/security/secure-ai-application-templates.md +347 -0
- package/skills-library/security/sql-injection-prevention-postgresjs.md +151 -0
- package/skills-library/supabase-connection-pooler-fix.md +102 -0
- package/skills-library/system-context/POWERSHELL_BASH_INTEROP.md +82 -0
- package/skills-library/system-context/SERVICE_LIFECYCLE_MANAGEMENT.md +119 -0
- package/skills-library/system-context/SKILL.md +40 -0
- package/skills-library/system-context/WINDOWS_DEV_ENVIRONMENT.md +73 -0
- package/skills-library/testing/E2E_PLAYWRIGHT_PATTERNS.md +99 -0
- package/skills-library/testing/INTEGRATION_TEST_STRATEGY.md +82 -0
- package/skills-library/testing/RED_GREEN_BUGFIX_GATE.md +203 -0
- package/skills-library/testing/TEST_DATA_MANAGEMENT.md +69 -0
- package/skills-library/testing/VITEST_UNIT_TEST_PATTERNS.md +75 -0
- package/skills-library/testing/playwright-api-security-tests.md +202 -0
- package/skills-library/toolbox/SKILL.md +84 -0
- package/skills-library/toolbox/code-graph-and-web-scraping-mcps.md +237 -0
- package/skills-library/ui-ux-pro-max/ACCESSIBILITY_ESSENTIALS.md +115 -0
- package/skills-library/ui-ux-pro-max/DESIGN_SYSTEM_SCAFFOLDING.md +133 -0
- package/skills-library/ui-ux-pro-max/RESPONSIVE_LAYOUT_PATTERNS.md +119 -0
- package/skills-library/ui-ux-pro-max/SKILL.md +386 -0
- package/skills-library/ui-ux-pro-max/data/charts.csv +26 -0
- package/skills-library/ui-ux-pro-max/data/colors.csv +97 -0
- package/skills-library/ui-ux-pro-max/data/icons.csv +101 -0
- package/skills-library/ui-ux-pro-max/data/landing.csv +31 -0
- package/skills-library/ui-ux-pro-max/data/products.csv +97 -0
- package/skills-library/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/skills-library/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/skills-library/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/skills-library/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/skills-library/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/skills-library/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/skills-library/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/skills-library/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/skills-library/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills-library/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/skills-library/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/skills-library/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/skills-library/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/skills-library/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/skills-library/ui-ux-pro-max/data/styles.csv +68 -0
- package/skills-library/ui-ux-pro-max/data/typography.csv +58 -0
- package/skills-library/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/skills-library/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/skills-library/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/skills-library/wordpress-style-theme-components.md +1526 -0
- package/templates/ASSUMPTIONS.md +1 -1
- package/templates/DECISION_LOG.md +0 -1
- package/templates/phase-prompt.md +1 -1
- package/templates/phoenix-comparison.md +6 -6
- package/templates/skill-api-integration.md +106 -0
- package/templates/skill-architecture-pattern.md +92 -0
- package/templates/skill-debug-pattern.md +98 -0
- package/templates/skill-devops-recipe.md +107 -0
- package/templates/skill-general.md +65 -0
- package/templates/skill-ui-component.md +113 -0
- package/version.json +7 -3
- package/workflows/handoff-session.md +2 -2
- package/workflows/new-project.md +2 -2
- package/workflows/plan-phase.md +1 -1
- package/.claude-plugin/plugin.json +0 -64
- package/skills-library/_general/methodology/LIVE_BREADCRUMB_PROTOCOL.md +0 -242
- package/skills-library/_general/methodology/llm-judge-memory-crud.md +0 -241
- package/skills-library/methodology/REFLEXION_MEMORY_PATTERN.md +0 -183
- package/skills-library/methodology/RESEARCH_BACKED_WORKFLOW_UPGRADE.md +0 -263
- package/skills-library/methodology/SABBATH_REST_PATTERN.md +0 -267
- package/skills-library/methodology/STONE_AND_SCAFFOLD.md +0 -220
- package/skills-library/specialists/api-architecture/api-designer.md +0 -49
- package/skills-library/specialists/api-architecture/graphql-architect.md +0 -49
- package/skills-library/specialists/api-architecture/mcp-developer.md +0 -51
- package/skills-library/specialists/api-architecture/microservices-architect.md +0 -50
- package/skills-library/specialists/api-architecture/websocket-engineer.md +0 -48
- package/skills-library/specialists/backend/django-expert.md +0 -52
- package/skills-library/specialists/backend/fastapi-expert.md +0 -52
- package/skills-library/specialists/backend/laravel-specialist.md +0 -52
- package/skills-library/specialists/backend/nestjs-expert.md +0 -51
- package/skills-library/specialists/backend/rails-expert.md +0 -53
- package/skills-library/specialists/backend/spring-boot-engineer.md +0 -56
- package/skills-library/specialists/data-ml/fine-tuning-expert.md +0 -48
- package/skills-library/specialists/data-ml/ml-pipeline.md +0 -47
- package/skills-library/specialists/data-ml/pandas-pro.md +0 -47
- package/skills-library/specialists/data-ml/rag-architect.md +0 -51
- package/skills-library/specialists/data-ml/spark-engineer.md +0 -47
- package/skills-library/specialists/frontend/angular-architect.md +0 -52
- package/skills-library/specialists/frontend/flutter-expert.md +0 -51
- package/skills-library/specialists/frontend/nextjs-developer.md +0 -54
- package/skills-library/specialists/frontend/react-native-expert.md +0 -50
- package/skills-library/specialists/frontend/vue-expert.md +0 -51
- package/skills-library/specialists/infrastructure/chaos-engineer.md +0 -74
- package/skills-library/specialists/infrastructure/cloud-architect.md +0 -70
- package/skills-library/specialists/infrastructure/database-optimizer.md +0 -64
- package/skills-library/specialists/infrastructure/devops-engineer.md +0 -70
- package/skills-library/specialists/infrastructure/kubernetes-specialist.md +0 -52
- package/skills-library/specialists/infrastructure/monitoring-expert.md +0 -70
- package/skills-library/specialists/infrastructure/sre-engineer.md +0 -70
- package/skills-library/specialists/infrastructure/terraform-engineer.md +0 -51
- package/skills-library/specialists/languages/cpp-pro.md +0 -74
- package/skills-library/specialists/languages/csharp-developer.md +0 -69
- package/skills-library/specialists/languages/dotnet-core-expert.md +0 -54
- package/skills-library/specialists/languages/golang-pro.md +0 -51
- package/skills-library/specialists/languages/java-architect.md +0 -49
- package/skills-library/specialists/languages/javascript-pro.md +0 -68
- package/skills-library/specialists/languages/kotlin-specialist.md +0 -68
- package/skills-library/specialists/languages/php-pro.md +0 -49
- package/skills-library/specialists/languages/python-pro.md +0 -52
- package/skills-library/specialists/languages/react-expert.md +0 -51
- package/skills-library/specialists/languages/rust-engineer.md +0 -50
- package/skills-library/specialists/languages/sql-pro.md +0 -56
- package/skills-library/specialists/languages/swift-expert.md +0 -69
- package/skills-library/specialists/languages/typescript-pro.md +0 -51
- package/skills-library/specialists/platform/atlassian-mcp.md +0 -52
- package/skills-library/specialists/platform/embedded-systems.md +0 -53
- package/skills-library/specialists/platform/game-developer.md +0 -53
- package/skills-library/specialists/platform/salesforce-developer.md +0 -53
- package/skills-library/specialists/platform/shopify-expert.md +0 -49
- package/skills-library/specialists/platform/wordpress-pro.md +0 -49
- package/skills-library/specialists/quality/browser-use-expert.md +0 -210
- package/skills-library/specialists/quality/code-documenter.md +0 -51
- package/skills-library/specialists/quality/code-reviewer.md +0 -67
- package/skills-library/specialists/quality/debugging-wizard.md +0 -51
- package/skills-library/specialists/quality/fullstack-guardian.md +0 -51
- package/skills-library/specialists/quality/legacy-modernizer.md +0 -50
- package/skills-library/specialists/quality/playwright-expert.md +0 -65
- package/skills-library/specialists/quality/spec-miner.md +0 -56
- package/skills-library/specialists/quality/test-master.md +0 -65
- package/skills-library/specialists/security/secure-code-guardian.md +0 -55
- package/skills-library/specialists/security/security-reviewer.md +0 -53
- package/skills-library/specialists/workflow/architecture-designer.md +0 -53
- package/skills-library/specialists/workflow/cli-developer.md +0 -70
- package/skills-library/specialists/workflow/feature-forge.md +0 -65
- package/skills-library/specialists/workflow/prompt-engineer.md +0 -54
- package/skills-library/specialists/workflow/the-fool.md +0 -62
- /package/skills-library/{performance → _general/performance}/cache-augmented-generation.md +0 -0
- /package/skills-library/{debugging → parallel-debug}/FAILURE_TAXONOMY_CLASSIFICATION.md +0 -0
- /package/skills-library/{debugging → parallel-debug}/THREE_AGENT_HYPOTHESIS_DEBUGGING.md +0 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: framer-motion-layoutid-grouping
|
|
3
|
+
category: frontend
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
contributed: 2026-02-26
|
|
6
|
+
contributor: scribe-bible
|
|
7
|
+
last_updated: 2026-02-26
|
|
8
|
+
tags: [framer-motion, animation, FLIP, layout, grouping, sorting, react]
|
|
9
|
+
difficulty: medium
|
|
10
|
+
usage_count: 0
|
|
11
|
+
success_rate: 100
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Framer Motion layoutId Bubble Grouping
|
|
15
|
+
|
|
16
|
+
## Problem
|
|
17
|
+
|
|
18
|
+
You have a collection of items (cards, bubbles, tiles) that can be sorted/grouped by different criteria. When the user switches sort mode, items should smoothly animate to their new positions in the new groups — not just re-render instantly. Traditional approaches require manually calculating FLIP (First, Last, Invert, Play) coordinates. CSS Grid/Flexbox reflows don't animate.
|
|
19
|
+
|
|
20
|
+
## Solution Pattern
|
|
21
|
+
|
|
22
|
+
Use Framer Motion's `layoutId` prop on `motion.div` or `motion.button` elements. When items move between groups (different parent containers), Framer Motion automatically calculates the FLIP animation — measuring the element's position before and after the React re-render, then animating the transform.
|
|
23
|
+
|
|
24
|
+
The key: each item needs a **stable, unique `layoutId`** that persists across re-renders. When React re-renders with new grouping, Framer Motion finds the same `layoutId` in a different position and animates the transition.
|
|
25
|
+
|
|
26
|
+
## Code Example
|
|
27
|
+
|
|
28
|
+
```tsx
|
|
29
|
+
import { motion, AnimatePresence } from 'framer-motion';
|
|
30
|
+
|
|
31
|
+
interface Item {
|
|
32
|
+
id: string;
|
|
33
|
+
name: string;
|
|
34
|
+
category: string;
|
|
35
|
+
author: string;
|
|
36
|
+
size: number;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
type SortMode = 'category' | 'author' | 'size';
|
|
40
|
+
|
|
41
|
+
function GroupedBubbles({ items }: { items: Item[] }) {
|
|
42
|
+
const [sortMode, setSortMode] = useState<SortMode>('category');
|
|
43
|
+
|
|
44
|
+
// Regroup items whenever sort mode changes
|
|
45
|
+
const groups = useMemo(() => {
|
|
46
|
+
const map = new Map<string, Item[]>();
|
|
47
|
+
items.forEach(item => {
|
|
48
|
+
const key = sortMode === 'size'
|
|
49
|
+
? (item.size > 100 ? 'Large' : 'Small')
|
|
50
|
+
: item[sortMode];
|
|
51
|
+
if (!map.has(key)) map.set(key, []);
|
|
52
|
+
map.get(key)!.push(item);
|
|
53
|
+
});
|
|
54
|
+
return map;
|
|
55
|
+
}, [items, sortMode]);
|
|
56
|
+
|
|
57
|
+
return (
|
|
58
|
+
<div>
|
|
59
|
+
{/* Sort mode buttons */}
|
|
60
|
+
<div className="flex gap-2 mb-4">
|
|
61
|
+
{(['category', 'author', 'size'] as SortMode[]).map(mode => (
|
|
62
|
+
<button
|
|
63
|
+
key={mode}
|
|
64
|
+
onClick={() => setSortMode(mode)}
|
|
65
|
+
className={sortMode === mode ? 'bg-blue-500 text-white' : 'bg-gray-200'}
|
|
66
|
+
>
|
|
67
|
+
By {mode}
|
|
68
|
+
</button>
|
|
69
|
+
))}
|
|
70
|
+
</div>
|
|
71
|
+
|
|
72
|
+
{/* Grouped items */}
|
|
73
|
+
{Array.from(groups.entries()).map(([group, groupItems]) => (
|
|
74
|
+
<div key={group} className="mb-6">
|
|
75
|
+
<h3 className="text-lg font-bold">{group}</h3>
|
|
76
|
+
<div className="flex flex-wrap gap-2">
|
|
77
|
+
{groupItems.map(item => (
|
|
78
|
+
<motion.button
|
|
79
|
+
key={item.id}
|
|
80
|
+
layoutId={`item-${item.id}`} // STABLE ID — survives regrouping
|
|
81
|
+
layout="position" // Only animate position, not size
|
|
82
|
+
transition={{
|
|
83
|
+
type: 'spring',
|
|
84
|
+
stiffness: 400,
|
|
85
|
+
damping: 30,
|
|
86
|
+
}}
|
|
87
|
+
whileHover={{ scale: 1.15 }}
|
|
88
|
+
whileTap={{ scale: 0.95 }}
|
|
89
|
+
className="rounded-full bg-blue-500 text-white flex items-center justify-center"
|
|
90
|
+
style={{
|
|
91
|
+
width: `${Math.max(32, item.size * 0.4)}px`,
|
|
92
|
+
height: `${Math.max(32, item.size * 0.4)}px`,
|
|
93
|
+
}}
|
|
94
|
+
>
|
|
95
|
+
{item.name}
|
|
96
|
+
</motion.button>
|
|
97
|
+
))}
|
|
98
|
+
</div>
|
|
99
|
+
</div>
|
|
100
|
+
))}
|
|
101
|
+
</div>
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Implementation Steps
|
|
107
|
+
|
|
108
|
+
1. Install Framer Motion: `npm install framer-motion`
|
|
109
|
+
2. Wrap each item in a `motion.div` or `motion.button`
|
|
110
|
+
3. Assign a **stable `layoutId`** based on the item's unique ID (not array index)
|
|
111
|
+
4. Use `layout="position"` to animate only position (not size changes)
|
|
112
|
+
5. Configure spring physics: `stiffness: 400, damping: 30` for snappy natural motion
|
|
113
|
+
6. Memoize the grouping computation with `useMemo` to prevent unnecessary recalculations
|
|
114
|
+
7. Add `whileHover` and `whileTap` for interactive feedback
|
|
115
|
+
|
|
116
|
+
## When to Use
|
|
117
|
+
|
|
118
|
+
- Data explorers with multiple sort/group/filter modes
|
|
119
|
+
- Card grids that reorganize by category, date, status, etc.
|
|
120
|
+
- Tag clouds or bubble charts with dynamic grouping
|
|
121
|
+
- Dashboard widgets that can be rearranged
|
|
122
|
+
- Any collection where items move between visual groups
|
|
123
|
+
|
|
124
|
+
## When NOT to Use
|
|
125
|
+
|
|
126
|
+
- React Flow graphs — use CSS transitions on `.react-flow__node` instead (Framer Motion conflicts with React Flow's transform management)
|
|
127
|
+
- Lists with 500+ items — FLIP calculations on many elements cause frame drops
|
|
128
|
+
- Simple show/hide — use `AnimatePresence` with `initial`/`animate`/`exit` instead
|
|
129
|
+
- Server-side rendered content — `layoutId` animations only work client-side
|
|
130
|
+
|
|
131
|
+
## Common Mistakes
|
|
132
|
+
|
|
133
|
+
- Using array index as `layoutId` — items get wrong animations when array reorders
|
|
134
|
+
- Forgetting `layout="position"` — size changes also animate, causing distortion
|
|
135
|
+
- Setting `stiffness` too low (<200) — bubbles float sluggishly
|
|
136
|
+
- Setting `damping` too low (<15) — bubbles bounce excessively
|
|
137
|
+
- Not memoizing the grouping logic — React re-renders trigger redundant FLIP measurements
|
|
138
|
+
- Mixing `layoutId` with `AnimatePresence` incorrectly — use `layoutId` for movement, `AnimatePresence` for enter/exit
|
|
139
|
+
|
|
140
|
+
## Related Skills
|
|
141
|
+
|
|
142
|
+
- [react-flow-animated-layout-switching](react-flow-animated-layout-switching.md) — For graph node animations
|
|
143
|
+
- [svg-sparkline-no-charting-library](svg-sparkline-no-charting-library.md) — Lightweight data visualization
|
|
144
|
+
|
|
145
|
+
## References
|
|
146
|
+
|
|
147
|
+
- Framer Motion layout animations: https://www.framer.com/motion/layout-animations/
|
|
148
|
+
- FLIP technique (First, Last, Invert, Play): https://aerotwist.com/blog/flip-your-animations/
|
|
149
|
+
- Discovered in: scribe-bible PsalmsExplorer bubble graph (Phase 2)
|
|
150
|
+
- 150 psalm bubbles with 5 sort modes, spring physics, hover tooltips
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pyqt6-settings-dialog
|
|
3
|
+
category: frontend
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
contributed: 2026-02-24
|
|
6
|
+
contributor: voice-bridge-v4
|
|
7
|
+
last_updated: 2026-02-24
|
|
8
|
+
contributors:
|
|
9
|
+
- voice-bridge-v4
|
|
10
|
+
tags: [pyqt6, python, desktop-app, settings, gui, yaml, config, dark-theme]
|
|
11
|
+
difficulty: medium
|
|
12
|
+
usage_count: 0
|
|
13
|
+
success_rate: 100
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# PyQt6 Settings Dialog (Replace Raw Config Editing)
|
|
17
|
+
|
|
18
|
+
## Problem
|
|
19
|
+
|
|
20
|
+
Python desktop apps store configuration in YAML/JSON/TOML files. The typical "Settings" menu item calls `os.startfile(config_path)` which opens the raw file in Notepad. This creates multiple problems:
|
|
21
|
+
|
|
22
|
+
- Users must hand-edit YAML syntax (easy to break indentation)
|
|
23
|
+
- No discoverability — users can't see what options exist
|
|
24
|
+
- No validation — invalid values only crash at runtime
|
|
25
|
+
- No live reload — changes require full app restart
|
|
26
|
+
- No descriptions — feature names like `hallucination_filter` are cryptic
|
|
27
|
+
|
|
28
|
+
## Solution Pattern
|
|
29
|
+
|
|
30
|
+
Build a PyQt6 QDialog that:
|
|
31
|
+
|
|
32
|
+
1. **Reads config** using your existing `load_config()` function
|
|
33
|
+
2. **Renders toggles/combos** programmatically from config keys
|
|
34
|
+
3. **Saves on OK** using your existing `save_config()` function
|
|
35
|
+
4. **Emits a signal** so the main app can hot-reload affected components
|
|
36
|
+
5. **Matches app theme** using a stylesheet (dark theme shown below)
|
|
37
|
+
|
|
38
|
+
Key architecture decisions:
|
|
39
|
+
- Dialog is **modal** (blocks interaction with main window) — prevents race conditions
|
|
40
|
+
- Config paths stored as dotted strings (`"post_processing.hallucination_filter"`) for clean mapping
|
|
41
|
+
- `settings_changed` signal carries the full new config dict — caller decides what to hot-reload
|
|
42
|
+
- Fallback to raw file editor if dialog fails to import (graceful degradation)
|
|
43
|
+
|
|
44
|
+
## Code Example
|
|
45
|
+
|
|
46
|
+
```python
|
|
47
|
+
# Before (problematic) — opens raw YAML in Notepad
|
|
48
|
+
def _open_settings(self) -> None:
|
|
49
|
+
os.startfile(str(CONFIG_FILE))
|
|
50
|
+
|
|
51
|
+
# After (solution) — proper settings GUI with live reload
|
|
52
|
+
def _open_settings(self) -> None:
|
|
53
|
+
from .settings_dialog import SettingsDialog
|
|
54
|
+
dialog = SettingsDialog(parent=self.main_window)
|
|
55
|
+
dialog.settings_changed.connect(self._on_settings_changed)
|
|
56
|
+
dialog.exec()
|
|
57
|
+
|
|
58
|
+
def _on_settings_changed(self, new_config: dict) -> None:
|
|
59
|
+
# Hot-reload only the components that support it
|
|
60
|
+
self.text_processor = TextProcessor(new_config)
|
|
61
|
+
self.status_server.update(new_config)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Settings Dialog Structure
|
|
65
|
+
|
|
66
|
+
```python
|
|
67
|
+
from PyQt6.QtWidgets import QDialog, QCheckBox, QGroupBox, QComboBox, QDialogButtonBox
|
|
68
|
+
from PyQt6.QtCore import pyqtSignal
|
|
69
|
+
from .config import load_config, save_config
|
|
70
|
+
|
|
71
|
+
class SettingsDialog(QDialog):
|
|
72
|
+
settings_changed = pyqtSignal(dict) # Emitted on save
|
|
73
|
+
|
|
74
|
+
def __init__(self, parent=None):
|
|
75
|
+
super().__init__(parent)
|
|
76
|
+
self.config = load_config()
|
|
77
|
+
self._checkboxes = {} # path -> QCheckBox mapping
|
|
78
|
+
self._build_ui()
|
|
79
|
+
|
|
80
|
+
def _build_ui(self):
|
|
81
|
+
# Group features logically
|
|
82
|
+
features = [
|
|
83
|
+
("post_processing.hallucination_filter", "Hallucination Filter",
|
|
84
|
+
"Reject garbage like 'thank you for watching'"),
|
|
85
|
+
("post_processing.filler_removal", "Filler Removal",
|
|
86
|
+
"Strip um, uh, like, basically"),
|
|
87
|
+
# ... more features
|
|
88
|
+
]
|
|
89
|
+
|
|
90
|
+
for path, label, description in features:
|
|
91
|
+
cb = QCheckBox(label)
|
|
92
|
+
# Navigate nested config: "post_processing.hallucination_filter"
|
|
93
|
+
parts = path.split(".")
|
|
94
|
+
value = self.config
|
|
95
|
+
for part in parts:
|
|
96
|
+
value = value.get(part, {})
|
|
97
|
+
cb.setChecked(value.get("enabled", False))
|
|
98
|
+
self._checkboxes[path] = cb
|
|
99
|
+
|
|
100
|
+
# Save/Cancel buttons
|
|
101
|
+
buttons = QDialogButtonBox(
|
|
102
|
+
QDialogButtonBox.StandardButton.Save |
|
|
103
|
+
QDialogButtonBox.StandardButton.Cancel
|
|
104
|
+
)
|
|
105
|
+
buttons.accepted.connect(self._save)
|
|
106
|
+
buttons.rejected.connect(self.reject)
|
|
107
|
+
|
|
108
|
+
def _save(self):
|
|
109
|
+
config = load_config() # Fresh read to avoid stale state
|
|
110
|
+
for path, cb in self._checkboxes.items():
|
|
111
|
+
parts = path.split(".")
|
|
112
|
+
target = config
|
|
113
|
+
for part in parts[:-1]:
|
|
114
|
+
target = target.setdefault(part, {})
|
|
115
|
+
last_key = parts[-1]
|
|
116
|
+
if isinstance(target.get(last_key), dict):
|
|
117
|
+
target[last_key]["enabled"] = cb.isChecked()
|
|
118
|
+
else:
|
|
119
|
+
target[last_key] = cb.isChecked()
|
|
120
|
+
|
|
121
|
+
save_config(config)
|
|
122
|
+
self.settings_changed.emit(config)
|
|
123
|
+
self.accept()
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Dark Theme Stylesheet
|
|
127
|
+
|
|
128
|
+
```python
|
|
129
|
+
STYLESHEET = """
|
|
130
|
+
QDialog { background-color: #0f0f14; color: #f0f0f5; }
|
|
131
|
+
QGroupBox {
|
|
132
|
+
background-color: #1a1a24; border: 1px solid #2a2a3a;
|
|
133
|
+
border-radius: 8px; margin-top: 12px; padding: 16px;
|
|
134
|
+
}
|
|
135
|
+
QGroupBox::title { color: #6366f1; }
|
|
136
|
+
QCheckBox::indicator {
|
|
137
|
+
width: 20px; height: 20px;
|
|
138
|
+
border: 2px solid #2a2a3a; border-radius: 4px;
|
|
139
|
+
}
|
|
140
|
+
QCheckBox::indicator:checked {
|
|
141
|
+
background-color: #6366f1; border-color: #6366f1;
|
|
142
|
+
}
|
|
143
|
+
QDialogButtonBox QPushButton {
|
|
144
|
+
background-color: #6366f1; color: white;
|
|
145
|
+
border-radius: 6px; padding: 8px 24px;
|
|
146
|
+
}
|
|
147
|
+
"""
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Implementation Steps
|
|
151
|
+
|
|
152
|
+
1. Create `settings_dialog.py` alongside your main module
|
|
153
|
+
2. Define feature list as `(config_path, label, description)` tuples
|
|
154
|
+
3. Build UI with QGroupBox sections for logical grouping
|
|
155
|
+
4. Map checkboxes to dotted config paths in `self._checkboxes`
|
|
156
|
+
5. On save: navigate config dict, update values, call `save_config()`
|
|
157
|
+
6. Emit `settings_changed` signal with full config
|
|
158
|
+
7. In main app: connect signal to hot-reload handler
|
|
159
|
+
8. Add fallback to `os.startfile()` if dialog import fails
|
|
160
|
+
|
|
161
|
+
## When to Use
|
|
162
|
+
|
|
163
|
+
- Any Python desktop app with a YAML/JSON/TOML config file
|
|
164
|
+
- When "Settings" currently opens the raw config in a text editor
|
|
165
|
+
- When features are togglable and users shouldn't need to understand config syntax
|
|
166
|
+
- When you want live reload without full app restart
|
|
167
|
+
|
|
168
|
+
## When NOT to Use
|
|
169
|
+
|
|
170
|
+
- Web apps (use a proper web settings page instead)
|
|
171
|
+
- CLI-only tools (use command-line flags or interactive prompts)
|
|
172
|
+
- When config has only 1-2 simple values (overkill — just use CLI args)
|
|
173
|
+
- When config changes ALWAYS require restart (signal adds unnecessary complexity)
|
|
174
|
+
|
|
175
|
+
## Common Mistakes
|
|
176
|
+
|
|
177
|
+
- **Reading stale config in `_save()`** — Always `load_config()` fresh before applying checkbox states, because another process or the user might have edited the file
|
|
178
|
+
- **Not handling nested dicts** — Config like `{post_processing: {filter: {enabled: true}}}` needs the `isinstance(target.get(last_key), dict)` check to set `.enabled` inside the nested dict rather than replacing it
|
|
179
|
+
- **Opening dialog from wrong thread** — If called from a system tray callback (different thread), use Qt signals to marshal to the GUI thread
|
|
180
|
+
- **Not providing fallback** — Wrap dialog creation in try/except and fall back to `os.startfile()` for robustness
|
|
181
|
+
|
|
182
|
+
## Related Skills
|
|
183
|
+
|
|
184
|
+
- [config-hot-reload](../patterns-standards/config-hot-reload.md) — General pattern for live config reload
|
|
185
|
+
- [dark-theme-qt](../frontend/dark-theme-qt.md) — Dark theme patterns for PyQt6
|
|
186
|
+
|
|
187
|
+
## References
|
|
188
|
+
|
|
189
|
+
- Contributed from: voice-bridge-v4
|
|
190
|
+
- PyQt6 QDialog docs: https://doc.qt.io/qtforpython-6/PySide6/QtWidgets/QDialog.html
|
|
191
|
+
- Real implementation: `voice-bridge-v3/src/voice_bridge_v3/settings_dialog.py`
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: react-flow-animated-layout-switching
|
|
3
|
+
category: frontend
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
contributed: 2026-02-26
|
|
6
|
+
contributor: scribe-bible
|
|
7
|
+
last_updated: 2026-02-26
|
|
8
|
+
tags: [react-flow, xyflow, animation, css-transitions, layout, graph-visualization]
|
|
9
|
+
difficulty: medium
|
|
10
|
+
usage_count: 0
|
|
11
|
+
success_rate: 100
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# React Flow Animated Layout Switching
|
|
15
|
+
|
|
16
|
+
## Problem
|
|
17
|
+
|
|
18
|
+
React Flow (`@xyflow/react`) nodes snap instantly to new positions when switching between layout algorithms (e.g., dagre → force → radial). This creates a jarring user experience — nodes teleport instead of smoothly transitioning. Framer Motion cannot animate React Flow node positions because React Flow manages the `transform` CSS property internally via its own state.
|
|
19
|
+
|
|
20
|
+
## Solution Pattern
|
|
21
|
+
|
|
22
|
+
Use **scoped CSS transitions** on the `.react-flow__node` element's `transform` property. React Flow updates `transform: translate(x, y)` when node positions change — CSS transitions intercept this and animate the movement. Scope with a wrapper class to prevent affecting other React Flow instances in the same app.
|
|
23
|
+
|
|
24
|
+
The key insight: React Flow already changes the transform. You don't need a JavaScript animation library — just tell CSS to transition the property React Flow is already updating.
|
|
25
|
+
|
|
26
|
+
## Code Example
|
|
27
|
+
|
|
28
|
+
```css
|
|
29
|
+
/* Scoped to prevent affecting other React Flow instances */
|
|
30
|
+
.my-graph .react-flow__node {
|
|
31
|
+
transition: transform 600ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* Edge paths also animate when nodes move */
|
|
35
|
+
.my-graph .react-flow__edge path {
|
|
36
|
+
transition: d 600ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
```tsx
|
|
41
|
+
// Wrap ReactFlow in a div with your scope class
|
|
42
|
+
<div className="my-graph">
|
|
43
|
+
<ReactFlow
|
|
44
|
+
nodes={nodes}
|
|
45
|
+
edges={edges}
|
|
46
|
+
fitView
|
|
47
|
+
fitViewOptions={{ padding: 0.3, duration: 600 }} // Match CSS duration
|
|
48
|
+
>
|
|
49
|
+
<Controls />
|
|
50
|
+
</ReactFlow>
|
|
51
|
+
</div>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
```tsx
|
|
55
|
+
// When switching layouts, just update node positions — CSS handles animation
|
|
56
|
+
const switchLayout = (algorithm: string) => {
|
|
57
|
+
const repositioned = applyLayout(nodes, edges, { algorithm });
|
|
58
|
+
setNodes(repositioned); // React Flow updates transform → CSS transitions animate
|
|
59
|
+
};
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Implementation Steps
|
|
63
|
+
|
|
64
|
+
1. Add a wrapper `<div>` around `<ReactFlow>` with a unique class name
|
|
65
|
+
2. Add CSS transitions targeting `.wrapper-class .react-flow__node` for `transform`
|
|
66
|
+
3. Add CSS transitions targeting `.wrapper-class .react-flow__edge path` for `d` (SVG path data)
|
|
67
|
+
4. Match the `fitViewOptions.duration` to your CSS transition duration
|
|
68
|
+
5. Use `cubic-bezier(0.4, 0, 0.2, 1)` (standard ease-out) for natural deceleration
|
|
69
|
+
|
|
70
|
+
## When to Use
|
|
71
|
+
|
|
72
|
+
- Switching between layout algorithms (dagre, force, radial, custom)
|
|
73
|
+
- Expanding/collapsing groups of nodes
|
|
74
|
+
- Any scenario where React Flow node positions change programmatically
|
|
75
|
+
- When you need smooth transitions without adding Framer Motion or GSAP
|
|
76
|
+
|
|
77
|
+
## When NOT to Use
|
|
78
|
+
|
|
79
|
+
- User-initiated drag operations (CSS transitions would fight the drag)
|
|
80
|
+
- When you have multiple React Flow instances and only want one animated (use scoping)
|
|
81
|
+
- Performance-critical graphs with 500+ nodes (CSS transitions on many elements can jank)
|
|
82
|
+
- When nodes are being added/removed (use Framer Motion AnimatePresence for enter/exit)
|
|
83
|
+
|
|
84
|
+
## Common Mistakes
|
|
85
|
+
|
|
86
|
+
- Applying transitions globally (affects ALL React Flow instances in the app)
|
|
87
|
+
- Forgetting to scope with a wrapper class
|
|
88
|
+
- Using `all` instead of `transform` in the transition property (transitions zoom/pan too)
|
|
89
|
+
- Not matching fitView duration with CSS duration (viewport pans at different speed than nodes)
|
|
90
|
+
- Using `transition-duration` that's too long (>800ms feels sluggish for layout changes)
|
|
91
|
+
|
|
92
|
+
## Related Skills
|
|
93
|
+
|
|
94
|
+
- [framer-motion-layoutid-grouping](framer-motion-layoutid-grouping.md) — For non-graph animations
|
|
95
|
+
- [domain-specific-layout-algorithms](../_general/patterns-standards/domain-specific-layout-algorithms.md) — Custom layouts to switch between
|
|
96
|
+
|
|
97
|
+
## References
|
|
98
|
+
|
|
99
|
+
- React Flow docs: https://reactflow.dev
|
|
100
|
+
- Discovered in: scribe-bible parallelism visualization (Phase 1)
|
|
101
|
+
- The `d` attribute transition on SVG paths enables edge morphing during layout switches
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: react-hooks-order-debugging
|
|
3
|
+
category: frontend
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
contributed: 2026-03-12
|
|
6
|
+
contributor: claude-mission-control
|
|
7
|
+
last_updated: 2026-03-12
|
|
8
|
+
contributors:
|
|
9
|
+
- claude-mission-control
|
|
10
|
+
tags: [react, hooks, debugging, HMR, vite, black-screen]
|
|
11
|
+
difficulty: hard
|
|
12
|
+
usage_count: 0
|
|
13
|
+
success_rate: 100
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# React Hooks Order Debugging — Diagnosing & Fixing Hooks Crashes
|
|
17
|
+
|
|
18
|
+
## Problem
|
|
19
|
+
|
|
20
|
+
React requires hooks to be called in the exact same order on every render. Violations cause the error: `"Rendered more hooks than during the previous render"` or `"Rendered fewer hooks..."`. This often manifests as a complete **black screen** with no visible UI, especially when:
|
|
21
|
+
|
|
22
|
+
1. A new hook is added at an existing position (e.g., `useMemo` inserted between existing hooks)
|
|
23
|
+
2. A hook type changes at an existing position (e.g., replacing `useState` with a Zustand `useStore`)
|
|
24
|
+
3. Vite HMR module cache serves stale code after hook changes
|
|
25
|
+
|
|
26
|
+
**Symptoms:**
|
|
27
|
+
- App loads briefly, then goes completely black
|
|
28
|
+
- Console shows "change in the order of Hooks called by [Component]"
|
|
29
|
+
- Error stack trace lists hook positions: "Previous render: useState (3), Current render: useSyncExternalStore (3)"
|
|
30
|
+
- Hard refresh (Ctrl+Shift+R) doesn't fix it
|
|
31
|
+
- Only a full Vite cache clear + server restart fixes it
|
|
32
|
+
|
|
33
|
+
## Solution Pattern
|
|
34
|
+
|
|
35
|
+
**Diagnosis:** The error message tells you exactly which hook position changed. Map the position numbers to your component's hook calls (count them top-to-bottom: 1st `useState`, 2nd `useState`, 3rd `useEffect`, etc.).
|
|
36
|
+
|
|
37
|
+
**Three root causes and their fixes:**
|
|
38
|
+
|
|
39
|
+
### Cause 1: New hook inserted mid-component
|
|
40
|
+
Adding `useMemo`, `useCallback`, or any hook between existing hooks shifts all subsequent hook positions.
|
|
41
|
+
|
|
42
|
+
**Fix:** Add new hooks at the END of the hook section, or restructure to avoid the hook entirely.
|
|
43
|
+
|
|
44
|
+
### Cause 2: Hook type changed at same position
|
|
45
|
+
Replacing `useState` with `useStore()` (Zustand's `useSyncExternalStore`) changes the hook type at that position. React treats different hook types at the same position as a violation.
|
|
46
|
+
|
|
47
|
+
**Fix:** Keep the original hooks, sync external store data into them via `useEffect`, or wrap the store in a child component.
|
|
48
|
+
|
|
49
|
+
### Cause 3: Vite HMR cache serving stale modules
|
|
50
|
+
After fixing hook issues, Vite's module cache (`.vite/` directory + browser cache) may still serve the old broken version.
|
|
51
|
+
|
|
52
|
+
**Fix:** Full cache clear: `rm -rf node_modules/.vite && kill vite && restart`
|
|
53
|
+
|
|
54
|
+
## Code Example
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
// BROKEN: useMemo inserted at position 43 (shifts all hooks after it)
|
|
58
|
+
function App() {
|
|
59
|
+
const [a, setA] = useState(false) // position 1
|
|
60
|
+
const [b, setB] = useState('home') // position 2
|
|
61
|
+
// ... 40 more hooks from useEffect, useState, etc.
|
|
62
|
+
const memoized = useMemo(() => {...}, []) // position 43 — NEW!
|
|
63
|
+
// All hooks after position 43 are now shifted by 1
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// BROKEN: useState replaced with useStore (different hook type)
|
|
67
|
+
function App() {
|
|
68
|
+
// Was: const [sidebar, setSidebar] = useState(false) // useState
|
|
69
|
+
const { sidebar } = useAppStore() // useSyncExternalStore — DIFFERENT TYPE
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// FIXED: Keep original hooks, don't insert or change types
|
|
73
|
+
function App() {
|
|
74
|
+
const [a, setA] = useState(false) // position 1 — unchanged
|
|
75
|
+
const [b, setB] = useState('home') // position 2 — unchanged
|
|
76
|
+
// ... all original hooks in original order
|
|
77
|
+
// Add new hooks ONLY at the end, or extract into child components
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Implementation Steps
|
|
82
|
+
|
|
83
|
+
1. Read the error: note the hook position number and the type mismatch
|
|
84
|
+
2. Count hooks in the component top-to-bottom to find which hook changed
|
|
85
|
+
3. Identify root cause: insertion, type change, or conditional
|
|
86
|
+
4. Fix: revert the change, move new hooks to end, or extract into child component
|
|
87
|
+
5. Clear Vite cache: `rm -rf node_modules/.vite`
|
|
88
|
+
6. Kill Vite dev server and restart fresh
|
|
89
|
+
7. Hard refresh browser (Ctrl+Shift+R)
|
|
90
|
+
|
|
91
|
+
## When to Use
|
|
92
|
+
|
|
93
|
+
- Black screen after code changes in a React component
|
|
94
|
+
- "Rendered more/fewer hooks" error in console
|
|
95
|
+
- Migrating from local state to external stores (Zustand, Jotai, Redux)
|
|
96
|
+
- Adding memoization (`useMemo`/`useCallback`) to large components
|
|
97
|
+
- Any HMR-related mysterious crashes
|
|
98
|
+
|
|
99
|
+
## When NOT to Use
|
|
100
|
+
|
|
101
|
+
- Build errors (not a hooks issue)
|
|
102
|
+
- Runtime errors with stack traces pointing to business logic
|
|
103
|
+
- SSR hydration mismatches (different root cause)
|
|
104
|
+
|
|
105
|
+
## Common Mistakes
|
|
106
|
+
|
|
107
|
+
- Thinking `Ctrl+Shift+R` is enough — Vite's `.vite/` directory cache persists across browser refreshes
|
|
108
|
+
- Amending the fix by adding `useMemo` "at the end" but inside a conditional — hooks can't be inside conditionals
|
|
109
|
+
- Replacing `useState` with `useRef` and thinking it's safe — `useRef` IS a hook, changing from `useState` to `useRef` at the same position also violates order rules
|
|
110
|
+
- Not killing the Vite dev server — HMR may continue serving cached modules even after file changes
|
|
111
|
+
|
|
112
|
+
## Recovery Checklist
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
# 1. Revert the problematic hook changes
|
|
116
|
+
git diff src/App.tsx # Identify what changed
|
|
117
|
+
|
|
118
|
+
# 2. Clear ALL caches
|
|
119
|
+
rm -rf node_modules/.vite
|
|
120
|
+
|
|
121
|
+
# 3. Kill Vite completely
|
|
122
|
+
taskkill //F //IM node.exe # Windows
|
|
123
|
+
# kill $(lsof -ti:5173) # Mac/Linux
|
|
124
|
+
|
|
125
|
+
# 4. Restart fresh
|
|
126
|
+
npm run dev
|
|
127
|
+
|
|
128
|
+
# 5. Hard refresh browser
|
|
129
|
+
# Ctrl+Shift+R
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## Related Skills
|
|
133
|
+
|
|
134
|
+
- liveclock-extraction - Extract state to avoid hooks in large components
|
|
135
|
+
- use-visible-interval - Custom hook that's safe to add (leaf components only)
|
|
136
|
+
|
|
137
|
+
## References
|
|
138
|
+
|
|
139
|
+
- React docs: "Rules of Hooks" — hooks must be called in the same order every render
|
|
140
|
+
- Vite docs: "Dependency Pre-Bundling" — `.vite/` cache behavior
|
|
141
|
+
- Contributed from: claude-mission-control App.tsx (black screen crash from hooks order violation)
|