@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,126 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: redux-localstorage-auth-desync
|
|
3
|
+
category: frontend
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
contributed: 2026-03-06
|
|
6
|
+
contributor: ministry-lms
|
|
7
|
+
last_updated: 2026-03-06
|
|
8
|
+
tags: [redux, react, auth, localStorage, infinite-loop, redirect, login]
|
|
9
|
+
difficulty: medium
|
|
10
|
+
usage_count: 0
|
|
11
|
+
success_rate: 100
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Redux + localStorage Auth State Desync (Infinite Login Loop)
|
|
15
|
+
|
|
16
|
+
## Problem
|
|
17
|
+
|
|
18
|
+
After a token expires or `getMe()` API call fails, the app enters an infinite redirect loop between `/login` and `/dashboard`:
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
Login → checks localStorage → has token → navigate(/dashboard)
|
|
22
|
+
→ PrivateRoute → checks Redux isAuthenticated → false → navigate(/login)
|
|
23
|
+
→ Login → checks localStorage → has token → navigate(/dashboard)
|
|
24
|
+
→ ... "Maximum update depth exceeded"
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
The browser console shows: `Warning: Maximum update depth exceeded` and the page flickers rapidly between routes.
|
|
28
|
+
|
|
29
|
+
## Root Cause
|
|
30
|
+
|
|
31
|
+
**Two auth sources are out of sync:**
|
|
32
|
+
|
|
33
|
+
1. **Redux store** — `isAuthenticated: false` (correctly cleared by `getMe.rejected`)
|
|
34
|
+
2. **localStorage** — still has `token` and `user` (NOT cleared by Redux reducer)
|
|
35
|
+
|
|
36
|
+
The Login page checks `localStorage.getItem('token')` on mount and auto-redirects to dashboard if a token exists. But `PrivateRoute` checks Redux `isAuthenticated` and bounces back to login. Neither clears localStorage, so the loop never breaks.
|
|
37
|
+
|
|
38
|
+
## Solution Pattern
|
|
39
|
+
|
|
40
|
+
**Clear localStorage in the same reducer that clears Redux state.** When the auth verification fails, BOTH state stores must be cleaned:
|
|
41
|
+
|
|
42
|
+
```javascript
|
|
43
|
+
// authSlice.js — getMe.rejected reducer
|
|
44
|
+
builder.addCase(getMe.rejected, (state) => {
|
|
45
|
+
state.loading = false;
|
|
46
|
+
state.isAuthenticated = false;
|
|
47
|
+
state.user = null;
|
|
48
|
+
state.token = null;
|
|
49
|
+
// CRITICAL: Clear localStorage to prevent Login→PrivateRoute redirect loop
|
|
50
|
+
localStorage.removeItem('token');
|
|
51
|
+
localStorage.removeItem('user');
|
|
52
|
+
});
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Code Example
|
|
56
|
+
|
|
57
|
+
```javascript
|
|
58
|
+
// Before (broken) — Redux clears, localStorage doesn't
|
|
59
|
+
builder.addCase(getMe.rejected, (state) => {
|
|
60
|
+
state.loading = false;
|
|
61
|
+
state.isAuthenticated = false;
|
|
62
|
+
state.user = null;
|
|
63
|
+
state.token = null;
|
|
64
|
+
// localStorage still has token → Login sees it → redirects to dashboard → loop
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// After (fixed) — Both stores cleared atomically
|
|
68
|
+
builder.addCase(getMe.rejected, (state) => {
|
|
69
|
+
state.loading = false;
|
|
70
|
+
state.isAuthenticated = false;
|
|
71
|
+
state.user = null;
|
|
72
|
+
state.token = null;
|
|
73
|
+
localStorage.removeItem('token');
|
|
74
|
+
localStorage.removeItem('user');
|
|
75
|
+
});
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Implementation Steps
|
|
79
|
+
|
|
80
|
+
1. Identify all places where Redux auth state is cleared (rejected thunks, logout)
|
|
81
|
+
2. Add `localStorage.removeItem()` calls in each one
|
|
82
|
+
3. Verify Login page checks are consistent (Redux OR localStorage, not both independently)
|
|
83
|
+
4. Test by manually expiring the token and refreshing the page
|
|
84
|
+
|
|
85
|
+
## When to Use
|
|
86
|
+
|
|
87
|
+
- Login page flickers or shows "Maximum update depth exceeded"
|
|
88
|
+
- Users can't log in after token expiration (stuck in redirect loop)
|
|
89
|
+
- App uses BOTH Redux and localStorage for auth state
|
|
90
|
+
- `getMe()` or token verification endpoint returns 401 but user sees login flash
|
|
91
|
+
|
|
92
|
+
## When NOT to Use
|
|
93
|
+
|
|
94
|
+
- App uses only Redux for auth (no localStorage persistence)
|
|
95
|
+
- App uses only localStorage (no Redux)
|
|
96
|
+
- Auth is handled by httpOnly cookies (no client-side token storage)
|
|
97
|
+
- The infinite loop is caused by something other than auth state desync
|
|
98
|
+
|
|
99
|
+
## Common Mistakes
|
|
100
|
+
|
|
101
|
+
- Clearing only Redux state, not localStorage
|
|
102
|
+
- Clearing only on logout, not on token verification failure
|
|
103
|
+
- Having Login check localStorage while PrivateRoute checks Redux (inconsistent sources)
|
|
104
|
+
- Not clearing on ALL rejection paths (login.rejected, getMe.rejected, etc.)
|
|
105
|
+
|
|
106
|
+
## Architectural Lesson
|
|
107
|
+
|
|
108
|
+
**Single source of truth for auth.** If you persist auth in localStorage AND Redux, they MUST be updated atomically. The safest pattern:
|
|
109
|
+
|
|
110
|
+
1. Redux is the source of truth for the running app
|
|
111
|
+
2. localStorage is ONLY for persistence across page reloads
|
|
112
|
+
3. On app start: read localStorage → hydrate Redux → then ONLY use Redux
|
|
113
|
+
4. On any auth state change: update Redux FIRST, then sync to localStorage
|
|
114
|
+
5. On any auth failure: clear BOTH simultaneously
|
|
115
|
+
|
|
116
|
+
## Related Skills
|
|
117
|
+
|
|
118
|
+
- [auth-jwt-basics](../../common-tasks/auth-jwt-basics.md) - JWT auth patterns
|
|
119
|
+
- [postgresql-to-mysql-runtime-translation](../../database-solutions/postgresql-to-mysql-runtime-translation.md) - The migration that surfaced this bug
|
|
120
|
+
|
|
121
|
+
## References
|
|
122
|
+
|
|
123
|
+
- React Router v6 redirect behavior: navigation inside useEffect creates render loops
|
|
124
|
+
- Redux Toolkit createAsyncThunk: rejected case must handle side effects
|
|
125
|
+
- Discovered during: MINISTRY-LMS PG→MySQL migration (getMe API failing due to DB errors triggered the loop)
|
|
126
|
+
- File: `client/src/store/slices/authSlice.js` line 304-312
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: safari-csp-theme-color-debugging
|
|
3
|
+
category: frontend
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
contributed: 2026-02-26
|
|
6
|
+
contributor: my-other-project
|
|
7
|
+
last_updated: 2026-02-26
|
|
8
|
+
tags: [safari, csp, theme-color, ios, mobile, debugging, helmet]
|
|
9
|
+
difficulty: medium
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Safari CSP & Theme-Color Debugging
|
|
13
|
+
|
|
14
|
+
## Problem
|
|
15
|
+
|
|
16
|
+
Safari on iOS renders differently from Chrome on iOS due to:
|
|
17
|
+
1. **Dual CSP headers** — Apache .htaccess and Node.js Helmet can get out of sync
|
|
18
|
+
2. **theme-color meta tag** — Safari paints the status bar and browser chrome with this color, creating visible colored bars above/below the page content
|
|
19
|
+
3. **CSP enforcement differences** — Safari can be stricter about CSP violations than Chrome
|
|
20
|
+
|
|
21
|
+
**Symptoms:**
|
|
22
|
+
- Purple/colored bars at top and bottom of the page in Safari
|
|
23
|
+
- Content blocked in Safari but not Chrome (CSP mismatch)
|
|
24
|
+
- `@headlessui/react` Transition leaving elements at `opacity-0` (Safari animation bug)
|
|
25
|
+
- Site showing fallback content instead of dynamic CMS content
|
|
26
|
+
|
|
27
|
+
## Solution Pattern
|
|
28
|
+
|
|
29
|
+
### 1. Keep CSP in Sync (Apache + Helmet)
|
|
30
|
+
|
|
31
|
+
When using both Apache .htaccess CSP AND Node.js Helmet CSP, they MUST match. Check which CSP applies to which responses:
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
HTML pages (SPA routes): Apache .htaccess CSP
|
|
35
|
+
API responses (proxied): Helmet CSP (Node.js)
|
|
36
|
+
Static files (JS/CSS/imgs): Apache .htaccess CSP
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Verify with curl:
|
|
40
|
+
```bash
|
|
41
|
+
# Check HTML page CSP
|
|
42
|
+
curl -s -I https://yoursite.com/ | grep -i content-security
|
|
43
|
+
|
|
44
|
+
# Check API response CSP
|
|
45
|
+
curl -s -I https://yoursite.com/api/health | grep -i content-security
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### 2. Fix theme-color for Dark Themes
|
|
49
|
+
|
|
50
|
+
The `<meta name="theme-color">` controls Safari's status bar and browser chrome color. It must match your active theme:
|
|
51
|
+
|
|
52
|
+
```html
|
|
53
|
+
<!-- Before: Purple for old theme -->
|
|
54
|
+
<meta name="theme-color" content="#7C3AED" />
|
|
55
|
+
|
|
56
|
+
<!-- After: Dark for Aurora Borealis theme -->
|
|
57
|
+
<meta name="theme-color" content="#030712" />
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
For dynamic themes, update via React Helmet:
|
|
61
|
+
```jsx
|
|
62
|
+
<Helmet>
|
|
63
|
+
<meta name="theme-color" content={theme.backgroundColor} />
|
|
64
|
+
</Helmet>
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 3. Safari Animation Fix
|
|
68
|
+
|
|
69
|
+
`@headlessui/react` `<Transition appear={true}>` can fail silently on Safari, leaving elements stuck at `opacity-0`. Replace with CSS keyframe animations:
|
|
70
|
+
|
|
71
|
+
```css
|
|
72
|
+
/* In overrides.css */
|
|
73
|
+
@keyframes heroFadeUp {
|
|
74
|
+
from { opacity: 0; transform: translateY(2rem); }
|
|
75
|
+
to { opacity: 1; transform: translateY(0); }
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
```jsx
|
|
80
|
+
{/* Before: Transition that fails on Safari */}
|
|
81
|
+
<Transition appear={true} show={true} enter="..." enterFrom="opacity-0" enterTo="opacity-100">
|
|
82
|
+
<h1>Content</h1>
|
|
83
|
+
</Transition>
|
|
84
|
+
|
|
85
|
+
{/* After: CSS animation that works everywhere */}
|
|
86
|
+
<h1 style={{ animation: 'heroFadeUp 1s ease-out both' }}>Content</h1>
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Debugging Workflow
|
|
90
|
+
|
|
91
|
+
1. **Verify API is alive:** `curl -s https://yoursite.com/api/health`
|
|
92
|
+
2. **Compare CSP headers:** Check both Apache and Helmet CSPs match
|
|
93
|
+
3. **Test CORS preflight:** `curl -v -X OPTIONS -H "Origin: https://yoursite.com" https://yoursite.com/api/endpoint`
|
|
94
|
+
4. **Check theme-color:** View source or `curl -s https://yoursite.com/ | grep theme-color`
|
|
95
|
+
5. **Test Safari Private Mode:** If Private Mode fails but regular doesn't, check SW. If both fail, check CSP/CORS.
|
|
96
|
+
6. **Check for content blockers:** Safari supports iOS content blockers that Chrome doesn't
|
|
97
|
+
|
|
98
|
+
## When to Use
|
|
99
|
+
|
|
100
|
+
- Site looks different in Safari vs Chrome on iOS
|
|
101
|
+
- Colored bars appearing in Safari browser chrome
|
|
102
|
+
- Content blocked or missing in Safari
|
|
103
|
+
- Animations not playing in Safari
|
|
104
|
+
- Dual Apache + Node.js server setup
|
|
105
|
+
|
|
106
|
+
## When NOT to Use
|
|
107
|
+
|
|
108
|
+
- Issue reproduces identically in both browsers
|
|
109
|
+
- Desktop-only rendering issues
|
|
110
|
+
- Server-side errors (check logs first)
|
|
111
|
+
|
|
112
|
+
## Common Mistakes
|
|
113
|
+
|
|
114
|
+
- Updating .htaccess CSP but forgetting Helmet CSP (or vice versa)
|
|
115
|
+
- Setting theme-color to old brand color after theme change
|
|
116
|
+
- Using `@headlessui/react` Transition for critical above-fold content
|
|
117
|
+
- Not testing in Safari Private Mode (different behavior than regular)
|
|
118
|
+
- Assuming Chrome on iOS = Safari on iOS (they share WebKit but have different extensions, storage, and privacy features)
|
|
119
|
+
|
|
120
|
+
## References
|
|
121
|
+
|
|
122
|
+
- MDN: theme-color — https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta/name/theme-color
|
|
123
|
+
- MDN: CSP — https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
|
|
124
|
+
- Contributed from: my-other-project Safari debugging session (Feb 26, 2026)
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: safari-sw-cache-poisoning
|
|
3
|
+
category: frontend
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
contributed: 2026-02-26
|
|
6
|
+
contributor: my-other-project
|
|
7
|
+
last_updated: 2026-02-26
|
|
8
|
+
tags: [safari, service-worker, pwa, caching, ios, debugging]
|
|
9
|
+
difficulty: hard
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Safari Service Worker Cache Poisoning
|
|
13
|
+
|
|
14
|
+
## Problem
|
|
15
|
+
|
|
16
|
+
Safari caches service worker files according to HTTP caching headers (e.g., `ExpiresByType application/javascript "access plus 1 year"`). When a stale SW is cached for months/years, it continues intercepting ALL requests (API calls, navigation, static assets) even after the server-side SW file is updated.
|
|
17
|
+
|
|
18
|
+
**Symptoms:**
|
|
19
|
+
- "Network Error" on ALL API calls in Safari (axios reports no response)
|
|
20
|
+
- Site loads HTML/CSS but can't communicate with server
|
|
21
|
+
- Chrome works fine (separate SW registration)
|
|
22
|
+
- Login, CMS data loading, and all authenticated features broken
|
|
23
|
+
- Safari DevTools shows SW intercepting requests
|
|
24
|
+
|
|
25
|
+
**Root Cause Chain:**
|
|
26
|
+
1. Apache `ExpiresByType application/javascript` applies to `sw.js` too
|
|
27
|
+
2. Safari respects the 1-year cache and never checks for SW updates
|
|
28
|
+
3. Old SW's `fetch` handler intercepts API calls and either fails or returns stale data
|
|
29
|
+
4. No amount of server-side fixes help because the browser never fetches the updated SW
|
|
30
|
+
|
|
31
|
+
## Solution Pattern
|
|
32
|
+
|
|
33
|
+
### 1. Prevent Future Cache Poisoning (.htaccess)
|
|
34
|
+
|
|
35
|
+
Add a specific no-cache rule for `sw.js` BEFORE the general JS caching rule:
|
|
36
|
+
|
|
37
|
+
```apache
|
|
38
|
+
# Prevent caching of service worker (must always fetch fresh)
|
|
39
|
+
<FilesMatch "sw\.js$">
|
|
40
|
+
Header set Cache-Control "no-cache, no-store, must-revalidate"
|
|
41
|
+
Header set Pragma "no-cache"
|
|
42
|
+
Header set Expires 0
|
|
43
|
+
</FilesMatch>
|
|
44
|
+
|
|
45
|
+
# General JS caching (sw.js excluded by rule above)
|
|
46
|
+
<IfModule mod_expires.c>
|
|
47
|
+
ExpiresByType application/javascript "access plus 1 year"
|
|
48
|
+
</IfModule>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### 2. Nuclear SW Purge (main entry point)
|
|
52
|
+
|
|
53
|
+
Add to your app's entry point (e.g., `main.jsx`). This runs on every page load, unregisters ALL stale SWs, purges ALL caches, then registers fresh:
|
|
54
|
+
|
|
55
|
+
```javascript
|
|
56
|
+
// Nuclear SW cleanup — force-purge stale SWs + caches, then register fresh.
|
|
57
|
+
// Safari cached old sw.js for 1 year, causing stale SW to intercept API calls.
|
|
58
|
+
if ('serviceWorker' in navigator) {
|
|
59
|
+
window.addEventListener('load', async () => {
|
|
60
|
+
try {
|
|
61
|
+
// Step 1: Unregister ALL existing service workers
|
|
62
|
+
const regs = await navigator.serviceWorker.getRegistrations();
|
|
63
|
+
await Promise.all(regs.map(reg => reg.unregister()));
|
|
64
|
+
|
|
65
|
+
// Step 2: Purge all SW caches
|
|
66
|
+
const cacheNames = await caches.keys();
|
|
67
|
+
await Promise.all(cacheNames.map(name => caches.delete(name)));
|
|
68
|
+
|
|
69
|
+
// Step 3: Register fresh SW (production only)
|
|
70
|
+
if (import.meta.env.PROD) {
|
|
71
|
+
navigator.serviceWorker.register('/sw.js', {
|
|
72
|
+
updateViaCache: 'none' // Bypass HTTP cache for SW fetch
|
|
73
|
+
}).catch(() => {});
|
|
74
|
+
}
|
|
75
|
+
} catch (e) {
|
|
76
|
+
// SW API failures are non-fatal — site works fine without SW
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### 3. Use `updateViaCache: 'none'`
|
|
83
|
+
|
|
84
|
+
Always register SWs with `updateViaCache: 'none'` to tell the browser to bypass HTTP cache when checking for SW updates:
|
|
85
|
+
|
|
86
|
+
```javascript
|
|
87
|
+
navigator.serviceWorker.register('/sw.js', { updateViaCache: 'none' });
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Key Insight: Safari Private Mode
|
|
91
|
+
|
|
92
|
+
Safari Private Browsing **completely disables service workers**. If the site works in regular Safari but breaks in Private Mode (or vice versa), the SW is likely NOT the issue. Check:
|
|
93
|
+
- CSP headers
|
|
94
|
+
- `theme-color` meta tag
|
|
95
|
+
- Content blockers / ad blockers (Safari-only on iOS)
|
|
96
|
+
- Cookie handling differences
|
|
97
|
+
|
|
98
|
+
## When to Use
|
|
99
|
+
|
|
100
|
+
- Site works in Chrome but breaks in Safari with "Network Error"
|
|
101
|
+
- API calls fail but HTML/CSS loads fine
|
|
102
|
+
- SW was registered before proper cache headers were set
|
|
103
|
+
- Deploying to shared hosting where Apache serves SW files
|
|
104
|
+
- Any PWA where `ExpiresByType` or `Cache-Control` applies to JS broadly
|
|
105
|
+
|
|
106
|
+
## When NOT to Use
|
|
107
|
+
|
|
108
|
+
- If the issue reproduces in Chrome too (not SW-specific)
|
|
109
|
+
- If Safari Private Mode also fails (SWs are disabled there — look elsewhere)
|
|
110
|
+
- If the server itself is down (check `/api/health` first)
|
|
111
|
+
- For sites that don't use service workers
|
|
112
|
+
|
|
113
|
+
## Debugging Checklist
|
|
114
|
+
|
|
115
|
+
1. `curl -s https://yoursite.com/api/health` — Server alive?
|
|
116
|
+
2. `curl -s -I https://yoursite.com/sw.js` — Check Cache-Control headers
|
|
117
|
+
3. `curl -v -X OPTIONS -H "Origin: https://yoursite.com" https://yoursite.com/api/endpoint` — CORS preflight works?
|
|
118
|
+
4. Check if Safari has website data stored (Settings > Safari > Advanced > Website Data)
|
|
119
|
+
5. Test in Safari Private Mode — if it works there, SW is the culprit
|
|
120
|
+
|
|
121
|
+
## Common Mistakes
|
|
122
|
+
|
|
123
|
+
- Assuming `sw.js` is exempt from `ExpiresByType` rules (it's not)
|
|
124
|
+
- Using `Header set` instead of `Header always set` in .htaccess
|
|
125
|
+
- Forgetting that unregistering a SW doesn't stop it controlling the CURRENT page (only takes effect on next navigation)
|
|
126
|
+
- Not wrapping SW API calls in try-catch (throws SecurityError in Private Mode)
|
|
127
|
+
- Using `caches` API without checking it exists (throws in some contexts)
|
|
128
|
+
|
|
129
|
+
## Related Skills
|
|
130
|
+
|
|
131
|
+
- CSP header synchronization (keep .htaccess and Helmet in sync)
|
|
132
|
+
- Safari theme-color meta tag (affects browser chrome appearance)
|
|
133
|
+
|
|
134
|
+
## References
|
|
135
|
+
|
|
136
|
+
- MDN: Service Worker Lifecycle — https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers
|
|
137
|
+
- MDN: updateViaCache — https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration/updateViaCache
|
|
138
|
+
- Contributed from: my-other-project Safari debugging session (Feb 26, 2026)
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: svg-sparkline-no-charting-library
|
|
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: [svg, sparkline, chart, visualization, react, lightweight, no-dependencies]
|
|
9
|
+
difficulty: easy
|
|
10
|
+
usage_count: 0
|
|
11
|
+
success_rate: 100
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# SVG Sparkline Without Charting Library
|
|
15
|
+
|
|
16
|
+
## Problem
|
|
17
|
+
|
|
18
|
+
You need a compact frequency/distribution chart (sparkline) in a React app but don't want to add D3.js (~230KB), Chart.js (~180KB), or Recharts (~140KB) as dependencies. The chart is simple — thin bars showing values across categories — but charting libraries bring configuration overhead and bundle bloat for what's essentially a few SVG rectangles.
|
|
19
|
+
|
|
20
|
+
## Solution Pattern
|
|
21
|
+
|
|
22
|
+
Build the sparkline as a **pure SVG component** using React. Use `viewBox` with percentage-based bar widths for automatic responsiveness. Each bar is a `<rect>` element with height proportional to its value. Add interactivity with React state for hover/click.
|
|
23
|
+
|
|
24
|
+
The pattern: `viewBox="0 0 100 {height}"` creates a percentage coordinate system where bar widths are `100 / count` — the SVG scales to any container width automatically via `preserveAspectRatio="none"`.
|
|
25
|
+
|
|
26
|
+
## Code Example
|
|
27
|
+
|
|
28
|
+
```tsx
|
|
29
|
+
interface SparklineProps {
|
|
30
|
+
data: { label: string; value: number; color: string }[];
|
|
31
|
+
height?: number;
|
|
32
|
+
onBarClick?: (label: string) => void;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function Sparkline({ data, height = 60, onBarClick }: SparklineProps) {
|
|
36
|
+
const [hovered, setHovered] = useState<number | null>(null);
|
|
37
|
+
const max = Math.max(...data.map(d => d.value), 1);
|
|
38
|
+
const barWidth = 100 / data.length;
|
|
39
|
+
const gap = 0.15; // percentage gap between bars
|
|
40
|
+
|
|
41
|
+
return (
|
|
42
|
+
<div className="relative">
|
|
43
|
+
<svg
|
|
44
|
+
viewBox={`0 0 100 ${height}`}
|
|
45
|
+
preserveAspectRatio="none"
|
|
46
|
+
className="w-full cursor-pointer"
|
|
47
|
+
style={{ height: `${height}px` }}
|
|
48
|
+
>
|
|
49
|
+
{data.map((d, i) => {
|
|
50
|
+
const barH = d.value > 0
|
|
51
|
+
? Math.max((d.value / max) * (height - 4), 2) // min 2px visible
|
|
52
|
+
: 0;
|
|
53
|
+
return (
|
|
54
|
+
<rect
|
|
55
|
+
key={i}
|
|
56
|
+
x={i * barWidth + gap / 2}
|
|
57
|
+
y={height - barH}
|
|
58
|
+
width={barWidth - gap}
|
|
59
|
+
height={barH}
|
|
60
|
+
fill={d.color}
|
|
61
|
+
opacity={hovered !== null ? (hovered === i ? 1 : 0.3) : 0.75}
|
|
62
|
+
rx={0.3}
|
|
63
|
+
className="transition-opacity duration-150"
|
|
64
|
+
onMouseEnter={() => setHovered(i)}
|
|
65
|
+
onMouseLeave={() => setHovered(null)}
|
|
66
|
+
onClick={() => d.value > 0 && onBarClick?.(d.label)}
|
|
67
|
+
/>
|
|
68
|
+
);
|
|
69
|
+
})}
|
|
70
|
+
</svg>
|
|
71
|
+
|
|
72
|
+
{/* Hover tooltip */}
|
|
73
|
+
{hovered !== null && (
|
|
74
|
+
<div
|
|
75
|
+
className="absolute -top-10 bg-gray-900 text-white text-xs rounded px-2 py-1 pointer-events-none"
|
|
76
|
+
style={{
|
|
77
|
+
left: `${(hovered / data.length) * 100}%`,
|
|
78
|
+
transform: 'translateX(-50%)',
|
|
79
|
+
}}
|
|
80
|
+
>
|
|
81
|
+
{data[hovered].label}: {data[hovered].value}
|
|
82
|
+
</div>
|
|
83
|
+
)}
|
|
84
|
+
</div>
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Implementation Steps
|
|
90
|
+
|
|
91
|
+
1. Define `viewBox="0 0 100 {height}"` — 100-unit wide coordinate system
|
|
92
|
+
2. Calculate `barWidth = 100 / data.length` for even distribution
|
|
93
|
+
3. Normalize bar heights: `(value / maxValue) * (height - padding)`
|
|
94
|
+
4. Set minimum visible height (e.g., `Math.max(barH, 2)`) so small values aren't invisible
|
|
95
|
+
5. Use `preserveAspectRatio="none"` so SVG stretches to container width
|
|
96
|
+
6. Add hover state with opacity dimming on non-hovered bars
|
|
97
|
+
7. Position tooltip using percentage left offset
|
|
98
|
+
|
|
99
|
+
## When to Use
|
|
100
|
+
|
|
101
|
+
- Compact distribution charts (frequency across categories, activity over time)
|
|
102
|
+
- Inline sparklines in tables, cards, or dashboards
|
|
103
|
+
- When bundle size matters (0KB added vs 140-230KB for a charting library)
|
|
104
|
+
- When you need full control over styling (Tailwind classes work directly)
|
|
105
|
+
- Simple bar/column charts with <200 data points
|
|
106
|
+
|
|
107
|
+
## When NOT to Use
|
|
108
|
+
|
|
109
|
+
- Complex charts (line, area, scatter, pie) — use a library
|
|
110
|
+
- Charts with axes, legends, gridlines, zoom, pan — use Recharts/D3
|
|
111
|
+
- Real-time streaming data with >60fps updates — use Canvas/WebGL
|
|
112
|
+
- Charts that need accessibility features (ARIA roles, keyboard navigation)
|
|
113
|
+
|
|
114
|
+
## Common Mistakes
|
|
115
|
+
|
|
116
|
+
- Using `preserveAspectRatio="xMidYMid meet"` (default) — bars don't stretch to fill width
|
|
117
|
+
- Forgetting minimum bar height — values of 1 when max is 10000 become invisible
|
|
118
|
+
- Not handling zero values — `height={0}` rect still renders a hairline in some browsers
|
|
119
|
+
- Using pixel-based widths instead of viewBox percentages — breaks responsiveness
|
|
120
|
+
- Placing tooltip inside the SVG — HTML tooltips are easier to style than SVG text
|
|
121
|
+
|
|
122
|
+
## Related Skills
|
|
123
|
+
|
|
124
|
+
- [react-flow-animated-layout-switching](react-flow-animated-layout-switching.md) — Graph visualizations
|
|
125
|
+
- [framer-motion-layoutid-grouping](framer-motion-layoutid-grouping.md) — Animated data transitions
|
|
126
|
+
|
|
127
|
+
## References
|
|
128
|
+
|
|
129
|
+
- SVG viewBox specification: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/viewBox
|
|
130
|
+
- Discovered in: scribe-bible word study frequency sparkline (Phase 5)
|
|
131
|
+
- 66-bar Bible book distribution chart — zero dependencies, full interactivity
|