@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,494 @@
|
|
|
1
|
+
# PostgreSQL Full-Text Search for Content Platforms
|
|
2
|
+
|
|
3
|
+
> Production-ready FTS using PostgreSQL's built-in tsvector/tsquery — no Elasticsearch required.
|
|
4
|
+
|
|
5
|
+
**When to use:** Building search for blogs, knowledge bases, docs, LMS, or any content-heavy app where you want relevance ranking without external infrastructure.
|
|
6
|
+
**Stack:** PostgreSQL 14+, Node.js/Express or Bun, TypeScript
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Why PostgreSQL FTS First
|
|
11
|
+
|
|
12
|
+
Before reaching for Elasticsearch or Typesense, ask:
|
|
13
|
+
- Fewer than ~1 million documents? → PG FTS handles it fine.
|
|
14
|
+
- Already using PostgreSQL? → Zero new infrastructure.
|
|
15
|
+
- Need relevance ranking, phrase search, prefix matching? → All built in.
|
|
16
|
+
- Need faceting, synonyms, ML-powered re-ranking? → Then add a search engine.
|
|
17
|
+
|
|
18
|
+
Rule of thumb: **PG FTS is production-ready up to ~1M rows** with proper GIN indexing. At 5M+ rows with complex relevance needs, evaluate Typesense or Elasticsearch.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Core Concepts
|
|
23
|
+
|
|
24
|
+
| Concept | What it is |
|
|
25
|
+
|---------|-----------|
|
|
26
|
+
| `tsvector` | Preprocessed document representation (stemmed, stop-words removed) |
|
|
27
|
+
| `tsquery` | Search query in tsvector-compatible form |
|
|
28
|
+
| `GIN index` | Generalized Inverted Index — makes FTS fast at scale |
|
|
29
|
+
| `ts_rank` | Relevance score function (0.0–1.0) |
|
|
30
|
+
| `setweight` | Assigns A/B/C/D weight to parts of a document |
|
|
31
|
+
| `to_tsvector` | Converts text to tsvector |
|
|
32
|
+
| `to_tsquery` | Converts user input to tsquery (exact phrase match) |
|
|
33
|
+
| `plainto_tsquery` | Converts plain text (AND behavior, no operators needed) |
|
|
34
|
+
| `websearch_to_tsquery` | Converts Google-style queries (quotes, minus, OR) |
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Schema: Content Table with FTS
|
|
39
|
+
|
|
40
|
+
```sql
|
|
41
|
+
-- Content table with FTS support
|
|
42
|
+
CREATE TABLE content (
|
|
43
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
44
|
+
title TEXT NOT NULL,
|
|
45
|
+
body TEXT NOT NULL,
|
|
46
|
+
excerpt TEXT,
|
|
47
|
+
tags TEXT[], -- array of tag strings
|
|
48
|
+
author_id UUID REFERENCES users(id),
|
|
49
|
+
status TEXT NOT NULL DEFAULT 'draft',
|
|
50
|
+
published_at TIMESTAMPTZ,
|
|
51
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
52
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
53
|
+
|
|
54
|
+
-- Weighted search vector: stored, updated by trigger
|
|
55
|
+
search_vector TSVECTOR GENERATED ALWAYS AS (
|
|
56
|
+
setweight(to_tsvector('english', coalesce(title, '')), 'A') ||
|
|
57
|
+
setweight(to_tsvector('english', coalesce(excerpt, '')), 'B') ||
|
|
58
|
+
setweight(to_tsvector('english', coalesce(body, '')), 'C') ||
|
|
59
|
+
setweight(to_tsvector('english', coalesce(array_to_string(tags, ' '), '')), 'B')
|
|
60
|
+
) STORED
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
-- GIN index on the stored vector — this is what makes it fast
|
|
64
|
+
CREATE INDEX idx_content_search_vector ON content USING GIN(search_vector);
|
|
65
|
+
|
|
66
|
+
-- Index for common filter combos
|
|
67
|
+
CREATE INDEX idx_content_status_published ON content(status, published_at DESC);
|
|
68
|
+
CREATE INDEX idx_content_author ON content(author_id);
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Why GENERATED ALWAYS AS STORED?
|
|
72
|
+
|
|
73
|
+
PostgreSQL 12+ supports stored generated columns. The `search_vector` column is automatically recomputed on every INSERT/UPDATE. No trigger needed. This is the cleanest approach — one source of truth, no sync lag.
|
|
74
|
+
|
|
75
|
+
**Alternative: Trigger-based (for older PG or more control)**
|
|
76
|
+
|
|
77
|
+
```sql
|
|
78
|
+
-- If you need PG 11 or want trigger-based updates:
|
|
79
|
+
ALTER TABLE content ADD COLUMN search_vector TSVECTOR;
|
|
80
|
+
|
|
81
|
+
CREATE OR REPLACE FUNCTION content_search_vector_update()
|
|
82
|
+
RETURNS TRIGGER AS $$
|
|
83
|
+
BEGIN
|
|
84
|
+
NEW.search_vector :=
|
|
85
|
+
setweight(to_tsvector('english', coalesce(NEW.title, '')), 'A') ||
|
|
86
|
+
setweight(to_tsvector('english', coalesce(NEW.excerpt, '')), 'B') ||
|
|
87
|
+
setweight(to_tsvector('english', coalesce(NEW.body, '')), 'C') ||
|
|
88
|
+
setweight(to_tsvector('english', coalesce(array_to_string(NEW.tags, ' '), '')), 'B');
|
|
89
|
+
RETURN NEW;
|
|
90
|
+
END;
|
|
91
|
+
$$ LANGUAGE plpgsql;
|
|
92
|
+
|
|
93
|
+
CREATE TRIGGER content_search_vector_trigger
|
|
94
|
+
BEFORE INSERT OR UPDATE ON content
|
|
95
|
+
FOR EACH ROW EXECUTE FUNCTION content_search_vector_update();
|
|
96
|
+
|
|
97
|
+
-- Backfill existing rows after adding trigger
|
|
98
|
+
UPDATE content SET updated_at = updated_at;
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## Weight Strategy: A > B > C > D
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
Weight A — Title (highest relevance)
|
|
107
|
+
Weight B — Excerpt, Tags
|
|
108
|
+
Weight C — Body (lowest, largest volume)
|
|
109
|
+
Weight D — (available for metadata, rarely used)
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
`ts_rank` uses these weights when computing relevance scores. A document where the query matches the title ranks higher than one where it only matches the body.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## Query Patterns
|
|
117
|
+
|
|
118
|
+
### 1. Simple Search (AND behavior)
|
|
119
|
+
|
|
120
|
+
```sql
|
|
121
|
+
-- All words must appear somewhere in the document
|
|
122
|
+
SELECT
|
|
123
|
+
id,
|
|
124
|
+
title,
|
|
125
|
+
published_at,
|
|
126
|
+
ts_rank(search_vector, query) AS rank
|
|
127
|
+
FROM content,
|
|
128
|
+
plainto_tsquery('english', 'postgresql performance') AS query
|
|
129
|
+
WHERE
|
|
130
|
+
status = 'published'
|
|
131
|
+
AND search_vector @@ query
|
|
132
|
+
ORDER BY rank DESC, published_at DESC
|
|
133
|
+
LIMIT 20;
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
`plainto_tsquery` treats the input as "postgresql AND performance" — no operators needed from the user.
|
|
137
|
+
|
|
138
|
+
### 2. Phrase Search (exact phrase)
|
|
139
|
+
|
|
140
|
+
```sql
|
|
141
|
+
-- Words must appear together in order
|
|
142
|
+
SELECT id, title, ts_rank(search_vector, query) AS rank
|
|
143
|
+
FROM content,
|
|
144
|
+
phraseto_tsquery('english', 'database index') AS query
|
|
145
|
+
WHERE status = 'published'
|
|
146
|
+
AND search_vector @@ query
|
|
147
|
+
ORDER BY rank DESC;
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### 3. Prefix Search (autocomplete / partial words)
|
|
151
|
+
|
|
152
|
+
```sql
|
|
153
|
+
-- Match words beginning with a prefix (great for autocomplete)
|
|
154
|
+
SELECT id, title, ts_rank(search_vector, query) AS rank
|
|
155
|
+
FROM content,
|
|
156
|
+
to_tsquery('english', 'postgr:*') AS query -- matches postgresql, postgres, etc.
|
|
157
|
+
WHERE status = 'published'
|
|
158
|
+
AND search_vector @@ query
|
|
159
|
+
ORDER BY rank DESC
|
|
160
|
+
LIMIT 10;
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### 4. Google-Style Input (quotes, minus, OR)
|
|
164
|
+
|
|
165
|
+
```sql
|
|
166
|
+
-- Accepts: "exact phrase" postgres -mysql OR nosql
|
|
167
|
+
SELECT id, title, ts_rank(search_vector, query) AS rank
|
|
168
|
+
FROM content,
|
|
169
|
+
websearch_to_tsquery('english', $1) AS query
|
|
170
|
+
WHERE status = 'published'
|
|
171
|
+
AND search_vector @@ query
|
|
172
|
+
ORDER BY rank DESC;
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
`websearch_to_tsquery` is the right choice for user-facing search boxes. It handles:
|
|
176
|
+
- `"exact phrase"` → phrase search
|
|
177
|
+
- `-word` → exclude word
|
|
178
|
+
- `word1 OR word2` → either word
|
|
179
|
+
- Everything else → AND
|
|
180
|
+
|
|
181
|
+
### 5. Combined FTS + Regular Filters
|
|
182
|
+
|
|
183
|
+
```sql
|
|
184
|
+
-- Search within a specific author's published posts, after a date
|
|
185
|
+
SELECT
|
|
186
|
+
c.id,
|
|
187
|
+
c.title,
|
|
188
|
+
c.published_at,
|
|
189
|
+
c.tags,
|
|
190
|
+
u.name AS author_name,
|
|
191
|
+
ts_rank(c.search_vector, query) AS rank
|
|
192
|
+
FROM content c
|
|
193
|
+
JOIN users u ON u.id = c.author_id,
|
|
194
|
+
websearch_to_tsquery('english', $1) AS query
|
|
195
|
+
WHERE
|
|
196
|
+
c.status = 'published'
|
|
197
|
+
AND c.author_id = $2
|
|
198
|
+
AND c.published_at >= $3
|
|
199
|
+
AND c.search_vector @@ query
|
|
200
|
+
ORDER BY rank DESC, c.published_at DESC
|
|
201
|
+
LIMIT $4 OFFSET $5;
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### 6. Search with Snippet Highlighting
|
|
205
|
+
|
|
206
|
+
```sql
|
|
207
|
+
-- Return highlighted excerpts showing matched terms in context
|
|
208
|
+
SELECT
|
|
209
|
+
id,
|
|
210
|
+
title,
|
|
211
|
+
ts_headline(
|
|
212
|
+
'english',
|
|
213
|
+
body,
|
|
214
|
+
query,
|
|
215
|
+
'MaxWords=50, MinWords=15, ShortWord=3, HighlightAll=false,
|
|
216
|
+
MaxFragments=3, FragmentDelimiter='' ... '''
|
|
217
|
+
) AS headline,
|
|
218
|
+
ts_rank(search_vector, query) AS rank
|
|
219
|
+
FROM content,
|
|
220
|
+
websearch_to_tsquery('english', $1) AS query
|
|
221
|
+
WHERE status = 'published'
|
|
222
|
+
AND search_vector @@ query
|
|
223
|
+
ORDER BY rank DESC
|
|
224
|
+
LIMIT 20;
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
`ts_headline` is expensive — only use it on the final result set (after LIMIT), never in a WHERE clause or subquery.
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## Node.js / Express Query Helper
|
|
232
|
+
|
|
233
|
+
```typescript
|
|
234
|
+
// lib/content-search.ts
|
|
235
|
+
import { Pool } from 'pg';
|
|
236
|
+
|
|
237
|
+
interface SearchOptions {
|
|
238
|
+
query: string;
|
|
239
|
+
authorId?: string;
|
|
240
|
+
tags?: string[];
|
|
241
|
+
status?: string;
|
|
242
|
+
limit?: number;
|
|
243
|
+
offset?: number;
|
|
244
|
+
highlight?: boolean;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
interface SearchResult {
|
|
248
|
+
id: string;
|
|
249
|
+
title: string;
|
|
250
|
+
excerpt: string | null;
|
|
251
|
+
tags: string[];
|
|
252
|
+
published_at: string | null;
|
|
253
|
+
author_name: string;
|
|
254
|
+
rank: number;
|
|
255
|
+
headline?: string;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
export async function searchContent(
|
|
259
|
+
db: Pool,
|
|
260
|
+
options: SearchOptions
|
|
261
|
+
): Promise<{ results: SearchResult[]; total: number }> {
|
|
262
|
+
const {
|
|
263
|
+
query,
|
|
264
|
+
authorId,
|
|
265
|
+
tags,
|
|
266
|
+
status = 'published',
|
|
267
|
+
limit = 20,
|
|
268
|
+
offset = 0,
|
|
269
|
+
highlight = false,
|
|
270
|
+
} = options;
|
|
271
|
+
|
|
272
|
+
if (!query || query.trim().length < 2) {
|
|
273
|
+
return { results: [], total: 0 };
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
const params: unknown[] = [query, status, limit, offset];
|
|
277
|
+
let paramIndex = 5;
|
|
278
|
+
|
|
279
|
+
const authorFilter = authorId
|
|
280
|
+
? `AND c.author_id = $${paramIndex++}`
|
|
281
|
+
: '';
|
|
282
|
+
if (authorId) params.push(authorId);
|
|
283
|
+
|
|
284
|
+
const tagsFilter = tags && tags.length > 0
|
|
285
|
+
? `AND c.tags && $${paramIndex++}::text[]`
|
|
286
|
+
: '';
|
|
287
|
+
if (tags && tags.length > 0) params.push(tags);
|
|
288
|
+
|
|
289
|
+
const headlineSelect = highlight
|
|
290
|
+
? `, ts_headline('english', c.body, query,
|
|
291
|
+
'MaxWords=40, MinWords=10, MaxFragments=2, FragmentDelimiter='' ... '''
|
|
292
|
+
) AS headline`
|
|
293
|
+
: '';
|
|
294
|
+
|
|
295
|
+
const sql = `
|
|
296
|
+
SELECT
|
|
297
|
+
c.id,
|
|
298
|
+
c.title,
|
|
299
|
+
c.excerpt,
|
|
300
|
+
c.tags,
|
|
301
|
+
c.published_at,
|
|
302
|
+
u.name AS author_name,
|
|
303
|
+
ts_rank(c.search_vector, query) AS rank
|
|
304
|
+
${headlineSelect},
|
|
305
|
+
COUNT(*) OVER() AS total_count
|
|
306
|
+
FROM content c
|
|
307
|
+
JOIN users u ON u.id = c.author_id,
|
|
308
|
+
websearch_to_tsquery('english', $1) AS query
|
|
309
|
+
WHERE
|
|
310
|
+
c.status = $2
|
|
311
|
+
AND c.search_vector @@ query
|
|
312
|
+
${authorFilter}
|
|
313
|
+
${tagsFilter}
|
|
314
|
+
ORDER BY rank DESC, c.published_at DESC NULLS LAST
|
|
315
|
+
LIMIT $3 OFFSET $4
|
|
316
|
+
`;
|
|
317
|
+
|
|
318
|
+
const { rows } = await db.query(sql, params);
|
|
319
|
+
|
|
320
|
+
const total = rows.length > 0 ? parseInt(rows[0].total_count, 10) : 0;
|
|
321
|
+
const results = rows.map(({ total_count, ...rest }) => rest);
|
|
322
|
+
|
|
323
|
+
return { results, total };
|
|
324
|
+
}
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
**Express route using the helper:**
|
|
328
|
+
|
|
329
|
+
```typescript
|
|
330
|
+
// routes/content.ts
|
|
331
|
+
router.get('/content/search', async (req, res) => {
|
|
332
|
+
const { q, author, tags, page = '1', limit = '20' } = req.query as Record<string, string>;
|
|
333
|
+
|
|
334
|
+
if (!q) return res.status(400).json({ error: 'q parameter required' });
|
|
335
|
+
|
|
336
|
+
const pageNum = Math.max(1, parseInt(page, 10));
|
|
337
|
+
const limitNum = Math.min(100, Math.max(1, parseInt(limit, 10)));
|
|
338
|
+
|
|
339
|
+
try {
|
|
340
|
+
const { results, total } = await searchContent(db, {
|
|
341
|
+
query: q,
|
|
342
|
+
authorId: author,
|
|
343
|
+
tags: tags ? tags.split(',') : undefined,
|
|
344
|
+
limit: limitNum,
|
|
345
|
+
offset: (pageNum - 1) * limitNum,
|
|
346
|
+
highlight: true,
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
res.json({
|
|
350
|
+
results,
|
|
351
|
+
pagination: {
|
|
352
|
+
total,
|
|
353
|
+
page: pageNum,
|
|
354
|
+
limit: limitNum,
|
|
355
|
+
pages: Math.ceil(total / limitNum),
|
|
356
|
+
},
|
|
357
|
+
});
|
|
358
|
+
} catch (err) {
|
|
359
|
+
console.error('Search error:', err);
|
|
360
|
+
res.status(500).json({ error: 'Search failed' });
|
|
361
|
+
}
|
|
362
|
+
});
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
---
|
|
366
|
+
|
|
367
|
+
## Hybrid: FTS Relevance + Recency Boost
|
|
368
|
+
|
|
369
|
+
Pure `ts_rank` ignores recency. For content platforms, blend rank with freshness:
|
|
370
|
+
|
|
371
|
+
```sql
|
|
372
|
+
SELECT
|
|
373
|
+
id,
|
|
374
|
+
title,
|
|
375
|
+
published_at,
|
|
376
|
+
ts_rank(search_vector, query) AS text_rank,
|
|
377
|
+
-- Recency score: 1.0 for today, decays exponentially
|
|
378
|
+
EXP(-EXTRACT(EPOCH FROM (NOW() - published_at)) / (86400 * 30)) AS recency_score,
|
|
379
|
+
-- Blended score: 70% text relevance, 30% recency
|
|
380
|
+
(0.7 * ts_rank(search_vector, query) +
|
|
381
|
+
0.3 * EXP(-EXTRACT(EPOCH FROM (NOW() - published_at)) / (86400 * 30))
|
|
382
|
+
) AS blended_score
|
|
383
|
+
FROM content,
|
|
384
|
+
websearch_to_tsquery('english', $1) AS query
|
|
385
|
+
WHERE status = 'published'
|
|
386
|
+
AND search_vector @@ query
|
|
387
|
+
ORDER BY blended_score DESC
|
|
388
|
+
LIMIT 20;
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
Tune the `86400 * 30` (30-day half-life) to match your freshness requirements.
|
|
392
|
+
|
|
393
|
+
---
|
|
394
|
+
|
|
395
|
+
## Pagination with Search
|
|
396
|
+
|
|
397
|
+
Never use `OFFSET` for deep pagination on large datasets — it degrades linearly. Use cursor-based pagination after the first page:
|
|
398
|
+
|
|
399
|
+
```sql
|
|
400
|
+
-- Page 1 (always):
|
|
401
|
+
SELECT id, title, ts_rank(search_vector, query) AS rank, published_at
|
|
402
|
+
FROM content, websearch_to_tsquery('english', $1) AS query
|
|
403
|
+
WHERE status = 'published' AND search_vector @@ query
|
|
404
|
+
ORDER BY rank DESC, id DESC -- id as tiebreaker for stable cursor
|
|
405
|
+
LIMIT 20;
|
|
406
|
+
|
|
407
|
+
-- Subsequent pages (cursor = { rank, id } from last item):
|
|
408
|
+
SELECT id, title, ts_rank(search_vector, query) AS rank, published_at
|
|
409
|
+
FROM content, websearch_to_tsquery('english', $1) AS query
|
|
410
|
+
WHERE status = 'published'
|
|
411
|
+
AND search_vector @@ query
|
|
412
|
+
AND (ts_rank(search_vector, query), id) < ($2, $3) -- cursor
|
|
413
|
+
ORDER BY rank DESC, id DESC
|
|
414
|
+
LIMIT 20;
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
---
|
|
418
|
+
|
|
419
|
+
## Performance Notes
|
|
420
|
+
|
|
421
|
+
| Scenario | Performance |
|
|
422
|
+
|----------|-------------|
|
|
423
|
+
| 10K rows, no index | ~50ms |
|
|
424
|
+
| 100K rows, GIN index | ~5-15ms |
|
|
425
|
+
| 1M rows, GIN index | ~20-80ms |
|
|
426
|
+
| 10M rows, GIN index | ~200-500ms (consider partitioning or external search) |
|
|
427
|
+
|
|
428
|
+
**Index maintenance:** GIN indexes are slower to update than B-tree. On write-heavy tables (>1K updates/sec), consider `fastupdate = off` or a separate search indexing worker.
|
|
429
|
+
|
|
430
|
+
```sql
|
|
431
|
+
-- Disable fastupdate if you see GIN pending list slowdowns
|
|
432
|
+
CREATE INDEX idx_content_search_vector ON content USING GIN(search_vector)
|
|
433
|
+
WITH (fastupdate = off);
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
---
|
|
437
|
+
|
|
438
|
+
## FTS vs External Search Engine Decision Guide
|
|
439
|
+
|
|
440
|
+
| Need | PG FTS | Typesense | Elasticsearch |
|
|
441
|
+
|------|--------|-----------|---------------|
|
|
442
|
+
| < 1M docs | Yes | Overkill | Overkill |
|
|
443
|
+
| 1M–10M docs | Maybe | Yes | Yes |
|
|
444
|
+
| Typo tolerance (fuzzy) | No | Yes | Yes |
|
|
445
|
+
| Synonym expansion | Limited | Yes | Yes |
|
|
446
|
+
| Faceted filters | No | Yes | Yes |
|
|
447
|
+
| ML re-ranking | No | Yes | Yes |
|
|
448
|
+
| Zero extra infra | Yes | No | No |
|
|
449
|
+
| Already in PG stack | Yes | No | No |
|
|
450
|
+
| Real-time updates | Yes | Yes | Slower |
|
|
451
|
+
|
|
452
|
+
**Decision rule:** Start with PG FTS. Add Typesense when you hit one of: typo tolerance needed, faceted search UI, >2M documents with sub-50ms P95 requirement.
|
|
453
|
+
|
|
454
|
+
---
|
|
455
|
+
|
|
456
|
+
## Migrations
|
|
457
|
+
|
|
458
|
+
```sql
|
|
459
|
+
-- Migration: add FTS to existing content table
|
|
460
|
+
BEGIN;
|
|
461
|
+
|
|
462
|
+
-- Add the search vector column if it doesn't exist
|
|
463
|
+
DO $$
|
|
464
|
+
BEGIN
|
|
465
|
+
IF NOT EXISTS (
|
|
466
|
+
SELECT 1 FROM information_schema.columns
|
|
467
|
+
WHERE table_name = 'content' AND column_name = 'search_vector'
|
|
468
|
+
) THEN
|
|
469
|
+
ALTER TABLE content ADD COLUMN search_vector TSVECTOR
|
|
470
|
+
GENERATED ALWAYS AS (
|
|
471
|
+
setweight(to_tsvector('english', coalesce(title, '')), 'A') ||
|
|
472
|
+
setweight(to_tsvector('english', coalesce(excerpt, '')), 'B') ||
|
|
473
|
+
setweight(to_tsvector('english', coalesce(body, '')), 'C')
|
|
474
|
+
) STORED;
|
|
475
|
+
END IF;
|
|
476
|
+
END $$;
|
|
477
|
+
|
|
478
|
+
-- Create GIN index (CONCURRENTLY to avoid locking production)
|
|
479
|
+
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_content_search_vector
|
|
480
|
+
ON content USING GIN(search_vector);
|
|
481
|
+
|
|
482
|
+
COMMIT;
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
---
|
|
486
|
+
|
|
487
|
+
## Common Gotchas
|
|
488
|
+
|
|
489
|
+
1. **`to_tsquery` crashes on bad input** — user-typed queries with unmatched quotes or special chars will throw. Always use `websearch_to_tsquery` for user input.
|
|
490
|
+
2. **Stop words are stripped** — "the", "is", "in" are ignored. Searching for "the" returns nothing. Expected behavior.
|
|
491
|
+
3. **Language matters** — use `'english'` consistently. Mixing `'simple'` and `'english'` in the same column causes index mismatches.
|
|
492
|
+
4. **`ts_headline` on full body is slow** — run it only on the final paginated result, never in a subquery or CTE that returns all rows.
|
|
493
|
+
5. **Generated columns can't reference other generated columns** — if you need to combine multiple generated vectors, use a trigger instead.
|
|
494
|
+
6. **Array tags need special handling** — `array_to_string(tags, ' ')` before `to_tsvector`. Don't pass arrays directly.
|