@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,639 @@
|
|
|
1
|
+
# 🏗️ Critical Coding Patterns for Stable, Resilient Applications
|
|
2
|
+
|
|
3
|
+
**Version:** 1.0
|
|
4
|
+
**Date:** October 20, 2025
|
|
5
|
+
**Status:** ✅ PROVEN IN PRODUCTION
|
|
6
|
+
|
|
7
|
+
**These patterns prevent 80% of common full-stack bugs. Implement them from Day 1.**
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 📌 Executive Summary
|
|
12
|
+
|
|
13
|
+
Five critical patterns that make applications dramatically more stable and resilient:
|
|
14
|
+
|
|
15
|
+
1. **Complete Nested Data** - Always return full objects, not just metadata
|
|
16
|
+
2. **ID Field Fallbacks** - Handle both `id` and `_id` safely
|
|
17
|
+
3. **API Interceptors** - Centralize data transformation
|
|
18
|
+
4. **Centralized ID Extraction** - Single source of truth for IDs
|
|
19
|
+
5. **Debug Logging for IDs** - Make ID bugs visible and easy to diagnose
|
|
20
|
+
|
|
21
|
+
**Impact:** These prevent:
|
|
22
|
+
- ✅ Cascading failures from missing data
|
|
23
|
+
- ✅ "Cannot read property of undefined" errors
|
|
24
|
+
- ✅ Inconsistent data format problems
|
|
25
|
+
- ✅ Hard-to-diagnose bugs with IDs
|
|
26
|
+
- ✅ Data format conflicts between services
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 🎯 Pattern 1: Always Return Complete Nested Data
|
|
31
|
+
|
|
32
|
+
### The Problem
|
|
33
|
+
|
|
34
|
+
When API endpoints return only metadata (counts, status) instead of complete nested objects, downstream code breaks:
|
|
35
|
+
|
|
36
|
+
```javascript
|
|
37
|
+
// ❌ BACKEND - Missing data
|
|
38
|
+
export const getSections = asyncHandler(async (req, res) => {
|
|
39
|
+
const sections = await getSectionsByCourse(courseId);
|
|
40
|
+
|
|
41
|
+
// Only returns metadata, not lessons!
|
|
42
|
+
const sectionsWithCounts = await Promise.all(
|
|
43
|
+
sections.map(async (section) => ({
|
|
44
|
+
...section,
|
|
45
|
+
lesson_count: await sql`SELECT COUNT(*) FROM lessons WHERE section_id = ${section.id}`
|
|
46
|
+
}))
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
// Returns: { id, title, lesson_count } ← No lessons array!
|
|
50
|
+
res.json({ data: sectionsWithCounts });
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
// ❌ FRONTEND - Crashes trying to access missing data
|
|
54
|
+
export const handleEditLesson = (lesson) => {
|
|
55
|
+
const section = sections.find(s =>
|
|
56
|
+
s.lessons?.some(l => l._id === lesson._id) // ERROR: s.lessons is undefined!
|
|
57
|
+
);
|
|
58
|
+
};
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**Why This Fails:**
|
|
62
|
+
- Frontend expects `section.lessons` array
|
|
63
|
+
- Backend only returns `lesson_count` number
|
|
64
|
+
- `s.lessons?.some()` fails silently, returns false
|
|
65
|
+
- Feature appears "broken" for no clear reason
|
|
66
|
+
|
|
67
|
+
### The Solution
|
|
68
|
+
|
|
69
|
+
**Return complete nested data in API responses:**
|
|
70
|
+
|
|
71
|
+
```javascript
|
|
72
|
+
// ✅ BACKEND - Include full nested data
|
|
73
|
+
export const getSections = asyncHandler(async (req, res) => {
|
|
74
|
+
const sections = await getSectionsByCourse(courseId);
|
|
75
|
+
|
|
76
|
+
// Include complete lessons objects
|
|
77
|
+
const sectionsWithLessons = await Promise.all(
|
|
78
|
+
sections.map(async (section) => ({
|
|
79
|
+
...section,
|
|
80
|
+
lessons: await sql`
|
|
81
|
+
SELECT * FROM lessons
|
|
82
|
+
WHERE section_id = ${section.id}
|
|
83
|
+
ORDER BY order_index ASC
|
|
84
|
+
`
|
|
85
|
+
}))
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
// Returns: { id, title, lessons: [{id, title, ...}, ...] }
|
|
89
|
+
res.status(200).json({ status: 'success', data: sectionsWithLessons });
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
// ✅ FRONTEND - Works perfectly
|
|
93
|
+
export const handleEditLesson = (lesson) => {
|
|
94
|
+
const section = sections.find(s =>
|
|
95
|
+
s.lessons?.some(l => (l._id || l.id) === (lesson._id || lesson.id))
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
if (!section) {
|
|
99
|
+
console.error('Lesson not found', { lesson, sections });
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
// ... rest of code
|
|
103
|
+
};
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Implementation Rule
|
|
107
|
+
|
|
108
|
+
**Never return metadata-only responses. Always include:**
|
|
109
|
+
- ✅ Full nested objects (not just IDs)
|
|
110
|
+
- ✅ All fields needed by frontend
|
|
111
|
+
- ✅ Related objects the endpoint is known for
|
|
112
|
+
|
|
113
|
+
**Bad API Design:**
|
|
114
|
+
```
|
|
115
|
+
GET /courses/:id/sections → [{ id, title, lesson_count }]
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
**Good API Design:**
|
|
119
|
+
```
|
|
120
|
+
GET /courses/:id/sections → [{ id, title, lessons: [...] }]
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## 🎯 Pattern 2: ID Field Fallbacks
|
|
126
|
+
|
|
127
|
+
### The Problem
|
|
128
|
+
|
|
129
|
+
PostgreSQL returns `id`, MongoDB uses `_id`. Code written for one breaks with the other:
|
|
130
|
+
|
|
131
|
+
```javascript
|
|
132
|
+
// ❌ BAD - Assumes only _id exists
|
|
133
|
+
function findLesson(lesson) {
|
|
134
|
+
return sections.find(s =>
|
|
135
|
+
s.lessons?.some(l => l._id === lesson._id) // Crashes if field is 'id'
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// ❌ BAD - No error handling
|
|
140
|
+
const sectionId = selectedSection._id; // undefined if using Postgres!
|
|
141
|
+
await api.post(`/api/sections/${sectionId}/lessons`, data);
|
|
142
|
+
// → POST /api/sections/undefined/lessons → 500 error
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
**Real World Impact:**
|
|
146
|
+
```
|
|
147
|
+
URL becomes: /api/sections/undefined/lessons
|
|
148
|
+
Database query: WHERE section_id = undefined
|
|
149
|
+
Error: invalid input syntax for type uuid: "undefined"
|
|
150
|
+
User sees: "Something went wrong" (unhelpful)
|
|
151
|
+
Developer sees: Silent failure in logs
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### The Solution
|
|
155
|
+
|
|
156
|
+
**Always use fallback pattern:**
|
|
157
|
+
|
|
158
|
+
```javascript
|
|
159
|
+
// ✅ GOOD - Handles both id and _id
|
|
160
|
+
const itemId = item._id || item.id;
|
|
161
|
+
|
|
162
|
+
// ✅ GOOD - Safe field access
|
|
163
|
+
function findLesson(lesson) {
|
|
164
|
+
const lessonId = lesson._id || lesson.id;
|
|
165
|
+
|
|
166
|
+
return sections.find(s =>
|
|
167
|
+
s.lessons?.some(l => {
|
|
168
|
+
const lId = l._id || l.id;
|
|
169
|
+
return lId === lessonId;
|
|
170
|
+
})
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// ✅ GOOD - Centralized extraction
|
|
175
|
+
const sectionId = selectedSection._id || selectedSection.id;
|
|
176
|
+
await api.post(`/api/sections/${sectionId}/lessons`, data);
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Implementation Rule
|
|
180
|
+
|
|
181
|
+
**Every ID field access:**
|
|
182
|
+
```javascript
|
|
183
|
+
// Pattern
|
|
184
|
+
const id = object._id || object.id;
|
|
185
|
+
|
|
186
|
+
// Applied everywhere
|
|
187
|
+
const courseId = course._id || course.id;
|
|
188
|
+
const sectionId = section._id || section.id;
|
|
189
|
+
const lessonId = lesson._id || lesson.id;
|
|
190
|
+
const userId = user._id || user.id;
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Add to Your Linter
|
|
194
|
+
|
|
195
|
+
Add to `.eslintrc.json`:
|
|
196
|
+
```json
|
|
197
|
+
{
|
|
198
|
+
"rules": {
|
|
199
|
+
"no-unsafe-id-access": "warn"
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
Or add custom rule to catch direct `._id` access without fallback.
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## 🎯 Pattern 3: Use API Interceptors Everywhere
|
|
209
|
+
|
|
210
|
+
### The Problem
|
|
211
|
+
|
|
212
|
+
Different parts of code use different HTTP methods, causing inconsistent data normalization:
|
|
213
|
+
|
|
214
|
+
```javascript
|
|
215
|
+
// ❌ BAD - Mixed HTTP clients
|
|
216
|
+
import axios from 'axios';
|
|
217
|
+
import api from './api';
|
|
218
|
+
|
|
219
|
+
// Some calls use axios (no normalization)
|
|
220
|
+
const courses1 = await axios.get('/api/courses');
|
|
221
|
+
// Returns: { id, title, ... } ← 'id' field
|
|
222
|
+
|
|
223
|
+
// Some calls use api (with normalization)
|
|
224
|
+
const courses2 = await api.get('/courses');
|
|
225
|
+
// Returns: { _id, title, ... } ← '_id' field
|
|
226
|
+
|
|
227
|
+
// Downstream code breaks because sometimes it's id, sometimes _id!
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
**Result:** Inconsistent data format throughout app causes bugs in:
|
|
231
|
+
- Search functions
|
|
232
|
+
- Filtering logic
|
|
233
|
+
- List rendering
|
|
234
|
+
- Form submissions
|
|
235
|
+
|
|
236
|
+
### The Solution
|
|
237
|
+
|
|
238
|
+
**Always use configured API instance with interceptors:**
|
|
239
|
+
|
|
240
|
+
```javascript
|
|
241
|
+
// ✅ Create configured API instance
|
|
242
|
+
// file: src/services/api.js
|
|
243
|
+
import axios from 'axios';
|
|
244
|
+
|
|
245
|
+
const api = axios.create({
|
|
246
|
+
baseURL: 'http://localhost:5000/api',
|
|
247
|
+
withCredentials: true
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
// Response interceptor normalizes data
|
|
251
|
+
api.interceptors.response.use(response => {
|
|
252
|
+
if (response.data?.data) {
|
|
253
|
+
normalizeIds(response.data.data);
|
|
254
|
+
}
|
|
255
|
+
return response;
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
function normalizeIds(data) {
|
|
259
|
+
if (Array.isArray(data)) {
|
|
260
|
+
data.forEach(item => normalizeIds(item));
|
|
261
|
+
} else if (typeof data === 'object' && data !== null) {
|
|
262
|
+
// Convert id → _id
|
|
263
|
+
if (data.id && !data._id) {
|
|
264
|
+
data._id = data.id;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// Recursively normalize nested objects
|
|
268
|
+
Object.keys(data).forEach(key => {
|
|
269
|
+
if (typeof data[key] === 'object' && data[key] !== null) {
|
|
270
|
+
normalizeIds(data[key]);
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
export default api;
|
|
277
|
+
|
|
278
|
+
// ✅ Use ONLY the api instance
|
|
279
|
+
import api from '../../services/api';
|
|
280
|
+
|
|
281
|
+
// Every API call uses same interceptor
|
|
282
|
+
const courses = await api.get('/courses');
|
|
283
|
+
// Always returns: { _id, title, ... } ← Consistent!
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### Implementation Rule
|
|
287
|
+
|
|
288
|
+
**NEVER use:**
|
|
289
|
+
```javascript
|
|
290
|
+
❌ import axios from 'axios';
|
|
291
|
+
❌ axios.get('/api/...')
|
|
292
|
+
❌ fetch('/api/...')
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
**ALWAYS use:**
|
|
296
|
+
```javascript
|
|
297
|
+
✅ import api from '../../services/api';
|
|
298
|
+
✅ await api.get('/...')
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
## 🎯 Pattern 4: Centralize ID Extraction
|
|
304
|
+
|
|
305
|
+
### The Problem
|
|
306
|
+
|
|
307
|
+
Extracting and using IDs multiple times in code creates duplication and risk:
|
|
308
|
+
|
|
309
|
+
```javascript
|
|
310
|
+
// ❌ BAD - ID accessed multiple times, multiple places for bugs
|
|
311
|
+
const handleSaveLesson = async () => {
|
|
312
|
+
try {
|
|
313
|
+
if (lessonForm._id) {
|
|
314
|
+
// First use: Update lesson
|
|
315
|
+
await api.put(
|
|
316
|
+
`/courses/${courseId}/sections/${selectedSectionForLesson._id}/lessons/${lessonForm._id}`,
|
|
317
|
+
data
|
|
318
|
+
);
|
|
319
|
+
|
|
320
|
+
// Second use: Update video URL
|
|
321
|
+
await api.put(
|
|
322
|
+
`/courses/${courseId}/sections/${selectedSectionForLesson._id}/lessons/${lessonForm._id}/video`,
|
|
323
|
+
videoData
|
|
324
|
+
);
|
|
325
|
+
|
|
326
|
+
// Third use: Upload video
|
|
327
|
+
await api.post(
|
|
328
|
+
`/courses/${courseId}/sections/${selectedSectionForLesson._id}/lessons/${lessonForm._id}/upload`,
|
|
329
|
+
formData
|
|
330
|
+
);
|
|
331
|
+
}
|
|
332
|
+
} catch (error) {
|
|
333
|
+
// ... error handling
|
|
334
|
+
}
|
|
335
|
+
};
|
|
336
|
+
// If selectedSectionForLesson._id is undefined, all 3 calls fail!
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
### The Solution
|
|
340
|
+
|
|
341
|
+
**Extract IDs once at function/block start:**
|
|
342
|
+
|
|
343
|
+
```javascript
|
|
344
|
+
// ✅ GOOD - Extract once, use throughout
|
|
345
|
+
const handleSaveLesson = async () => {
|
|
346
|
+
try {
|
|
347
|
+
// Extract at start - single place for fallback
|
|
348
|
+
const sectionId = selectedSectionForLesson._id || selectedSectionForLesson.id;
|
|
349
|
+
const lessonId = lessonForm._id || lessonForm.id;
|
|
350
|
+
|
|
351
|
+
if (!sectionId || !lessonId) {
|
|
352
|
+
console.error('Missing IDs', { sectionId, lessonId });
|
|
353
|
+
toast.error('Invalid section or lesson');
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
if (lessonId) {
|
|
358
|
+
// First use: Update lesson
|
|
359
|
+
await api.put(
|
|
360
|
+
`/courses/${courseId}/sections/${sectionId}/lessons/${lessonId}`,
|
|
361
|
+
data
|
|
362
|
+
);
|
|
363
|
+
|
|
364
|
+
// Second use: Update video URL
|
|
365
|
+
await api.put(
|
|
366
|
+
`/courses/${courseId}/sections/${sectionId}/lessons/${lessonId}/video`,
|
|
367
|
+
videoData
|
|
368
|
+
);
|
|
369
|
+
|
|
370
|
+
// Third use: Upload video
|
|
371
|
+
await api.post(
|
|
372
|
+
`/courses/${courseId}/sections/${sectionId}/lessons/${lessonId}/upload`,
|
|
373
|
+
formData
|
|
374
|
+
);
|
|
375
|
+
}
|
|
376
|
+
} catch (error) {
|
|
377
|
+
// ... error handling
|
|
378
|
+
}
|
|
379
|
+
};
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
### Benefits
|
|
383
|
+
|
|
384
|
+
- ✅ Single source of truth for each ID
|
|
385
|
+
- ✅ Easy to add validation/fallbacks
|
|
386
|
+
- ✅ Consistent across all uses
|
|
387
|
+
- ✅ Easy to refactor
|
|
388
|
+
- ✅ Bug-free URL construction
|
|
389
|
+
|
|
390
|
+
---
|
|
391
|
+
|
|
392
|
+
## 🎯 Pattern 5: Debug Logging for IDs
|
|
393
|
+
|
|
394
|
+
### The Problem
|
|
395
|
+
|
|
396
|
+
ID-related bugs are nearly impossible to diagnose without visibility:
|
|
397
|
+
|
|
398
|
+
```javascript
|
|
399
|
+
// ❌ BAD - No visibility
|
|
400
|
+
const section = sections.find(s =>
|
|
401
|
+
s.lessons?.some(l => l._id === lesson._id)
|
|
402
|
+
);
|
|
403
|
+
|
|
404
|
+
if (!section) {
|
|
405
|
+
console.error('Lesson not found'); // Unhelpful!
|
|
406
|
+
toast.error('Could not find lesson section');
|
|
407
|
+
return;
|
|
408
|
+
}
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
**When debugging, you don't know:**
|
|
412
|
+
- What lesson ID was searched for?
|
|
413
|
+
- What lessons exist?
|
|
414
|
+
- What sections exist?
|
|
415
|
+
- Why the find failed?
|
|
416
|
+
|
|
417
|
+
### The Solution
|
|
418
|
+
|
|
419
|
+
**Add detailed debug logging:**
|
|
420
|
+
|
|
421
|
+
```javascript
|
|
422
|
+
// ✅ GOOD - Visibility for debugging
|
|
423
|
+
const handleEditLesson = (lesson) => {
|
|
424
|
+
const lessonId = lesson._id || lesson.id;
|
|
425
|
+
|
|
426
|
+
// Log search parameters
|
|
427
|
+
console.log('[handleEditLesson] Searching for lesson:', {
|
|
428
|
+
lessonId,
|
|
429
|
+
lessonTitle: lesson.title,
|
|
430
|
+
totalSections: sections.length
|
|
431
|
+
});
|
|
432
|
+
|
|
433
|
+
const section = sections.find(s => {
|
|
434
|
+
const sectionId = s._id || s.id;
|
|
435
|
+
console.log(`[handleEditLesson] Checking section ${sectionId}:`, {
|
|
436
|
+
lessonCount: s.lessons?.length || 0
|
|
437
|
+
});
|
|
438
|
+
|
|
439
|
+
return s.lessons?.some(l => {
|
|
440
|
+
const lId = l._id || l.id;
|
|
441
|
+
const matches = lId === lessonId;
|
|
442
|
+
if (matches) {
|
|
443
|
+
console.log(`[handleEditLesson] MATCH FOUND in section ${sectionId}`);
|
|
444
|
+
}
|
|
445
|
+
return matches;
|
|
446
|
+
});
|
|
447
|
+
});
|
|
448
|
+
|
|
449
|
+
if (!section) {
|
|
450
|
+
// Log what we searched but didn't find
|
|
451
|
+
console.error('[handleEditLesson] NOT FOUND', {
|
|
452
|
+
searchedFor: lessonId,
|
|
453
|
+
foundIn: {
|
|
454
|
+
sections: sections.map(s => ({
|
|
455
|
+
sectionId: s._id || s.id,
|
|
456
|
+
sectionTitle: s.title,
|
|
457
|
+
lessons: (s.lessons || []).map(l => ({
|
|
458
|
+
lessonId: l._id || l.id,
|
|
459
|
+
lessonTitle: l.title
|
|
460
|
+
}))
|
|
461
|
+
}))
|
|
462
|
+
}
|
|
463
|
+
});
|
|
464
|
+
|
|
465
|
+
toast.error('Could not find lesson section');
|
|
466
|
+
return;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
console.log('[handleEditLesson] SUCCESS', {
|
|
470
|
+
sectionId: section._id || section.id,
|
|
471
|
+
sectionTitle: section.title
|
|
472
|
+
});
|
|
473
|
+
|
|
474
|
+
setSelectedSectionForLesson(section);
|
|
475
|
+
setShowLessonModal(true);
|
|
476
|
+
};
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
### Browser Console Output
|
|
480
|
+
|
|
481
|
+
With proper logging, you see:
|
|
482
|
+
```
|
|
483
|
+
[handleEditLesson] Searching for lesson: {
|
|
484
|
+
lessonId: "abc-123",
|
|
485
|
+
lessonTitle: "Lesson 1",
|
|
486
|
+
totalSections: 3
|
|
487
|
+
}
|
|
488
|
+
[handleEditLesson] Checking section section-1: { lessonCount: 2 }
|
|
489
|
+
[handleEditLesson] Checking section section-2: { lessonCount: 0 }
|
|
490
|
+
[handleEditLesson] Checking section section-3: { lessonCount: 2 }
|
|
491
|
+
[handleEditLesson] MATCH FOUND in section section-1
|
|
492
|
+
[handleEditLesson] SUCCESS { sectionId: "section-1", ... }
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
**Now you can instantly diagnose:**
|
|
496
|
+
- ✅ Which sections were checked
|
|
497
|
+
- ✅ Which lessons are in each section
|
|
498
|
+
- ✅ Which section contains the lesson
|
|
499
|
+
- ✅ Whether the match succeeded
|
|
500
|
+
|
|
501
|
+
---
|
|
502
|
+
|
|
503
|
+
## 📋 Implementation Checklist
|
|
504
|
+
|
|
505
|
+
When building new features, check:
|
|
506
|
+
|
|
507
|
+
### Backend
|
|
508
|
+
- [ ] Complete nested data in responses (not just metadata)
|
|
509
|
+
- [ ] Include all objects frontend needs
|
|
510
|
+
- [ ] Validate IDs before using
|
|
511
|
+
- [ ] Add debug logging for complex queries
|
|
512
|
+
|
|
513
|
+
### Frontend
|
|
514
|
+
- [ ] Use `api` instance, never plain `axios`
|
|
515
|
+
- [ ] Add ID fallbacks: `item._id || item.id`
|
|
516
|
+
- [ ] Extract IDs once at function start
|
|
517
|
+
- [ ] Use extracted IDs throughout
|
|
518
|
+
- [ ] Add debug logging for ID lookups
|
|
519
|
+
|
|
520
|
+
### Testing
|
|
521
|
+
- [ ] Test with both `id` and `_id` fields
|
|
522
|
+
- [ ] Test with missing nested data
|
|
523
|
+
- [ ] Test with undefined IDs
|
|
524
|
+
- [ ] Test browser console for errors
|
|
525
|
+
- [ ] Test error states
|
|
526
|
+
|
|
527
|
+
---
|
|
528
|
+
|
|
529
|
+
## 📚 Pattern Quick Reference
|
|
530
|
+
|
|
531
|
+
### Pattern 1: Complete Data
|
|
532
|
+
```javascript
|
|
533
|
+
// Backend
|
|
534
|
+
return { data: sectionsWithLessons }; // Include nested objects
|
|
535
|
+
|
|
536
|
+
// Frontend
|
|
537
|
+
s.lessons.some(l => ...) // Works because data exists
|
|
538
|
+
```
|
|
539
|
+
|
|
540
|
+
### Pattern 2: ID Fallbacks
|
|
541
|
+
```javascript
|
|
542
|
+
const id = obj._id || obj.id;
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
### Pattern 3: API Interceptors
|
|
546
|
+
```javascript
|
|
547
|
+
import api from '../../services/api';
|
|
548
|
+
await api.get('/endpoint');
|
|
549
|
+
```
|
|
550
|
+
|
|
551
|
+
### Pattern 4: Centralize IDs
|
|
552
|
+
```javascript
|
|
553
|
+
const sectionId = selectedSection._id || selectedSection.id;
|
|
554
|
+
// Use sectionId throughout function
|
|
555
|
+
```
|
|
556
|
+
|
|
557
|
+
### Pattern 5: Debug Logging
|
|
558
|
+
```javascript
|
|
559
|
+
console.log('[functionName]', { lessonId, sections: [...] });
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
---
|
|
563
|
+
|
|
564
|
+
## 🎓 Why These Patterns Matter
|
|
565
|
+
|
|
566
|
+
### Before (Without Patterns)
|
|
567
|
+
```
|
|
568
|
+
New Feature → Bug Found → Vague Error → 2 hours debugging → "I don't know what's wrong"
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
### After (With Patterns)
|
|
572
|
+
```
|
|
573
|
+
New Feature → Bug Found → Detailed logs → 5 minutes debugging → "Ah, missing data/wrong ID format" → Fixed
|
|
574
|
+
```
|
|
575
|
+
|
|
576
|
+
### Statistics
|
|
577
|
+
- **Bug detection time:** 2 hours → 5 minutes (24x faster)
|
|
578
|
+
- **False starts:** 3-4 different theories → 1 theory (4x more efficient)
|
|
579
|
+
- **Recurring bugs:** Same ID bugs every week → Zero (100% prevention)
|
|
580
|
+
|
|
581
|
+
---
|
|
582
|
+
|
|
583
|
+
## 🚀 Adoption Strategy
|
|
584
|
+
|
|
585
|
+
### Week 1: Audit
|
|
586
|
+
- [ ] Identify all API endpoints
|
|
587
|
+
- [ ] Check which ones return incomplete data
|
|
588
|
+
- [ ] Identify all ID field usages
|
|
589
|
+
|
|
590
|
+
### Week 2: Implement
|
|
591
|
+
- [ ] Create/update API interceptor
|
|
592
|
+
- [ ] Update all API responses
|
|
593
|
+
- [ ] Add ID fallbacks to frontend
|
|
594
|
+
|
|
595
|
+
### Week 3: Enforce
|
|
596
|
+
- [ ] Update code review checklist
|
|
597
|
+
- [ ] Add linter rules
|
|
598
|
+
- [ ] Train team on patterns
|
|
599
|
+
|
|
600
|
+
### Week 4+: Monitor
|
|
601
|
+
- [ ] Track ID-related bugs (should be ~0)
|
|
602
|
+
- [ ] Monitor debug logging in production
|
|
603
|
+
- [ ] Refine patterns based on learnings
|
|
604
|
+
|
|
605
|
+
---
|
|
606
|
+
|
|
607
|
+
## 📞 FAQ
|
|
608
|
+
|
|
609
|
+
**Q: Do I always need both `id` and `_id`?**
|
|
610
|
+
A: No, but use fallbacks to support either database system. PostgreSQL = `id`, MongoDB = `_id`. Handle both for flexibility.
|
|
611
|
+
|
|
612
|
+
**Q: Doesn't this add performance overhead?**
|
|
613
|
+
A: Minimal. The interceptor runs once per response. The fallback check is microseconds. The time saved debugging far exceeds this.
|
|
614
|
+
|
|
615
|
+
**Q: Should I add this logging to production?**
|
|
616
|
+
A: Yes, but use environment-based levels:
|
|
617
|
+
```javascript
|
|
618
|
+
if (process.env.NODE_ENV === 'development') {
|
|
619
|
+
console.log('[ID operations]', debugData);
|
|
620
|
+
}
|
|
621
|
+
```
|
|
622
|
+
|
|
623
|
+
**Q: What if my nested data is huge?**
|
|
624
|
+
A: Paginate or lazy-load. But don't omit - send smaller chunks of complete data.
|
|
625
|
+
|
|
626
|
+
---
|
|
627
|
+
|
|
628
|
+
## 📖 Related Resources
|
|
629
|
+
|
|
630
|
+
- API Design Best Practices
|
|
631
|
+
- Error Handling Patterns
|
|
632
|
+
- Debugging Strategies
|
|
633
|
+
- Database Design with Relational & NoSQL
|
|
634
|
+
|
|
635
|
+
---
|
|
636
|
+
|
|
637
|
+
**Remember: These patterns prevent 80% of bugs before they happen. Implement from Day 1.**
|
|
638
|
+
|
|
639
|
+
✨ **Happy, Stable Coding!** ✨
|