@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,145 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: error-response-standards
|
|
3
|
+
category: api-patterns
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
contributed: 2026-02-24
|
|
6
|
+
contributor: dominion-flow
|
|
7
|
+
tags: [errors, api, rest, error-handling, http-status, responses]
|
|
8
|
+
difficulty: easy
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Error Response Standards
|
|
12
|
+
|
|
13
|
+
## Problem
|
|
14
|
+
|
|
15
|
+
Inconsistent error responses across routes make frontend error handling a nightmare. Some routes return `{ message }`, others `{ error }`, others `{ errors: [] }`. Status codes are used incorrectly (everything is 500 or 200).
|
|
16
|
+
|
|
17
|
+
## Solution Pattern
|
|
18
|
+
|
|
19
|
+
One error format for the entire API. Correct HTTP status codes. Machine-readable error codes alongside human-readable messages.
|
|
20
|
+
|
|
21
|
+
## Standard Error Envelope
|
|
22
|
+
|
|
23
|
+
```json
|
|
24
|
+
{
|
|
25
|
+
"error": {
|
|
26
|
+
"code": "VALIDATION_FAILED",
|
|
27
|
+
"message": "Course title is required",
|
|
28
|
+
"details": [
|
|
29
|
+
{ "field": "title", "message": "Required field", "code": "REQUIRED" },
|
|
30
|
+
{ "field": "duration", "message": "Must be positive", "code": "INVALID_RANGE" }
|
|
31
|
+
]
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**Three levels:**
|
|
37
|
+
1. `code` — Machine-readable, never changes (clients switch on this)
|
|
38
|
+
2. `message` — Human-readable, may change (display to users)
|
|
39
|
+
3. `details` — Optional array for field-level errors (forms)
|
|
40
|
+
|
|
41
|
+
## HTTP Status Code Guide
|
|
42
|
+
|
|
43
|
+
| Code | When | Example |
|
|
44
|
+
|------|------|---------|
|
|
45
|
+
| 400 | Client sent bad data | Missing required field, invalid format |
|
|
46
|
+
| 401 | Not authenticated | No token, expired token |
|
|
47
|
+
| 403 | Authenticated but forbidden | Student accessing admin route |
|
|
48
|
+
| 404 | Resource doesn't exist | Course ID not found |
|
|
49
|
+
| 409 | Conflict | Duplicate email, already enrolled |
|
|
50
|
+
| 422 | Semantically invalid | Valid JSON but business rule violation |
|
|
51
|
+
| 429 | Rate limited | Too many requests |
|
|
52
|
+
| 500 | Server bug | Unhandled exception, DB down |
|
|
53
|
+
|
|
54
|
+
**Rules:**
|
|
55
|
+
- **Never return 200 with an error body.** Use proper status codes.
|
|
56
|
+
- **Never return 500 for client errors.** 4xx means "your fault," 5xx means "our fault."
|
|
57
|
+
- **Always return JSON**, even for 404/500 (not HTML error pages).
|
|
58
|
+
|
|
59
|
+
## Error Middleware (Express)
|
|
60
|
+
|
|
61
|
+
```javascript
|
|
62
|
+
// middleware/errorHandler.js
|
|
63
|
+
function errorHandler(err, req, res, next) {
|
|
64
|
+
// Known operational error
|
|
65
|
+
if (err.isOperational) {
|
|
66
|
+
return res.status(err.statusCode).json({
|
|
67
|
+
error: {
|
|
68
|
+
code: err.code,
|
|
69
|
+
message: err.message,
|
|
70
|
+
details: err.details || undefined,
|
|
71
|
+
}
|
|
72
|
+
})
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Unknown bug — log full error, return generic message
|
|
76
|
+
console.error('Unhandled error:', err)
|
|
77
|
+
res.status(500).json({
|
|
78
|
+
error: {
|
|
79
|
+
code: 'INTERNAL_ERROR',
|
|
80
|
+
message: 'Something went wrong',
|
|
81
|
+
}
|
|
82
|
+
})
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Custom error class
|
|
86
|
+
class AppError extends Error {
|
|
87
|
+
constructor(statusCode, code, message, details) {
|
|
88
|
+
super(message)
|
|
89
|
+
this.statusCode = statusCode
|
|
90
|
+
this.code = code
|
|
91
|
+
this.details = details
|
|
92
|
+
this.isOperational = true
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
module.exports = { errorHandler, AppError }
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Usage in Routes
|
|
100
|
+
|
|
101
|
+
```javascript
|
|
102
|
+
const { AppError } = require('../middleware/errorHandler')
|
|
103
|
+
|
|
104
|
+
router.post('/courses', async (req, res, next) => {
|
|
105
|
+
try {
|
|
106
|
+
if (!req.body.title) {
|
|
107
|
+
throw new AppError(400, 'VALIDATION_FAILED', 'Title is required', [
|
|
108
|
+
{ field: 'title', message: 'Required field', code: 'REQUIRED' }
|
|
109
|
+
])
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const existing = await db.findByTitle(req.body.title)
|
|
113
|
+
if (existing) {
|
|
114
|
+
throw new AppError(409, 'DUPLICATE_RESOURCE', 'A course with this title already exists')
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const course = await db.createCourse(req.body)
|
|
118
|
+
res.status(201).json({ data: course })
|
|
119
|
+
} catch (err) {
|
|
120
|
+
next(err)
|
|
121
|
+
}
|
|
122
|
+
})
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Standard Error Codes
|
|
126
|
+
|
|
127
|
+
| Code | Status | Meaning |
|
|
128
|
+
|------|--------|---------|
|
|
129
|
+
| `VALIDATION_FAILED` | 400 | Input didn't pass validation |
|
|
130
|
+
| `UNAUTHORIZED` | 401 | Authentication required |
|
|
131
|
+
| `FORBIDDEN` | 403 | Insufficient permissions |
|
|
132
|
+
| `NOT_FOUND` | 404 | Resource doesn't exist |
|
|
133
|
+
| `DUPLICATE_RESOURCE` | 409 | Already exists |
|
|
134
|
+
| `RATE_LIMITED` | 429 | Too many requests |
|
|
135
|
+
| `INTERNAL_ERROR` | 500 | Server-side bug |
|
|
136
|
+
|
|
137
|
+
## When to Use
|
|
138
|
+
|
|
139
|
+
- Every API project, from day one
|
|
140
|
+
- Use the error middleware as the first middleware you write
|
|
141
|
+
|
|
142
|
+
## When NOT to Use
|
|
143
|
+
|
|
144
|
+
- GraphQL APIs (use GraphQL's built-in error format instead)
|
|
145
|
+
- gRPC (use status codes from grpc-status)
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
# Express Route Ordering - Preventing Catch-All Middleware Interception
|
|
2
|
+
|
|
3
|
+
## The Problem
|
|
4
|
+
|
|
5
|
+
Mobile users were being redirected to login immediately when accessing the website, unable to view any public pages or make donations. Desktop users could access the site normally.
|
|
6
|
+
|
|
7
|
+
### Error Observed
|
|
8
|
+
|
|
9
|
+
```json
|
|
10
|
+
GET /api/settings/maintenance-status → 401 Unauthorized
|
|
11
|
+
GET /api/settings → 401 Unauthorized
|
|
12
|
+
GET /api/themes/active → 401 Unauthorized
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
All public API endpoints were returning 401 errors despite:
|
|
16
|
+
- Routes defined WITHOUT `protect` middleware
|
|
17
|
+
- Controller functions correctly implemented
|
|
18
|
+
- Route definitions appearing correct
|
|
19
|
+
|
|
20
|
+
### Why It Was Hard
|
|
21
|
+
|
|
22
|
+
- **Silent failure** - No error messages, just wrong behavior
|
|
23
|
+
- **Inconsistent symptoms** - Worked on desktop (cached), failed on mobile
|
|
24
|
+
- **Misleading evidence** - Routes looked correct, controllers looked correct
|
|
25
|
+
- **Hidden culprit** - Problem was in route ORDERING, not route definition
|
|
26
|
+
- **Express.js behavior** - Routes are processed in order, first match wins
|
|
27
|
+
- **Middleware inheritance** - Catch-all routes with `router.use(protect)` apply to ALL matched paths
|
|
28
|
+
|
|
29
|
+
### Impact
|
|
30
|
+
|
|
31
|
+
- **Critical user experience failure** - Mobile users couldn't access website
|
|
32
|
+
- **Revenue impact** - Donations blocked on mobile
|
|
33
|
+
- **Trust damage** - Site appeared suspicious requiring login to view
|
|
34
|
+
- **React app failure** - Maintenance status check blocked app initialization
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## The Solution
|
|
39
|
+
|
|
40
|
+
### Root Cause
|
|
41
|
+
|
|
42
|
+
Routes mounted at `/api` (catch-all prefix) were defined BEFORE specific routes like `/api/settings`.
|
|
43
|
+
|
|
44
|
+
```javascript
|
|
45
|
+
// BAD: Catch-all routes BEFORE specific routes
|
|
46
|
+
app.use('/api', lessonNotesRoutes); // Has router.use(protect) - blocks EVERYTHING
|
|
47
|
+
app.use('/api', lessonResourcesRoutes); // Has router.use(protect) - blocks EVERYTHING
|
|
48
|
+
app.use('/api', teachingRoutes); // Has router.use(protect) - blocks EVERYTHING
|
|
49
|
+
// ... many lines later ...
|
|
50
|
+
app.use('/api/settings', siteSettingsRoutes); // Never reached for /api/settings/* requests!
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**What happened:**
|
|
54
|
+
1. Request comes in: `GET /api/settings/maintenance-status`
|
|
55
|
+
2. Express checks routes in order
|
|
56
|
+
3. First match: `app.use('/api', lessonNotesRoutes)` ✅ Matches!
|
|
57
|
+
4. lessonNotesRoutes has `router.use(protect)` middleware
|
|
58
|
+
5. Protect middleware runs, finds no token, returns 401
|
|
59
|
+
6. Request never reaches `app.use('/api/settings', ...)` defined later
|
|
60
|
+
|
|
61
|
+
### How to Fix
|
|
62
|
+
|
|
63
|
+
**Move catch-all `/api` routes AFTER all specific routes:**
|
|
64
|
+
|
|
65
|
+
```javascript
|
|
66
|
+
// GOOD: Specific routes FGTAT
|
|
67
|
+
app.use('/api/settings', siteSettingsRoutes); // Matches /api/settings/* FGTAT
|
|
68
|
+
app.use('/api/themes', themeRoutes); // Matches /api/themes/* FGTAT
|
|
69
|
+
app.use('/api/pages', pagesRoutes); // Matches /api/pages/* FGTAT
|
|
70
|
+
// ... all other specific /api/* routes ...
|
|
71
|
+
|
|
72
|
+
// Catch-all routes LAST (only match if no specific route matched)
|
|
73
|
+
app.use('/api', teachingRoutes); // Now only matches /api/teaching/*
|
|
74
|
+
app.use('/api', lessonNotesRoutes); // Now only matches /api/lessons/:id/notes
|
|
75
|
+
app.use('/api', lessonResourcesRoutes); // Now only matches /api/lessons/:id/resources
|
|
76
|
+
app.use('/api', courseReviewsRoutes); // Catch-all for remaining patterns
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Complete Code Example
|
|
80
|
+
|
|
81
|
+
**Before (BROKEN):**
|
|
82
|
+
```javascript
|
|
83
|
+
// server/server.js
|
|
84
|
+
app.use('/api', lessonNotesRoutes); // Line 180 - BLOCKS EVERYTHING
|
|
85
|
+
app.use('/api', lessonResourcesRoutes); // Line 181 - BLOCKS EVERYTHING
|
|
86
|
+
app.use('/api/lessons', lessonRoutes);
|
|
87
|
+
app.use('/api/sections', sectionRoutes);
|
|
88
|
+
app.use('/api', teachingRoutes); // Line 187 - BLOCKS EVERYTHING
|
|
89
|
+
app.use('/api/admin', adminRoutes);
|
|
90
|
+
// ... 40+ other routes ...
|
|
91
|
+
app.use('/api/settings', siteSettingsRoutes); // Line 228 - NEVER REACHED!
|
|
92
|
+
|
|
93
|
+
// server/routes/lessonNotesRoutes.js
|
|
94
|
+
const router = express.Router();
|
|
95
|
+
router.use(protect); // ⚠️ Applies to ALL requests matched by this router
|
|
96
|
+
router.route('/lessons/:lessonId/notes')
|
|
97
|
+
.get(getLessonNotes)
|
|
98
|
+
.post(createLessonNote);
|
|
99
|
+
export default router;
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
**After (FIXED):**
|
|
103
|
+
```javascript
|
|
104
|
+
// server/server.js
|
|
105
|
+
app.use('/api/admin/permissions', permissionRoutes);
|
|
106
|
+
app.use('/api/lessons', lessonRoutes);
|
|
107
|
+
app.use('/api/sections', sectionRoutes);
|
|
108
|
+
app.use('/api/admin', adminRoutes);
|
|
109
|
+
// ... all specific routes ...
|
|
110
|
+
app.use('/api/settings', siteSettingsRoutes); // NOW MATCHES FGTAT!
|
|
111
|
+
app.use('/api/themes', themeRoutes); // NOW MATCHES FGTAT!
|
|
112
|
+
app.use('/api/pages', pagesRoutes); // NOW MATCHES FGTAT!
|
|
113
|
+
// ... continue with all specific routes ...
|
|
114
|
+
|
|
115
|
+
// Catch-all routes MUST come AFTER all specific routes
|
|
116
|
+
app.use('/api', teachingRoutes); // Only matches remaining /api/teaching/*
|
|
117
|
+
app.use('/api', lessonNotesRoutes); // Only matches remaining /api/lessons/:id/notes
|
|
118
|
+
app.use('/api', lessonResourcesRoutes); // Only matches remaining /api/lessons/:id/resources
|
|
119
|
+
app.use('/api', courseReviewsRoutes); // Catch-all for course reviews
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Testing the Fix
|
|
125
|
+
|
|
126
|
+
### Before Fix
|
|
127
|
+
```bash
|
|
128
|
+
$ curl https://schooloftheprophets.club/api/settings/maintenance-status
|
|
129
|
+
{"success":false,"message":"Not authorized to access this route. Please log in.","errors":[]}
|
|
130
|
+
|
|
131
|
+
$ curl https://schooloftheprophets.club/api/themes/active
|
|
132
|
+
{"success":false,"message":"Not authorized to access this route. Please log in.","errors":[]}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### After Fix
|
|
136
|
+
```bash
|
|
137
|
+
$ curl https://schooloftheprophets.club/api/settings/maintenance-status
|
|
138
|
+
{"success":true,"data":{"enabled":false,"title":"Site Under Construction",...}}
|
|
139
|
+
|
|
140
|
+
$ curl https://schooloftheprophets.club/api/themes/active
|
|
141
|
+
{"success":true,"data":{"slug":"aurora-borealis","name":"Aurora Borealis Theme",...}}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Verification Steps
|
|
145
|
+
|
|
146
|
+
1. **Check route order in server.js:**
|
|
147
|
+
```bash
|
|
148
|
+
grep -n "app.use('/api" server/server.js | head -20
|
|
149
|
+
```
|
|
150
|
+
Verify specific routes (with full paths like `/api/settings`) come BEFORE catch-all routes (`/api`).
|
|
151
|
+
|
|
152
|
+
2. **Test public endpoints:**
|
|
153
|
+
```bash
|
|
154
|
+
curl -I https://your-site.com/api/settings/maintenance-status
|
|
155
|
+
# Should return 200, not 401
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
3. **Check PM2 logs for middleware calls:**
|
|
159
|
+
```bash
|
|
160
|
+
pm2 logs --lines 50 | grep "PROTECT"
|
|
161
|
+
# Should NOT see protect middleware for public routes
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
4. **Mobile testing:**
|
|
165
|
+
- Open site on mobile device
|
|
166
|
+
- Should load homepage without redirect to login
|
|
167
|
+
- Verify network tab shows 200 for `/api/settings/*` endpoints
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## Prevention
|
|
172
|
+
|
|
173
|
+
### Express Route Ordering Rules
|
|
174
|
+
|
|
175
|
+
1. **Most specific routes FGTAT:**
|
|
176
|
+
```javascript
|
|
177
|
+
app.use('/api/users/profile', profileRoutes); // Most specific
|
|
178
|
+
app.use('/api/users/:id', userRoutes); // Less specific
|
|
179
|
+
app.use('/api/users', usersRoutes); // Even less specific
|
|
180
|
+
app.use('/api', apiRoutes); // Least specific (catch-all)
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
2. **Group by specificity level:**
|
|
184
|
+
```javascript
|
|
185
|
+
// Level 1: Very specific paths (3+ segments)
|
|
186
|
+
app.use('/api/admin/permissions', permissionRoutes);
|
|
187
|
+
|
|
188
|
+
// Level 2: Moderately specific (2 segments)
|
|
189
|
+
app.use('/api/settings', settingsRoutes);
|
|
190
|
+
app.use('/api/themes', themeRoutes);
|
|
191
|
+
|
|
192
|
+
// Level 3: Catch-all (1 segment)
|
|
193
|
+
app.use('/api', catchAllRoutes);
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
3. **Comment your intentions:**
|
|
197
|
+
```javascript
|
|
198
|
+
// IMPORTANT: Specific routes MUST come before catch-all /api routes
|
|
199
|
+
// Catch-all /api routes with middleware will intercept EVERYTHING
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
4. **Use explicit paths over catch-alls when possible:**
|
|
203
|
+
```javascript
|
|
204
|
+
// Instead of:
|
|
205
|
+
app.use('/api', lessonNotesRoutes); // router has /lessons/:id/notes
|
|
206
|
+
|
|
207
|
+
// Prefer:
|
|
208
|
+
app.use('/api/lessons', lessonNotesRoutes); // More explicit
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### Middleware Design Pattern
|
|
212
|
+
|
|
213
|
+
When creating routes that might be used as catch-alls:
|
|
214
|
+
|
|
215
|
+
```javascript
|
|
216
|
+
// AVOID: Global middleware in catch-all routes
|
|
217
|
+
const router = express.Router();
|
|
218
|
+
router.use(protect); // ⚠️ Dangerous if mounted at /api
|
|
219
|
+
router.get('/lessons/:id/notes', getNotes);
|
|
220
|
+
|
|
221
|
+
// PREFER: Middleware on specific routes
|
|
222
|
+
const router = express.Router();
|
|
223
|
+
router.get('/lessons/:id/notes', protect, getNotes); // ✅ Explicit protection
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### Code Review Checklist
|
|
227
|
+
|
|
228
|
+
- [ ] Are there any `app.use('/api', ...)` routes?
|
|
229
|
+
- [ ] Do they have `router.use(middleware)` inside?
|
|
230
|
+
- [ ] Are specific routes like `/api/settings` defined BEFORE catch-all `/api`?
|
|
231
|
+
- [ ] Are public endpoints actually accessible without authentication?
|
|
232
|
+
- [ ] Have you tested in incognito mode (no cached tokens)?
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## Related Patterns
|
|
237
|
+
|
|
238
|
+
- [Express Middleware Order](../patterns-standards/MIDDLEWARE_ORDER.md)
|
|
239
|
+
- [Public API Design](../api-patterns/PUBLIC_API_DESIGN.md)
|
|
240
|
+
- [Route Protection Patterns](../security/ROUTE_PROTECTION.md)
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## Common Mistakes to Avoid
|
|
245
|
+
|
|
246
|
+
- ❌ **Mounting catch-all routes early** - Always put them last
|
|
247
|
+
- ❌ **Using `router.use(middleware)` in catch-all routes** - Applies to EVERYTHING matched
|
|
248
|
+
- ❌ **Not testing public endpoints** - Always verify in incognito/logout state
|
|
249
|
+
- ❌ **Assuming route definition = route priority** - Order matters, not definition clarity
|
|
250
|
+
- ❌ **Forgetting Express processes routes sequentially** - First match wins, search stops
|
|
251
|
+
|
|
252
|
+
---
|
|
253
|
+
|
|
254
|
+
## Resources
|
|
255
|
+
|
|
256
|
+
- [Express Routing Guide](https://expressjs.com/en/guide/routing.html)
|
|
257
|
+
- [Express app.use() Documentation](https://expressjs.com/en/4x/api.html#app.use)
|
|
258
|
+
- [Understanding Express Middleware](https://expressjs.com/en/guide/using-middleware.html)
|
|
259
|
+
- [Route Order Best Practices](https://stackoverflow.com/questions/14125997/express-js-middleware-order)
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## Time to Implement
|
|
264
|
+
|
|
265
|
+
**3 hours to debug** (if you don't know the pattern)
|
|
266
|
+
**5-10 minutes to fix** (once you identify the issue)
|
|
267
|
+
**Future prevention: 0 minutes** (follow the pattern from the start)
|
|
268
|
+
|
|
269
|
+
## Difficulty Level
|
|
270
|
+
|
|
271
|
+
⭐⭐⭐ (3/5) - Hard to debug initially, easy to fix once identified
|
|
272
|
+
|
|
273
|
+
### Debugging Difficulty: ⭐⭐⭐⭐⭐ (5/5)
|
|
274
|
+
- Silent failure with no error messages
|
|
275
|
+
- Symptoms misleading (worked on desktop, failed on mobile due to caching)
|
|
276
|
+
- Requires understanding Express route matching internals
|
|
277
|
+
- Many places to look (controllers, routes, middleware)
|
|
278
|
+
|
|
279
|
+
### Fix Difficulty: ⭐ (1/5)
|
|
280
|
+
- Move routes to correct order
|
|
281
|
+
- No code changes to logic
|
|
282
|
+
- Takes 5 minutes
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## Author Notes
|
|
287
|
+
|
|
288
|
+
**Investigation Process:**
|
|
289
|
+
1. ✅ Checked routing in App.jsx - public routes correct
|
|
290
|
+
2. ✅ Checked MainLayout - no redirect logic
|
|
291
|
+
3. ✅ Verified controller implementation - correct
|
|
292
|
+
4. ✅ Verified route definitions - looked correct
|
|
293
|
+
5. ✅ Added logging to protect middleware - found it was being called!
|
|
294
|
+
6. ✅ Checked server.js route mounting - FOUND THE BUG!
|
|
295
|
+
|
|
296
|
+
**Key Insight:**
|
|
297
|
+
The routes *looked* correct because the definitions were fine. The problem was entirely about **ORDER**. Express processes routes sequentially, and catch-all routes with middleware were matching first and blocking everything.
|
|
298
|
+
|
|
299
|
+
**Debugging Breakthrough:**
|
|
300
|
+
Added logging to protect middleware showing it was being called for public routes. This proved the routes weren't reaching their handlers. Then checked route mounting order and found catch-all routes before specific routes.
|
|
301
|
+
|
|
302
|
+
**Prevention:**
|
|
303
|
+
Always put specific routes before catch-all routes. When using `app.use('/api', router)`, ensure the router doesn't have `router.use(protect)` or other global middleware that would block public endpoints.
|
|
304
|
+
|
|
305
|
+
**Time Spent:** 3 hours debugging, 5 minutes fixing once identified.
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
## Real-World Impact
|
|
310
|
+
|
|
311
|
+
- **Before:** Mobile users couldn't access website, donations blocked
|
|
312
|
+
- **After:** Full public access restored, React app loads properly
|
|
313
|
+
- **Commits:** 12 debugging commits, 1 fix commit, 1 cleanup commit
|
|
314
|
+
- **Deployments:** 6 test deployments, 1 final deployment
|
|
315
|
+
- **Resolution:** Complete fix with no side effects
|
|
316
|
+
|
|
317
|
+
---
|
|
318
|
+
|
|
319
|
+
**Project:** MERN Community LMS
|
|
320
|
+
**Date Solved:** 2026-02-02
|
|
321
|
+
**Production Site:** schooloftheprophets.club
|
|
322
|
+
**Commits:** 070bca5 (fix), 2b34625 (cleanup)
|
|
323
|
+
|
|
324
|
+
---
|
|
325
|
+
|
|
326
|
+
*This skill documents a critical Express.js routing pattern that cost 3 hours to debug but takes 5 minutes to fix once you know what to look for. Share this knowledge!*
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pagination-patterns
|
|
3
|
+
category: api-patterns
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
contributed: 2026-02-24
|
|
6
|
+
contributor: dominion-flow
|
|
7
|
+
tags: [pagination, api, cursor, offset, rest, graphql]
|
|
8
|
+
difficulty: medium
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Pagination Patterns
|
|
12
|
+
|
|
13
|
+
## Problem
|
|
14
|
+
|
|
15
|
+
APIs that return unbounded lists kill performance, waste bandwidth, and crash clients. Offset-based pagination breaks under concurrent writes. Choosing the wrong pattern early means painful migration later.
|
|
16
|
+
|
|
17
|
+
## Three Patterns
|
|
18
|
+
|
|
19
|
+
### 1. Offset/Limit (Simple, Fragile)
|
|
20
|
+
|
|
21
|
+
```javascript
|
|
22
|
+
// GET /api/courses?page=2&limit=20
|
|
23
|
+
router.get('/courses', async (req, res) => {
|
|
24
|
+
const page = Math.max(1, parseInt(req.query.page) || 1)
|
|
25
|
+
const limit = Math.min(100, parseInt(req.query.limit) || 20)
|
|
26
|
+
const offset = (page - 1) * limit
|
|
27
|
+
|
|
28
|
+
const [courses, total] = await Promise.all([
|
|
29
|
+
db.query('SELECT * FROM courses ORDER BY id LIMIT ? OFFSET ?', [limit, offset]),
|
|
30
|
+
db.query('SELECT COUNT(*) as total FROM courses'),
|
|
31
|
+
])
|
|
32
|
+
|
|
33
|
+
res.json({
|
|
34
|
+
data: courses,
|
|
35
|
+
pagination: {
|
|
36
|
+
page,
|
|
37
|
+
limit,
|
|
38
|
+
total: total[0].total,
|
|
39
|
+
totalPages: Math.ceil(total[0].total / limit),
|
|
40
|
+
hasNext: page * limit < total[0].total,
|
|
41
|
+
hasPrev: page > 1,
|
|
42
|
+
}
|
|
43
|
+
})
|
|
44
|
+
})
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**Pros:** Easy to implement, supports "jump to page 5."
|
|
48
|
+
**Cons:** Skips/duplicates rows when data changes between pages. Slow on large offsets (DB must scan and discard rows).
|
|
49
|
+
|
|
50
|
+
### 2. Cursor-Based (Robust, Recommended)
|
|
51
|
+
|
|
52
|
+
```javascript
|
|
53
|
+
// GET /api/courses?cursor=eyJpZCI6MTAwfQ&limit=20
|
|
54
|
+
router.get('/courses', async (req, res) => {
|
|
55
|
+
const limit = Math.min(100, parseInt(req.query.limit) || 20)
|
|
56
|
+
const cursor = req.query.cursor
|
|
57
|
+
? JSON.parse(Buffer.from(req.query.cursor, 'base64').toString())
|
|
58
|
+
: null
|
|
59
|
+
|
|
60
|
+
const whereClause = cursor ? 'WHERE id > ?' : ''
|
|
61
|
+
const params = cursor ? [cursor.id, limit + 1] : [limit + 1]
|
|
62
|
+
|
|
63
|
+
const courses = await db.query(
|
|
64
|
+
`SELECT * FROM courses ${whereClause} ORDER BY id LIMIT ?`,
|
|
65
|
+
params
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
const hasNext = courses.length > limit
|
|
69
|
+
if (hasNext) courses.pop() // Remove the extra row
|
|
70
|
+
|
|
71
|
+
const nextCursor = hasNext
|
|
72
|
+
? Buffer.from(JSON.stringify({ id: courses[courses.length - 1].id })).toString('base64')
|
|
73
|
+
: null
|
|
74
|
+
|
|
75
|
+
res.json({
|
|
76
|
+
data: courses,
|
|
77
|
+
pagination: {
|
|
78
|
+
nextCursor,
|
|
79
|
+
hasNext,
|
|
80
|
+
limit,
|
|
81
|
+
}
|
|
82
|
+
})
|
|
83
|
+
})
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**Pros:** Consistent results under concurrent writes. Fast (uses index seek, not offset scan).
|
|
87
|
+
**Cons:** Can't jump to arbitrary page. Cursor is opaque to client.
|
|
88
|
+
|
|
89
|
+
### 3. Keyset (Cursor + Sort)
|
|
90
|
+
|
|
91
|
+
```javascript
|
|
92
|
+
// When sorting by non-unique fields (e.g., created_at)
|
|
93
|
+
// Use composite cursor: (created_at, id) for uniqueness
|
|
94
|
+
const cursor = { created_at: '2026-02-24T10:00:00Z', id: 150 }
|
|
95
|
+
|
|
96
|
+
const courses = await db.query(`
|
|
97
|
+
SELECT * FROM courses
|
|
98
|
+
WHERE (created_at, id) > (?, ?)
|
|
99
|
+
ORDER BY created_at, id
|
|
100
|
+
LIMIT ?
|
|
101
|
+
`, [cursor.created_at, cursor.id, limit + 1])
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Which to Choose
|
|
105
|
+
|
|
106
|
+
| Scenario | Pattern | Why |
|
|
107
|
+
|----------|---------|-----|
|
|
108
|
+
| Admin dashboard, small dataset | Offset | Jump-to-page needed |
|
|
109
|
+
| Public API, large dataset | Cursor | Consistent, scalable |
|
|
110
|
+
| Real-time feed (chat, activity) | Cursor | Data changes constantly |
|
|
111
|
+
| Search results | Offset | Users expect page numbers |
|
|
112
|
+
| Infinite scroll UI | Cursor | Natural fit |
|
|
113
|
+
|
|
114
|
+
## Response Envelope
|
|
115
|
+
|
|
116
|
+
```json
|
|
117
|
+
{
|
|
118
|
+
"data": [...],
|
|
119
|
+
"pagination": {
|
|
120
|
+
"nextCursor": "abc123",
|
|
121
|
+
"hasNext": true,
|
|
122
|
+
"limit": 20
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Always include `hasNext` — clients shouldn't have to guess.
|
|
128
|
+
|
|
129
|
+
## When to Use
|
|
130
|
+
|
|
131
|
+
- Any list endpoint returning more than 50 items
|
|
132
|
+
- APIs consumed by mobile apps (bandwidth matters)
|
|
133
|
+
|
|
134
|
+
## When NOT to Use
|
|
135
|
+
|
|
136
|
+
- Endpoints that always return small, bounded lists (e.g., user roles)
|
|
137
|
+
- Aggregation endpoints (return a single summary, not a list)
|