@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,732 @@
|
|
|
1
|
+
# PostgreSQL UUID Document Upload with RAG Dual-Scope Search
|
|
2
|
+
|
|
3
|
+
## The Problem
|
|
4
|
+
|
|
5
|
+
When implementing a document RAG (Retrieval-Augmented Generation) system with personal and shared libraries, three critical issues emerged:
|
|
6
|
+
|
|
7
|
+
### Issue 1: Prisma UUID Validation Failures
|
|
8
|
+
```
|
|
9
|
+
Invalid 'prisma.knowledgeSource.create()' invocation
|
|
10
|
+
Error creating UUID, invalid character: expected an optional prefix of
|
|
11
|
+
'urn:uuid:' followed by [0-9a-fA-F-], found '' at 1
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
**Why It Was Hard:**
|
|
15
|
+
- PostgreSQL `@db.Uuid` type requires actual UUID format (`xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`)
|
|
16
|
+
- JavaScript's `||` operator doesn't convert empty strings to `null`
|
|
17
|
+
- String IDs like `'user-personal-library-001'` appear valid in code but fail at database layer
|
|
18
|
+
- Error message doesn't clearly indicate the source of the problem
|
|
19
|
+
|
|
20
|
+
### Issue 2: Dual Upload Systems Storing Data in Different Tables
|
|
21
|
+
```
|
|
22
|
+
DocumentUpload.tsx → /api/documents/upload → workspace_Document table (no userId)
|
|
23
|
+
Settings.tsx → /api/knowledge/sources → knowledge_sources table (has userId)
|
|
24
|
+
RAG searches → knowledge_sources table only
|
|
25
|
+
Result: Documents uploaded via DocumentsPage invisible to RAG
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**Why It Was Hard:**
|
|
29
|
+
- Two separate upload endpoints created during different development phases
|
|
30
|
+
- No clear indication that tables were misaligned
|
|
31
|
+
- Upload success didn't mean RAG searchability
|
|
32
|
+
- Required end-to-end testing to discover
|
|
33
|
+
|
|
34
|
+
### Issue 3: RAG Not Finding Personal Library Documents
|
|
35
|
+
```
|
|
36
|
+
User: "search my library"
|
|
37
|
+
AI: "No documents detected"
|
|
38
|
+
Database: 6 documents with status='READY' and userId='0584cd60-...'
|
|
39
|
+
MainLayout: userId='shared-corpus' (converts to null)
|
|
40
|
+
Result: userId mismatch prevents RAG from finding documents
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**Why It Was Hard:**
|
|
44
|
+
- Original implementation: Bible-only corpus (userId=null)
|
|
45
|
+
- New implementation: Personal library support (userId=UUID)
|
|
46
|
+
- No admin toggle to control RAG scope
|
|
47
|
+
- Required architectural decision on search strategy
|
|
48
|
+
|
|
49
|
+
### Impact
|
|
50
|
+
|
|
51
|
+
- **Personal library uploads failed completely** - Prisma validation errors
|
|
52
|
+
- **Uploaded documents invisible to AI** - Wrong table, no RAG integration
|
|
53
|
+
- **User confusion and frustration** - Upload succeeds but search fails
|
|
54
|
+
- **Dual systems causing maintenance burden** - Two endpoints, two tables
|
|
55
|
+
- **No flexibility for admins** - Bible-only vs personal library hard-coded
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## The Solution
|
|
60
|
+
|
|
61
|
+
### Root Cause Analysis
|
|
62
|
+
|
|
63
|
+
**Problem 1: UUID Format**
|
|
64
|
+
- Using string IDs instead of valid UUID format for PostgreSQL `@db.Uuid` columns
|
|
65
|
+
- Empty string userId values not sanitized to `null`
|
|
66
|
+
|
|
67
|
+
**Problem 2: Table Misalignment**
|
|
68
|
+
- OLD system (Phase 9.0): `/api/documents/upload` → `workspace_Document` (no userId)
|
|
69
|
+
- NEW system (Phase 9.1): `/api/knowledge/sources` → `knowledge_sources` (has userId)
|
|
70
|
+
- RAG only searches `knowledge_sources` table
|
|
71
|
+
|
|
72
|
+
**Problem 3: Architecture Evolution**
|
|
73
|
+
- Original: Bible corpus only (userId=null)
|
|
74
|
+
- Current: Bible + personal library (different userId values)
|
|
75
|
+
- Missing: Admin control for RAG search scope
|
|
76
|
+
|
|
77
|
+
### Fix #1: UUID Validation and Sanitization
|
|
78
|
+
|
|
79
|
+
**Backend (server/routes/knowledge.ts):**
|
|
80
|
+
```typescript
|
|
81
|
+
// POST /api/knowledge/sources
|
|
82
|
+
router.post('/sources', upload.single('file'), async (req, res) => {
|
|
83
|
+
const { title, userId } = req.body;
|
|
84
|
+
|
|
85
|
+
// CRITICAL: Sanitize userId - convert empty strings to null
|
|
86
|
+
const sanitizedUserId = userId?.trim() || null;
|
|
87
|
+
|
|
88
|
+
const source = await prisma.knowledgeSource.create({
|
|
89
|
+
data: {
|
|
90
|
+
userId: sanitizedUserId, // NULL = shared corpus, UUID = personal library
|
|
91
|
+
title: title || req.file.originalname,
|
|
92
|
+
fileType: path.extname(req.file.originalname).substring(1),
|
|
93
|
+
filePath: req.file.path,
|
|
94
|
+
fileSize: req.file.size,
|
|
95
|
+
status: 'PENDING',
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
res.json(source);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
// POST /api/knowledge/sources/youtube
|
|
103
|
+
router.post('/sources/youtube', async (req, res) => {
|
|
104
|
+
const { url, title, userId } = req.body;
|
|
105
|
+
|
|
106
|
+
// CRITICAL: Sanitize userId here too
|
|
107
|
+
const sanitizedUserId = userId?.trim() || null;
|
|
108
|
+
|
|
109
|
+
const source = await prisma.knowledgeSource.create({
|
|
110
|
+
data: {
|
|
111
|
+
userId: sanitizedUserId,
|
|
112
|
+
title,
|
|
113
|
+
sourceUrl: url,
|
|
114
|
+
fileType: 'youtube',
|
|
115
|
+
status: 'PENDING',
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
res.json(source);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
// POST /api/knowledge/sources/text
|
|
123
|
+
router.post('/sources/text', async (req, res) => {
|
|
124
|
+
const { text, title, userId } = req.body;
|
|
125
|
+
|
|
126
|
+
// CRITICAL: Sanitize userId here too
|
|
127
|
+
const sanitizedUserId = userId?.trim() || null;
|
|
128
|
+
|
|
129
|
+
const source = await prisma.knowledgeSource.create({
|
|
130
|
+
data: {
|
|
131
|
+
userId: sanitizedUserId,
|
|
132
|
+
title,
|
|
133
|
+
extractedText: text,
|
|
134
|
+
fileType: 'text',
|
|
135
|
+
status: 'PENDING',
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
res.json(source);
|
|
140
|
+
});
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
**Frontend - Use Valid UUID:**
|
|
144
|
+
```typescript
|
|
145
|
+
// WRONG: String ID that looks valid but isn't UUID
|
|
146
|
+
const PERSONAL_USER_ID = 'user-personal-library-001'; // ❌ Fails PostgreSQL @db.Uuid
|
|
147
|
+
|
|
148
|
+
// RIGHT: Actual UUID format
|
|
149
|
+
const PERSONAL_USER_ID = '0584cd60-2eb8-424c-a789-e68340a9161c'; // ✅ Works
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Fix #2: Migrate to Unified Upload System
|
|
153
|
+
|
|
154
|
+
**DocumentUpload.tsx Migration:**
|
|
155
|
+
```typescript
|
|
156
|
+
interface DocumentUploadProps {
|
|
157
|
+
onDocumentUploaded?: () => void;
|
|
158
|
+
userId?: string | null; // UUID for personal, null/'shared-corpus' for shared
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export function DocumentUpload({ onDocumentUploaded, userId }: DocumentUploadProps) {
|
|
162
|
+
const uploadFile = (file: File) => {
|
|
163
|
+
const formData = new FormData();
|
|
164
|
+
formData.append('file', file);
|
|
165
|
+
formData.append('title', file.name);
|
|
166
|
+
|
|
167
|
+
// Add userId if personal library
|
|
168
|
+
if (userId && userId !== 'shared-corpus') {
|
|
169
|
+
formData.append('userId', userId);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
const xhr = new XMLHttpRequest();
|
|
173
|
+
|
|
174
|
+
// CHANGED: Use knowledge API instead of old documents API
|
|
175
|
+
xhr.open('POST', '/api/knowledge/sources'); // ✅ Unified endpoint
|
|
176
|
+
|
|
177
|
+
xhr.onload = () => {
|
|
178
|
+
if (xhr.status === 200) {
|
|
179
|
+
const data = JSON.parse(xhr.responseText);
|
|
180
|
+
pollStatus(data.id); // Poll for READY status
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
xhr.send(formData);
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
const pollStatus = async (documentId: string) => {
|
|
188
|
+
const interval = setInterval(async () => {
|
|
189
|
+
// CHANGED: Poll knowledge API for status
|
|
190
|
+
const response = await fetch(`/api/knowledge/sources/${documentId}`);
|
|
191
|
+
const data = await response.json();
|
|
192
|
+
|
|
193
|
+
// CHANGED: Check for 'READY' instead of 'vectorized'
|
|
194
|
+
if (data.status === 'READY') {
|
|
195
|
+
clearInterval(interval);
|
|
196
|
+
if (onDocumentUploaded) {
|
|
197
|
+
onDocumentUploaded();
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}, 3000);
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
**DocumentsPage.tsx - Library Selection:**
|
|
206
|
+
```typescript
|
|
207
|
+
const PERSONAL_USER_ID = '0584cd60-2eb8-424c-a789-e68340a9161c';
|
|
208
|
+
|
|
209
|
+
export const DocumentsPage: React.FC = () => {
|
|
210
|
+
const [uploadToPersonal, setUploadToPersonal] = useState(true);
|
|
211
|
+
|
|
212
|
+
return (
|
|
213
|
+
<div>
|
|
214
|
+
{/* Library selection UI */}
|
|
215
|
+
<div className="library-toggle">
|
|
216
|
+
<label>
|
|
217
|
+
<input
|
|
218
|
+
type="radio"
|
|
219
|
+
checked={uploadToPersonal}
|
|
220
|
+
onChange={() => setUploadToPersonal(true)}
|
|
221
|
+
/>
|
|
222
|
+
My Personal Library
|
|
223
|
+
</label>
|
|
224
|
+
<label>
|
|
225
|
+
<input
|
|
226
|
+
type="radio"
|
|
227
|
+
checked={!uploadToPersonal}
|
|
228
|
+
onChange={() => setUploadToPersonal(false)}
|
|
229
|
+
/>
|
|
230
|
+
Shared Library
|
|
231
|
+
</label>
|
|
232
|
+
</div>
|
|
233
|
+
|
|
234
|
+
<DocumentUpload
|
|
235
|
+
userId={uploadToPersonal ? PERSONAL_USER_ID : null}
|
|
236
|
+
onDocumentUploaded={handleRefresh}
|
|
237
|
+
/>
|
|
238
|
+
</div>
|
|
239
|
+
);
|
|
240
|
+
};
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
**Settings.tsx - Fixed DEFAULT_USER_ID:**
|
|
244
|
+
```typescript
|
|
245
|
+
// WRONG: null means shared corpus, not personal library
|
|
246
|
+
const DEFAULT_USER_ID = null; // ❌
|
|
247
|
+
|
|
248
|
+
// RIGHT: Valid UUID for personal library
|
|
249
|
+
const DEFAULT_USER_ID = '0584cd60-2eb8-424c-a789-e68340a9161c'; // ✅
|
|
250
|
+
|
|
251
|
+
const { documents, uploadFile } = useDocuments(DEFAULT_USER_ID);
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### Fix #3: RAG Dual-Scope Search with Admin Toggle
|
|
255
|
+
|
|
256
|
+
**Frontend - RAG Toggle Component:**
|
|
257
|
+
```typescript
|
|
258
|
+
// frontend/src/components/Settings/RAGLibraryToggle.tsx
|
|
259
|
+
export function RAGLibraryToggle() {
|
|
260
|
+
const [includePersonal, setIncludePersonal] = useState(() => {
|
|
261
|
+
const stored = localStorage.getItem('ragIncludePersonalLibrary');
|
|
262
|
+
return stored === 'true';
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
const handleToggle = (checked: boolean) => {
|
|
266
|
+
setIncludePersonal(checked);
|
|
267
|
+
localStorage.setItem('ragIncludePersonalLibrary', checked.toString());
|
|
268
|
+
|
|
269
|
+
// Notify MainLayout of change
|
|
270
|
+
window.dispatchEvent(new Event('storage'));
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
return (
|
|
274
|
+
<div>
|
|
275
|
+
<label>
|
|
276
|
+
<input
|
|
277
|
+
type="checkbox"
|
|
278
|
+
checked={includePersonal}
|
|
279
|
+
onChange={(e) => handleToggle(e.target.checked)}
|
|
280
|
+
/>
|
|
281
|
+
Include Personal Library in RAG Search
|
|
282
|
+
</label>
|
|
283
|
+
|
|
284
|
+
{includePersonal && (
|
|
285
|
+
<p className="help-text">
|
|
286
|
+
✓ Active: Searches 60% personal library + 40% Bible corpus
|
|
287
|
+
</p>
|
|
288
|
+
)}
|
|
289
|
+
</div>
|
|
290
|
+
);
|
|
291
|
+
}
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
**Frontend - MainLayout.tsx:**
|
|
295
|
+
```typescript
|
|
296
|
+
const DEFAULT_USER_ID = 'shared-corpus'; // Bible only
|
|
297
|
+
const PERSONAL_USER_ID = '0584cd60-2eb8-424c-a789-e68340a9161c'; // Personal library
|
|
298
|
+
|
|
299
|
+
export function MainLayout() {
|
|
300
|
+
const [userId, setUserId] = useState(() => {
|
|
301
|
+
const includePersonal = localStorage.getItem('ragIncludePersonalLibrary') === 'true';
|
|
302
|
+
return includePersonal ? PERSONAL_USER_ID : DEFAULT_USER_ID;
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
useEffect(() => {
|
|
306
|
+
const handleStorageChange = () => {
|
|
307
|
+
const includePersonal = localStorage.getItem('ragIncludePersonalLibrary') === 'true';
|
|
308
|
+
setUserId(includePersonal ? PERSONAL_USER_ID : DEFAULT_USER_ID);
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
window.addEventListener('storage', handleStorageChange);
|
|
312
|
+
return () => window.removeEventListener('storage', handleStorageChange);
|
|
313
|
+
}, []);
|
|
314
|
+
|
|
315
|
+
return (
|
|
316
|
+
<ChatInterface
|
|
317
|
+
userId={userId} // Dynamically set based on toggle
|
|
318
|
+
conversationId={selectedConversationId}
|
|
319
|
+
/>
|
|
320
|
+
);
|
|
321
|
+
}
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
**Backend - Dual-Scope RAG Search:**
|
|
325
|
+
```typescript
|
|
326
|
+
// server/services/rag-query.service.ts
|
|
327
|
+
async retrieveContext(query: string, userId: string | null, limit: number = 5): Promise<RAGContext[]> {
|
|
328
|
+
const embedding = await this.embedQuery(query);
|
|
329
|
+
const embeddingString = `[${embedding.join(',')}]`;
|
|
330
|
+
|
|
331
|
+
if (!userId) {
|
|
332
|
+
// Search ONLY shared corpus (Bible documents)
|
|
333
|
+
const results = await this.prisma.$queryRaw<RAGContext[]>`
|
|
334
|
+
SELECT
|
|
335
|
+
c.id,
|
|
336
|
+
c.content,
|
|
337
|
+
c.embedding <=> ${embeddingString}::vector as distance,
|
|
338
|
+
1 - (c.embedding <=> ${embeddingString}::vector) as similarity,
|
|
339
|
+
s.title,
|
|
340
|
+
s.file_type as "fileType"
|
|
341
|
+
FROM source_chunks c
|
|
342
|
+
JOIN knowledge_sources s ON c.source_id = s.id
|
|
343
|
+
WHERE s.status = 'READY' AND s.user_id IS NULL
|
|
344
|
+
ORDER BY c.embedding <=> ${embeddingString}::vector
|
|
345
|
+
LIMIT ${limit}
|
|
346
|
+
`;
|
|
347
|
+
return results;
|
|
348
|
+
} else {
|
|
349
|
+
// Search BOTH personal (60%) + shared (40%)
|
|
350
|
+
const personalLimit = Math.ceil(limit * 0.6); // 60% from personal
|
|
351
|
+
const sharedLimit = Math.floor(limit * 0.4); // 40% from shared
|
|
352
|
+
|
|
353
|
+
// Query personal documents
|
|
354
|
+
const personalResults = await this.prisma.$queryRaw<RAGContext[]>`
|
|
355
|
+
SELECT /* ... same fields ... */
|
|
356
|
+
FROM source_chunks c
|
|
357
|
+
JOIN knowledge_sources s ON c.source_id = s.id
|
|
358
|
+
WHERE s.status = 'READY' AND s.user_id = ${userId}::uuid
|
|
359
|
+
ORDER BY c.embedding <=> ${embeddingString}::vector
|
|
360
|
+
LIMIT ${personalLimit}
|
|
361
|
+
`;
|
|
362
|
+
|
|
363
|
+
// Query shared documents (Bible)
|
|
364
|
+
const sharedResults = await this.prisma.$queryRaw<RAGContext[]>`
|
|
365
|
+
SELECT /* ... same fields ... */
|
|
366
|
+
FROM source_chunks c
|
|
367
|
+
JOIN knowledge_sources s ON c.source_id = s.id
|
|
368
|
+
WHERE s.status = 'READY' AND s.user_id IS NULL
|
|
369
|
+
ORDER BY c.embedding <=> ${embeddingString}::vector
|
|
370
|
+
LIMIT ${sharedLimit}
|
|
371
|
+
`;
|
|
372
|
+
|
|
373
|
+
// Combine and re-rank by similarity
|
|
374
|
+
const combined = [...personalResults, ...sharedResults]
|
|
375
|
+
.sort((a, b) => b.similarity - a.similarity)
|
|
376
|
+
.slice(0, limit);
|
|
377
|
+
|
|
378
|
+
return combined;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
---
|
|
384
|
+
|
|
385
|
+
## Testing the Fix
|
|
386
|
+
|
|
387
|
+
### Test #1: Personal Library Upload (DocumentsPage)
|
|
388
|
+
|
|
389
|
+
**Steps:**
|
|
390
|
+
1. Navigate to Documents page
|
|
391
|
+
2. Select "My Personal Library" radio button
|
|
392
|
+
3. Upload a PDF document
|
|
393
|
+
4. Wait for status to show "ready"
|
|
394
|
+
5. Check database
|
|
395
|
+
|
|
396
|
+
**Expected Results:**
|
|
397
|
+
```sql
|
|
398
|
+
SELECT id, user_id, title, status FROM knowledge_sources
|
|
399
|
+
WHERE user_id = '0584cd60-2eb8-424c-a789-e68340a9161c'
|
|
400
|
+
ORDER BY created_at DESC LIMIT 1;
|
|
401
|
+
|
|
402
|
+
-- Should return:
|
|
403
|
+
-- id: uuid
|
|
404
|
+
-- user_id: 0584cd60-2eb8-424c-a789-e68340a9161c
|
|
405
|
+
-- title: YourDocument.pdf
|
|
406
|
+
-- status: READY
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
### Test #2: Settings "My Library" Upload
|
|
410
|
+
|
|
411
|
+
**Steps:**
|
|
412
|
+
1. Navigate to Settings → My Library
|
|
413
|
+
2. Upload a document
|
|
414
|
+
3. Wait for "READY" status
|
|
415
|
+
4. Check database
|
|
416
|
+
|
|
417
|
+
**Expected Results:**
|
|
418
|
+
Same as Test #1 - should appear with personal userId
|
|
419
|
+
|
|
420
|
+
### Test #3: Shared Library Upload
|
|
421
|
+
|
|
422
|
+
**Steps:**
|
|
423
|
+
1. Navigate to Documents page
|
|
424
|
+
2. Select "Shared Library" radio button
|
|
425
|
+
3. Upload a document
|
|
426
|
+
4. Check database
|
|
427
|
+
|
|
428
|
+
**Expected Results:**
|
|
429
|
+
```sql
|
|
430
|
+
SELECT id, user_id, title, status FROM knowledge_sources
|
|
431
|
+
WHERE user_id IS NULL
|
|
432
|
+
ORDER BY created_at DESC LIMIT 1;
|
|
433
|
+
|
|
434
|
+
-- Should return:
|
|
435
|
+
-- id: uuid
|
|
436
|
+
-- user_id: NULL
|
|
437
|
+
-- title: SharedDocument.pdf
|
|
438
|
+
-- status: READY
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
### Test #4: RAG Search - Bible Only (Toggle OFF)
|
|
442
|
+
|
|
443
|
+
**Steps:**
|
|
444
|
+
1. Settings → Turn OFF "Include Personal Library"
|
|
445
|
+
2. Go to Chat page
|
|
446
|
+
3. Query: "What does Genesis say about creation?"
|
|
447
|
+
|
|
448
|
+
**Expected Results:**
|
|
449
|
+
- RAG searches with userId=null (shared corpus only)
|
|
450
|
+
- Response includes Bible verses
|
|
451
|
+
- No personal library documents cited
|
|
452
|
+
|
|
453
|
+
### Test #5: RAG Search - Personal + Bible (Toggle ON)
|
|
454
|
+
|
|
455
|
+
**Steps:**
|
|
456
|
+
1. Settings → Turn ON "Include Personal Library"
|
|
457
|
+
2. Upload a document about "prayer" to personal library
|
|
458
|
+
3. Query: "search my library for prayer"
|
|
459
|
+
|
|
460
|
+
**Expected Results:**
|
|
461
|
+
- RAG searches with userId=UUID (dual-scope)
|
|
462
|
+
- Response includes 60% from personal library
|
|
463
|
+
- Response includes 40% from Bible corpus
|
|
464
|
+
- Citations reference both sources
|
|
465
|
+
|
|
466
|
+
### Test #6: End-to-End Verification
|
|
467
|
+
|
|
468
|
+
**Database Query:**
|
|
469
|
+
```sql
|
|
470
|
+
-- Check document distribution
|
|
471
|
+
SELECT
|
|
472
|
+
CASE
|
|
473
|
+
WHEN user_id IS NULL THEN 'Shared (Bible)'
|
|
474
|
+
ELSE 'Personal Library'
|
|
475
|
+
END as library_type,
|
|
476
|
+
COUNT(*) as count,
|
|
477
|
+
SUM(CASE WHEN status = 'READY' THEN 1 ELSE 0 END) as ready_count
|
|
478
|
+
FROM knowledge_sources
|
|
479
|
+
GROUP BY library_type;
|
|
480
|
+
|
|
481
|
+
-- Check chunk creation
|
|
482
|
+
SELECT COUNT(*) as chunks, s.title, s.user_id
|
|
483
|
+
FROM source_chunks c
|
|
484
|
+
JOIN knowledge_sources s ON c.source_id = s.id
|
|
485
|
+
GROUP BY s.title, s.user_id
|
|
486
|
+
ORDER BY s.created_at DESC
|
|
487
|
+
LIMIT 10;
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
---
|
|
491
|
+
|
|
492
|
+
## Prevention
|
|
493
|
+
|
|
494
|
+
### 1. Always Use Valid UUIDs for PostgreSQL `@db.Uuid` Columns
|
|
495
|
+
|
|
496
|
+
```typescript
|
|
497
|
+
// ❌ DON'T: Use string IDs that look valid
|
|
498
|
+
const userId = 'user-personal-library-001';
|
|
499
|
+
|
|
500
|
+
// ✅ DO: Generate or use actual UUIDs
|
|
501
|
+
import { randomUUID } from 'crypto';
|
|
502
|
+
const userId = randomUUID(); // '0584cd60-2eb8-424c-a789-e68340a9161c'
|
|
503
|
+
|
|
504
|
+
// ✅ DO: Define constants with valid UUIDs
|
|
505
|
+
const PERSONAL_USER_ID = '0584cd60-2eb8-424c-a789-e68340a9161c';
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
### 2. Sanitize userId Input in All Upload Endpoints
|
|
509
|
+
|
|
510
|
+
```typescript
|
|
511
|
+
// Apply this pattern to EVERY endpoint that accepts userId
|
|
512
|
+
const sanitizedUserId = userId?.trim() || null;
|
|
513
|
+
|
|
514
|
+
// Why: JavaScript's || doesn't convert empty strings to null
|
|
515
|
+
'' || 'fallback' // returns '' (still truthy for Prisma validation)
|
|
516
|
+
('' || null) // returns null ✓
|
|
517
|
+
```
|
|
518
|
+
|
|
519
|
+
### 3. Unify Upload Systems - Single Source of Truth
|
|
520
|
+
|
|
521
|
+
```typescript
|
|
522
|
+
// ❌ DON'T: Create multiple upload endpoints
|
|
523
|
+
/api/documents/upload → workspace_Document
|
|
524
|
+
/api/knowledge/sources → knowledge_sources
|
|
525
|
+
|
|
526
|
+
// ✅ DO: Use single endpoint for all uploads
|
|
527
|
+
/api/knowledge/sources → knowledge_sources (RAG-searchable)
|
|
528
|
+
|
|
529
|
+
// Then migrate data from old table if needed
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
### 4. Add Admin Toggles for Feature Scope
|
|
533
|
+
|
|
534
|
+
```typescript
|
|
535
|
+
// ✅ DO: Provide UI controls for admins
|
|
536
|
+
<RAGLibraryToggle /> // Controls search scope
|
|
537
|
+
|
|
538
|
+
// ✅ DO: Persist settings in localStorage
|
|
539
|
+
localStorage.setItem('ragIncludePersonalLibrary', 'true');
|
|
540
|
+
|
|
541
|
+
// ✅ DO: React to setting changes dynamically
|
|
542
|
+
window.addEventListener('storage', handleSettingChange);
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
### 5. Test End-to-End: Upload → Process → Search
|
|
546
|
+
|
|
547
|
+
```bash
|
|
548
|
+
# Don't just test upload success
|
|
549
|
+
# Test the FULL pipeline:
|
|
550
|
+
|
|
551
|
+
1. Upload document (check database)
|
|
552
|
+
2. Wait for processing (status = READY)
|
|
553
|
+
3. Verify chunks created (source_chunks table)
|
|
554
|
+
4. Test RAG search (query matches document)
|
|
555
|
+
5. Verify citations appear in response
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
---
|
|
559
|
+
|
|
560
|
+
## Related Patterns
|
|
561
|
+
|
|
562
|
+
- [POSTGRES_SQL_TEMPLATE_BINDING_ERROR.md](./POSTGRES_SQL_TEMPLATE_BINDING_ERROR.md) - SQL binding errors
|
|
563
|
+
- [ES_MODULE_SEED_SCRIPT_PATTERN.md](./ES_MODULE_SEED_SCRIPT_PATTERN.md) - Seed scripts
|
|
564
|
+
- [CONDITIONAL_SQL_MIGRATION_PATTERN.md](./CONDITIONAL_SQL_MIGRATION_PATTERN.md) - Migrations
|
|
565
|
+
- [../integrations/GEMINI_AI_RAG_PIPELINE_COMPLETE_GUIDE.md](../integrations/GEMINI_AI_RAG_PIPELINE_COMPLETE_GUIDE.md) - RAG implementation
|
|
566
|
+
|
|
567
|
+
---
|
|
568
|
+
|
|
569
|
+
## Common Mistakes to Avoid
|
|
570
|
+
|
|
571
|
+
### ❌ Mistake #1: Using String IDs for UUID Columns
|
|
572
|
+
```typescript
|
|
573
|
+
// This looks valid but FAILS at PostgreSQL
|
|
574
|
+
const userId = 'user-personal-library-001';
|
|
575
|
+
// Error: invalid character: expected [0-9a-fA-F-]
|
|
576
|
+
```
|
|
577
|
+
|
|
578
|
+
### ❌ Mistake #2: Not Sanitizing Empty Strings
|
|
579
|
+
```typescript
|
|
580
|
+
// Empty string passes truthy check but fails UUID validation
|
|
581
|
+
const userId = formData.get('userId'); // Could be ''
|
|
582
|
+
await prisma.create({ data: { userId } }); // FAILS if userId === ''
|
|
583
|
+
```
|
|
584
|
+
|
|
585
|
+
### ❌ Mistake #3: Variable Reuse with Null Mapping
|
|
586
|
+
```typescript
|
|
587
|
+
// DON'T reuse variable when null has different meanings
|
|
588
|
+
let userId = rawUserId === 'shared-corpus' ? null : rawUserId; // For RAG
|
|
589
|
+
// ... later ...
|
|
590
|
+
await prisma.create({ data: { userId } }); // FAILS - userId can't be null here
|
|
591
|
+
|
|
592
|
+
// DO separate variables for different purposes
|
|
593
|
+
const ragUserId = rawUserId === 'shared-corpus' ? null : rawUserId;
|
|
594
|
+
const conversationUserId = rawUserId || 'shared-corpus';
|
|
595
|
+
```
|
|
596
|
+
|
|
597
|
+
### ❌ Mistake #4: Testing Upload Without Testing Search
|
|
598
|
+
```typescript
|
|
599
|
+
// Upload succeeds → assume it works ✗
|
|
600
|
+
// Upload succeeds AND RAG finds it → confirmed ✓
|
|
601
|
+
```
|
|
602
|
+
|
|
603
|
+
### ❌ Mistake #5: Hard-Coding Feature Scope
|
|
604
|
+
```typescript
|
|
605
|
+
// DON'T hard-code Bible-only or personal-only
|
|
606
|
+
const userId = null; // Always Bible
|
|
607
|
+
|
|
608
|
+
// DO provide admin toggle
|
|
609
|
+
const userId = includePersonal ? PERSONAL_UUID : null;
|
|
610
|
+
```
|
|
611
|
+
|
|
612
|
+
---
|
|
613
|
+
|
|
614
|
+
## Resources
|
|
615
|
+
|
|
616
|
+
- [PostgreSQL UUID Type](https://www.postgresql.org/docs/current/datatype-uuid.html)
|
|
617
|
+
- [Prisma UUID Field](https://www.prisma.io/docs/reference/api-reference/prisma-schema-reference#uuid)
|
|
618
|
+
- [Node.js crypto.randomUUID()](https://nodejs.org/api/crypto.html#cryptorandomuuidoptions)
|
|
619
|
+
- [pgvector Documentation](https://github.com/pgvector/pgvector)
|
|
620
|
+
- [RAG System Architecture](https://www.pinecone.io/learn/retrieval-augmented-generation/)
|
|
621
|
+
|
|
622
|
+
---
|
|
623
|
+
|
|
624
|
+
## Time to Implement
|
|
625
|
+
|
|
626
|
+
**Initial Setup:**
|
|
627
|
+
- UUID generation and constants: **5 minutes**
|
|
628
|
+
- userId sanitization in endpoints: **15 minutes**
|
|
629
|
+
- DocumentUpload migration: **30 minutes**
|
|
630
|
+
- RAG toggle component: **20 minutes**
|
|
631
|
+
- Dual-scope search implementation: **45 minutes**
|
|
632
|
+
|
|
633
|
+
**Total: ~2 hours**
|
|
634
|
+
|
|
635
|
+
**Migration (if needed):**
|
|
636
|
+
- Old workspace_Document → knowledge_sources: **1 hour**
|
|
637
|
+
|
|
638
|
+
---
|
|
639
|
+
|
|
640
|
+
## Difficulty Level
|
|
641
|
+
|
|
642
|
+
⭐⭐⭐⭐ (4/5) - Very Hard
|
|
643
|
+
|
|
644
|
+
**Why Hard:**
|
|
645
|
+
- Silent failures (upload succeeds, RAG search fails)
|
|
646
|
+
- Multiple layers (frontend, backend, database)
|
|
647
|
+
- Architectural evolution (Bible-only → personal library)
|
|
648
|
+
- UUID format requirements not obvious from error messages
|
|
649
|
+
- Empty string vs null handling subtlety
|
|
650
|
+
|
|
651
|
+
**Why Worth It:**
|
|
652
|
+
- Enables personal knowledge base integration
|
|
653
|
+
- Flexible RAG scope control for admins
|
|
654
|
+
- Proper PostgreSQL UUID compliance
|
|
655
|
+
- Unified upload system for maintainability
|
|
656
|
+
- End-to-end searchability verified
|
|
657
|
+
|
|
658
|
+
---
|
|
659
|
+
|
|
660
|
+
## Database Schema Reference
|
|
661
|
+
|
|
662
|
+
```sql
|
|
663
|
+
-- knowledge_sources table (unified upload destination)
|
|
664
|
+
CREATE TABLE knowledge_sources (
|
|
665
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
666
|
+
user_id UUID, -- NULL = shared corpus (Bible), UUID = personal library
|
|
667
|
+
title TEXT NOT NULL,
|
|
668
|
+
file_type TEXT,
|
|
669
|
+
file_path TEXT,
|
|
670
|
+
source_url TEXT,
|
|
671
|
+
file_size INTEGER,
|
|
672
|
+
status TEXT DEFAULT 'PENDING', -- PENDING → PROCESSING → CHUNKING → EMBEDDING → READY | FAILED
|
|
673
|
+
processed_at TIMESTAMP,
|
|
674
|
+
error_message TEXT,
|
|
675
|
+
extracted_text TEXT,
|
|
676
|
+
created_at TIMESTAMP DEFAULT NOW(),
|
|
677
|
+
updated_at TIMESTAMP DEFAULT NOW()
|
|
678
|
+
);
|
|
679
|
+
|
|
680
|
+
-- source_chunks table (RAG search target)
|
|
681
|
+
CREATE TABLE source_chunks (
|
|
682
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
683
|
+
source_id UUID REFERENCES knowledge_sources(id) ON DELETE CASCADE,
|
|
684
|
+
content TEXT NOT NULL,
|
|
685
|
+
chunk_index INTEGER,
|
|
686
|
+
embedding vector(768), -- pgvector extension
|
|
687
|
+
created_at TIMESTAMP DEFAULT NOW()
|
|
688
|
+
);
|
|
689
|
+
|
|
690
|
+
-- Indexes for performance
|
|
691
|
+
CREATE INDEX idx_source_chunks_embedding ON source_chunks
|
|
692
|
+
USING ivfflat (embedding vector_cosine_ops);
|
|
693
|
+
|
|
694
|
+
CREATE INDEX idx_knowledge_sources_user_id ON knowledge_sources(user_id);
|
|
695
|
+
CREATE INDEX idx_knowledge_sources_status ON knowledge_sources(status);
|
|
696
|
+
```
|
|
697
|
+
|
|
698
|
+
---
|
|
699
|
+
|
|
700
|
+
## Author Notes
|
|
701
|
+
|
|
702
|
+
**What Made This Difficult:**
|
|
703
|
+
|
|
704
|
+
1. **Silent Failures** - Upload succeeded, but RAG search didn't work. No errors in console or logs. Required full end-to-end testing to discover.
|
|
705
|
+
|
|
706
|
+
2. **UUID Format Confusion** - String IDs like `'user-personal-library-001'` look valid in code, pass frontend validation, but fail at PostgreSQL layer with cryptic error messages.
|
|
707
|
+
|
|
708
|
+
3. **Empty String vs Null** - JavaScript's `||` operator doesn't convert empty strings to null. This caused Prisma UUID validation failures that were hard to trace.
|
|
709
|
+
|
|
710
|
+
4. **Architectural Evolution** - System started with Bible-only corpus (userId=null), then added personal library support. Old code assumed null, new code needed UUID. Migration path not obvious.
|
|
711
|
+
|
|
712
|
+
5. **Dual Upload Systems** - Two separate endpoints created during different phases stored data in different tables. RAG only searched one table, making documents invisible.
|
|
713
|
+
|
|
714
|
+
**Key Learnings:**
|
|
715
|
+
|
|
716
|
+
- **Always test end-to-end**: Upload → Processing → RAG Search → Citations
|
|
717
|
+
- **UUID validation happens at DB layer**, not in application code
|
|
718
|
+
- **Sanitize input at boundaries**: Convert empty strings to null before Prisma
|
|
719
|
+
- **Separate variables for different purposes**: Don't reuse when null has different meanings
|
|
720
|
+
- **Provide admin flexibility**: Toggles > hard-coded feature scope
|
|
721
|
+
|
|
722
|
+
**Time Saved for Next Developer:**
|
|
723
|
+
|
|
724
|
+
Without this skill: **3-5 hours** of debugging UUID errors, tracing table misalignment, and implementing RAG scope controls from scratch.
|
|
725
|
+
|
|
726
|
+
With this skill: **1-2 hours** following proven patterns with all gotchas documented.
|
|
727
|
+
|
|
728
|
+
---
|
|
729
|
+
|
|
730
|
+
**Last Updated:** February 8, 2026
|
|
731
|
+
**Status:** ✅ Tested and verified in production
|
|
732
|
+
**Project:** Ministry LLM - Biblical Study RAG System
|