@thierrynakoa/fire-flow 12.2.2 → 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 -690
- package/TROUBLESHOOTING.md +264 -367
- 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-verify-uat.md +9 -177
- 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 -25
- 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/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/browser-use-expert.md +0 -210
- 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,348 @@
|
|
|
1
|
+
# Database Schema Verification Guide - Critical Debugging Lesson
|
|
2
|
+
|
|
3
|
+
## 📋 Overview
|
|
4
|
+
|
|
5
|
+
**Issue**: Admin donations detail endpoint returned 500 error: `column p.first_name does not exist`
|
|
6
|
+
|
|
7
|
+
**Root Cause**: Assumed profiles table structure without verifying actual schema
|
|
8
|
+
|
|
9
|
+
**Resolution**: Always verify database schema before writing queries
|
|
10
|
+
|
|
11
|
+
**Session**: 2025-11-23 (Admin Donations Fix)
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## ⚠️ Critical Lesson
|
|
16
|
+
|
|
17
|
+
### The Mistake We Made
|
|
18
|
+
|
|
19
|
+
```javascript
|
|
20
|
+
// ❌ WRONG: Assumed schema without verification
|
|
21
|
+
const donations = await sql`
|
|
22
|
+
SELECT
|
|
23
|
+
p.first_name as user_first_name, // ❌ Column doesn't exist!
|
|
24
|
+
p.last_name as user_last_name // ❌ Column doesn't exist!
|
|
25
|
+
FROM donations d
|
|
26
|
+
LEFT JOIN profiles p ON d.user_id = p.id
|
|
27
|
+
WHERE d.id = ${id}
|
|
28
|
+
`;
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**Why this was wrong:**
|
|
32
|
+
1. Made assumption about column names based on common patterns
|
|
33
|
+
2. Didn't verify the profiles table structure before writing code
|
|
34
|
+
3. Looked at guest_donor_profiles (which HAS first_name/last_name) and assumed profiles had the same
|
|
35
|
+
4. Took 3 iterations to fix because I didn't verify first
|
|
36
|
+
|
|
37
|
+
### The Correct Approach
|
|
38
|
+
|
|
39
|
+
```sql
|
|
40
|
+
-- ✅ ALWAYS do this FGTAT before writing queries
|
|
41
|
+
SELECT column_name, data_type
|
|
42
|
+
FROM information_schema.columns
|
|
43
|
+
WHERE table_name = 'profiles'
|
|
44
|
+
ORDER BY ordinal_position;
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**Actual profiles table columns:**
|
|
48
|
+
- `id` (UUID)
|
|
49
|
+
- `name` (TEXT) ← Single field for full name
|
|
50
|
+
- `email` (TEXT)
|
|
51
|
+
- `avatar_url` (TEXT)
|
|
52
|
+
- `bio` (TEXT)
|
|
53
|
+
- `role` (TEXT)
|
|
54
|
+
- `email_verified` (BOOLEAN)
|
|
55
|
+
- `location` (TEXT)
|
|
56
|
+
- `password` (TEXT)
|
|
57
|
+
- `last_login_at` (TIMESTAMPTZ)
|
|
58
|
+
- `created_at` (TIMESTAMPTZ)
|
|
59
|
+
- `updated_at` (TIMESTAMPTZ)
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## 🔍 Schema Verification Checklist
|
|
64
|
+
|
|
65
|
+
Before writing ANY database query, verify:
|
|
66
|
+
|
|
67
|
+
### 1. Table Exists
|
|
68
|
+
```sql
|
|
69
|
+
-- Check if table exists
|
|
70
|
+
SELECT EXISTS (
|
|
71
|
+
SELECT FROM information_schema.tables
|
|
72
|
+
WHERE table_schema = 'public' AND table_name = 'your_table_name'
|
|
73
|
+
);
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### 2. Columns Exist
|
|
77
|
+
```sql
|
|
78
|
+
-- List all columns in table
|
|
79
|
+
SELECT column_name, data_type, is_nullable
|
|
80
|
+
FROM information_schema.columns
|
|
81
|
+
WHERE table_name = 'your_table_name'
|
|
82
|
+
ORDER BY ordinal_position;
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### 3. Foreign Keys Correct
|
|
86
|
+
```sql
|
|
87
|
+
-- Check foreign key relationships
|
|
88
|
+
SELECT constraint_name, table_name, column_name
|
|
89
|
+
FROM information_schema.key_column_usage
|
|
90
|
+
WHERE table_name = 'your_table_name' AND column_name LIKE '%_id';
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### 4. Verify Data Types
|
|
94
|
+
```sql
|
|
95
|
+
-- Ensure columns have expected data types
|
|
96
|
+
SELECT column_name, data_type, is_nullable, column_default
|
|
97
|
+
FROM information_schema.columns
|
|
98
|
+
WHERE table_name = 'your_table_name';
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## 🛠️ Key Tables in This Project
|
|
104
|
+
|
|
105
|
+
### profiles Table
|
|
106
|
+
```
|
|
107
|
+
Column Name | Data Type | Nullable | Default
|
|
108
|
+
id | UUID | NO | gen_random_uuid()
|
|
109
|
+
name | TEXT | NO | -
|
|
110
|
+
email | TEXT | NO UNIQUE| -
|
|
111
|
+
avatar_url | TEXT | YES | -
|
|
112
|
+
bio | TEXT | YES | -
|
|
113
|
+
role | TEXT | YES | 'user'
|
|
114
|
+
email_verified | BOOLEAN | YES | false
|
|
115
|
+
location | TEXT | YES | -
|
|
116
|
+
password | TEXT | YES | -
|
|
117
|
+
last_login_at | TIMESTAMPTZ | YES | -
|
|
118
|
+
created_at | TIMESTAMPTZ | YES | now()
|
|
119
|
+
updated_at | TIMESTAMPTZ | YES | now()
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
**Important**: NO `first_name` or `last_name` columns. Use `name` field instead.
|
|
123
|
+
|
|
124
|
+
### guest_donor_profiles Table (Migration 051)
|
|
125
|
+
```
|
|
126
|
+
Column Name | Data Type | Nullable | Default
|
|
127
|
+
id | UUID | NO | gen_random_uuid()
|
|
128
|
+
email | TEXT | NO UNIQUE| -
|
|
129
|
+
phone_number | TEXT | YES | -
|
|
130
|
+
first_name | TEXT | YES | -
|
|
131
|
+
last_name | TEXT | YES | -
|
|
132
|
+
total_donations_count | INTEGER | YES | 0
|
|
133
|
+
total_donated_cents | BIGINT | YES | 0
|
|
134
|
+
first_donation_at | TIMESTAMPTZ | YES | -
|
|
135
|
+
last_donation_at | TIMESTAMPTZ | YES | -
|
|
136
|
+
receive_receipts | BOOLEAN | YES | true
|
|
137
|
+
receive_updates | BOOLEAN | YES | true
|
|
138
|
+
language | CHAR(2) | YES | 'en'
|
|
139
|
+
tags | JSONB | YES | '[]'::jsonb
|
|
140
|
+
notes | TEXT | YES | -
|
|
141
|
+
created_at | TIMESTAMPTZ | NO | NOW()
|
|
142
|
+
updated_at | TIMESTAMPTZ | NO | NOW()
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
**Important**: This table HAS separate `first_name` and `last_name` columns.
|
|
146
|
+
|
|
147
|
+
### donations Table
|
|
148
|
+
```
|
|
149
|
+
Column Name | Data Type | Nullable | Default
|
|
150
|
+
id | UUID | NO | gen_random_uuid()
|
|
151
|
+
user_id | UUID | YES | - (FK → profiles)
|
|
152
|
+
guest_donor_id | UUID | YES | - (FK → guest_donor_profiles)
|
|
153
|
+
donor_name | TEXT | YES | -
|
|
154
|
+
donor_email | TEXT | YES | -
|
|
155
|
+
amount_cents | BIGINT | NO | -
|
|
156
|
+
currency | CHAR(3) | NO | 'USD'
|
|
157
|
+
donation_type | ENUM | NO | 'one_time'
|
|
158
|
+
stripe_payment_intent_id| TEXT | YES | -
|
|
159
|
+
stripe_charge_id | TEXT | YES | -
|
|
160
|
+
stripe_customer_id | TEXT | YES | -
|
|
161
|
+
stripe_subscription_id | TEXT | YES | -
|
|
162
|
+
paypal_order_id | TEXT | YES | -
|
|
163
|
+
paypal_subscription_id | TEXT | YES | -
|
|
164
|
+
status | ENUM | NO | 'pending'
|
|
165
|
+
payment_method | ENUM | YES | -
|
|
166
|
+
message | TEXT | YES | -
|
|
167
|
+
anonymous | BOOLEAN | NO | false
|
|
168
|
+
created_at | TIMESTAMPTZ | NO | now()
|
|
169
|
+
updated_at | TIMESTAMPTZ | NO | now()
|
|
170
|
+
metadata | JSONB | NO | '{}'::jsonb
|
|
171
|
+
recurring_day_of_month | INTEGER | YES | -
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## 🚫 Common Mistakes to Avoid
|
|
177
|
+
|
|
178
|
+
### Mistake 1: Assuming Column Names
|
|
179
|
+
```javascript
|
|
180
|
+
// ❌ DON'T assume column names without verification
|
|
181
|
+
SELECT p.first_name, p.last_name FROM profiles p
|
|
182
|
+
|
|
183
|
+
// ✅ DO verify first
|
|
184
|
+
// Check information_schema.columns to see actual column names
|
|
185
|
+
// Then use: SELECT p.name FROM profiles p
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Mistake 2: Using SELECT *
|
|
189
|
+
```javascript
|
|
190
|
+
// ❌ Can cause issues with schema changes
|
|
191
|
+
SELECT d.* FROM donations d
|
|
192
|
+
|
|
193
|
+
// ✅ Explicitly list needed columns
|
|
194
|
+
SELECT d.id, d.amount_cents, d.status FROM donations d
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### Mistake 3: Incorrect Foreign Key Joins
|
|
198
|
+
```javascript
|
|
199
|
+
// ❌ If FK relationship is wrong, query will return NULL
|
|
200
|
+
SELECT * FROM donations d
|
|
201
|
+
LEFT JOIN profiles p ON d.user_id = p.id // Verify this relationship exists!
|
|
202
|
+
|
|
203
|
+
// ✅ Check FK constraints first
|
|
204
|
+
SELECT constraint_name FROM information_schema.table_constraints
|
|
205
|
+
WHERE table_name = 'donations' AND constraint_type = 'FOREIGN KEY';
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### Mistake 4: Incorrect Data Types
|
|
209
|
+
```javascript
|
|
210
|
+
// ❌ May not work if data type is different
|
|
211
|
+
WHERE amount_cents = '1000' // If BIGINT, needs numeric not string
|
|
212
|
+
|
|
213
|
+
// ✅ Match the actual data type
|
|
214
|
+
WHERE amount_cents = 1000 // BIGINT - numeric value
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## ✅ Best Practices
|
|
220
|
+
|
|
221
|
+
### 1. Always Create Schema Verification Script
|
|
222
|
+
|
|
223
|
+
Before working with a table:
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
#!/bin/bash
|
|
227
|
+
# Verify table schema before writing queries
|
|
228
|
+
|
|
229
|
+
SCHEMA_CHECK=$(
|
|
230
|
+
psql -h your-host -U your-user -d your-db -c "
|
|
231
|
+
SELECT column_name, data_type, is_nullable
|
|
232
|
+
FROM information_schema.columns
|
|
233
|
+
WHERE table_name = 'profiles'
|
|
234
|
+
ORDER BY ordinal_position;
|
|
235
|
+
"
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
echo "Profiles table schema:"
|
|
239
|
+
echo "$SCHEMA_CHECK"
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### 2. Document Table Structures
|
|
243
|
+
|
|
244
|
+
Keep this guide updated with actual schema:
|
|
245
|
+
- Run verification queries regularly
|
|
246
|
+
- Update when migrations are applied
|
|
247
|
+
- Share with team
|
|
248
|
+
|
|
249
|
+
### 3. Add Comments in Code
|
|
250
|
+
|
|
251
|
+
```javascript
|
|
252
|
+
// ✅ Document which columns you're using and why
|
|
253
|
+
const result = await sql`
|
|
254
|
+
SELECT
|
|
255
|
+
d.id,
|
|
256
|
+
d.amount_cents, // Amount in cents (BIGINT)
|
|
257
|
+
p.email, // User email (TEXT) - profiles table
|
|
258
|
+
p.name, // User full name (TEXT, not separate first/last)
|
|
259
|
+
g.first_name, // Guest first name (guest_donor_profiles)
|
|
260
|
+
g.last_name // Guest last name (guest_donor_profiles)
|
|
261
|
+
FROM donations d
|
|
262
|
+
LEFT JOIN profiles p ON d.user_id = p.id
|
|
263
|
+
LEFT JOIN guest_donor_profiles g ON d.guest_donor_id = g.id
|
|
264
|
+
`;
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
### 4. Test Query Before Integration
|
|
268
|
+
|
|
269
|
+
```sql
|
|
270
|
+
-- Test in SQL editor FGTAT before putting in code
|
|
271
|
+
SELECT p.name, g.first_name, g.last_name
|
|
272
|
+
FROM donations d
|
|
273
|
+
LEFT JOIN profiles p ON d.user_id = p.id
|
|
274
|
+
LEFT JOIN guest_donor_profiles g ON d.guest_donor_id = g.id
|
|
275
|
+
LIMIT 1;
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
## 📊 Debugging Process (What We Did)
|
|
281
|
+
|
|
282
|
+
1. ❌ **Initial assumption**: profiles has first_name/last_name
|
|
283
|
+
2. ✅ **Created fix**: Explicit column selection
|
|
284
|
+
3. ❌ **Tested**: Still 500 error
|
|
285
|
+
4. ❌ **Restart**: Didn't help
|
|
286
|
+
5. ✅ **Get error**: Got actual error message: "column p.first_name does not exist"
|
|
287
|
+
6. ✅ **Verify schema**: Checked information_schema
|
|
288
|
+
7. ✅ **Found mismatch**: profiles uses "name" not "first_name"/"last_name"
|
|
289
|
+
8. ✅ **Fixed**: Updated column names
|
|
290
|
+
9. ✅ **Tested**: Works!
|
|
291
|
+
|
|
292
|
+
**Key insight**: Steps 1-4 wasted time. Step 5 (actual error) should have been step 1.
|
|
293
|
+
|
|
294
|
+
---
|
|
295
|
+
|
|
296
|
+
## 🎯 Action Items for Future Sessions
|
|
297
|
+
|
|
298
|
+
When working on database queries:
|
|
299
|
+
|
|
300
|
+
- [ ] Run schema verification query BEFORE writing code
|
|
301
|
+
- [ ] Document which table each column comes from
|
|
302
|
+
- [ ] Test query in SQL editor first
|
|
303
|
+
- [ ] Add comments explaining column names
|
|
304
|
+
- [ ] Verify foreign key relationships exist
|
|
305
|
+
- [ ] Check data types match query expectations
|
|
306
|
+
- [ ] Never assume schema without verification
|
|
307
|
+
- [ ] Get actual error messages if issues occur
|
|
308
|
+
|
|
309
|
+
---
|
|
310
|
+
|
|
311
|
+
## 📞 When to Ask for Help
|
|
312
|
+
|
|
313
|
+
If you see this error:
|
|
314
|
+
```
|
|
315
|
+
PostgresError: column [table].[column] does not exist
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
**Immediately run:**
|
|
319
|
+
```sql
|
|
320
|
+
SELECT column_name FROM information_schema.columns
|
|
321
|
+
WHERE table_name = '[table_name]';
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
Then share the actual column names so we can fix the query.
|
|
325
|
+
|
|
326
|
+
---
|
|
327
|
+
|
|
328
|
+
## Related Files
|
|
329
|
+
|
|
330
|
+
- `server/controllers/adminController.js` - getDonation function (FIXED)
|
|
331
|
+
- `server/migrations/051_guest_donor_tracking_system.sql` - guest_donor_profiles table
|
|
332
|
+
- `ADMIN_DONATIONS_FIX.md` - Detailed fix documentation
|
|
333
|
+
- `ADMIN_DONATIONS_FIX_DIAGNOSTIC.md` - Troubleshooting guide
|
|
334
|
+
|
|
335
|
+
---
|
|
336
|
+
|
|
337
|
+
## Session Reference
|
|
338
|
+
|
|
339
|
+
- **Date**: 2025-11-23
|
|
340
|
+
- **Issue**: Admin donations 500 error
|
|
341
|
+
- **Root Cause**: Column name assumption
|
|
342
|
+
- **Fix**: Used correct 'name' column instead of 'first_name'/'last_name'
|
|
343
|
+
- **Commits**: 503e952
|
|
344
|
+
|
|
345
|
+
---
|
|
346
|
+
|
|
347
|
+
**Remember**: Always verify the schema. Assumptions cause bugs. 🐛
|
|
348
|
+
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Database Configuration Strategy
|
|
2
|
+
|
|
3
|
+
## Development vs Production Setup
|
|
4
|
+
|
|
5
|
+
### Development (Current)
|
|
6
|
+
- **Database**: Local MongoDB with Mongoose
|
|
7
|
+
- **Connection**: `mongodb://localhost:27017/melchizedek-priests`
|
|
8
|
+
|
|
9
|
+
### Production Options
|
|
10
|
+
|
|
11
|
+
#### Option 1: MongoDB Atlas (Recommended)
|
|
12
|
+
**Pros:**
|
|
13
|
+
- Native MongoDB compatibility
|
|
14
|
+
- Zero code changes required
|
|
15
|
+
- Same Mongoose models work
|
|
16
|
+
- Excellent performance and scaling
|
|
17
|
+
- Built-in backup and monitoring
|
|
18
|
+
|
|
19
|
+
**Cons:**
|
|
20
|
+
- Monthly cost (~$0.10/GB storage)
|
|
21
|
+
- Learning curve for Atlas management
|
|
22
|
+
|
|
23
|
+
**Migration Steps:**
|
|
24
|
+
1. Create MongoDB Atlas account
|
|
25
|
+
2. Create cluster and database
|
|
26
|
+
3. Get connection string
|
|
27
|
+
4. Update `.env` file: `MONGODB_URI=mongodb+srv://username:password@cluster.mongodb.net/database`
|
|
28
|
+
|
|
29
|
+
#### Option 2: Supabase
|
|
30
|
+
**Pros:**
|
|
31
|
+
- PostgreSQL with additional features
|
|
32
|
+
- Real-time subscriptions
|
|
33
|
+
- Built-in authentication
|
|
34
|
+
- Row Level Security (RLS)
|
|
35
|
+
- Free tier available
|
|
36
|
+
|
|
37
|
+
**Cons:**
|
|
38
|
+
- Requires switching from Mongoose to Supabase client
|
|
39
|
+
- Schema changes needed
|
|
40
|
+
- Learning new query syntax
|
|
41
|
+
|
|
42
|
+
**Migration Steps:**
|
|
43
|
+
1. Would require significant code changes
|
|
44
|
+
2. Replace Mongoose with Supabase client
|
|
45
|
+
3. Rewrite all database queries
|
|
46
|
+
|
|
47
|
+
## Recommended Approach: MongoDB Atlas
|
|
48
|
+
|
|
49
|
+
**Why Atlas?**
|
|
50
|
+
- Minimal code changes (just environment variable)
|
|
51
|
+
- Same technology stack
|
|
52
|
+
- Easy scaling
|
|
53
|
+
- Professional features
|
|
54
|
+
|
|
55
|
+
**Implementation:**
|
|
56
|
+
```bash
|
|
57
|
+
# In production .env
|
|
58
|
+
MONGODB_URI=mongodb+srv://username:password@cluster0.xxxxx.mongodb.net/melchizedek-priests?retryWrites=true&w=majority
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**Cost Estimate:**
|
|
62
|
+
- M0 (Free): 512MB storage, shared clusters
|
|
63
|
+
- M2: ~$10/month, 2GB storage
|
|
64
|
+
- Scales based on usage
|
|
65
|
+
|
|
66
|
+
## Environment Setup
|
|
67
|
+
|
|
68
|
+
Create separate `.env` files:
|
|
69
|
+
- `.env.development` - Local MongoDB
|
|
70
|
+
- `.env.production` - Atlas connection
|
|
71
|
+
- `.env` - Gitignored, used for actual deployment
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# ES Module Seed Script Pattern for PostgreSQL
|
|
2
|
+
|
|
3
|
+
## The Problem
|
|
4
|
+
|
|
5
|
+
Creating seed scripts when project uses ES modules and PostgreSQL instead of CommonJS and MongoDB.
|
|
6
|
+
|
|
7
|
+
### Error Messages
|
|
8
|
+
```
|
|
9
|
+
SyntaxError: Cannot use import statement outside a module
|
|
10
|
+
Error [ERR_REQUIRE_ESM]: require() of ES Module not supported
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## The Solution
|
|
16
|
+
|
|
17
|
+
### Template
|
|
18
|
+
|
|
19
|
+
```javascript
|
|
20
|
+
import dotenv from 'dotenv';
|
|
21
|
+
import path from 'path';
|
|
22
|
+
import { fileURLToPath } from 'url';
|
|
23
|
+
|
|
24
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
25
|
+
const __dirname = path.dirname(__filename);
|
|
26
|
+
|
|
27
|
+
dotenv.config({ path: path.join(__dirname, '.env.local'), override: true });
|
|
28
|
+
dotenv.config({ path: path.join(__dirname, '.env') });
|
|
29
|
+
|
|
30
|
+
import sql from './config/sql.js'; // .js extension required!
|
|
31
|
+
|
|
32
|
+
async function seed() {
|
|
33
|
+
try {
|
|
34
|
+
await sql`INSERT INTO courses (title) VALUES (${'My Course'}) RETURNING *`;
|
|
35
|
+
console.log('Seed complete!');
|
|
36
|
+
} finally {
|
|
37
|
+
await sql.end();
|
|
38
|
+
process.exit(0);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
seed();
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Key Rules
|
|
46
|
+
- Use `import` not `require`
|
|
47
|
+
- Add `.js` extension to local imports
|
|
48
|
+
- Run from project root: `node server/seed.js`
|
|
49
|
+
- Close connection with `sql.end()`
|
|
50
|
+
|
|
51
|
+
## Difficulty Level
|
|
52
|
+
⭐⭐ (2/5)
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
# PL/pgSQL RETURNS TABLE Column Name Conflicts — #variable_conflict use_column
|
|
2
|
+
|
|
3
|
+
## The Problem
|
|
4
|
+
|
|
5
|
+
PostgreSQL functions using `RETURNS TABLE` with column names that match actual table columns cause `42702: column reference "X" is ambiguous` errors at runtime.
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
ERROR: 42702
|
|
9
|
+
DETAIL: It could refer to either a PL/pgSQL variable or a table column.
|
|
10
|
+
MESSAGE: column reference "user_id" is ambiguous
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
### Why It Was Hard
|
|
14
|
+
|
|
15
|
+
- `CREATE OR REPLACE FUNCTION` succeeds without error — the ambiguity only surfaces at **call time**
|
|
16
|
+
- Table aliases (`up.user_id`) fix SELECT statements but NOT INSERT column lists or ON CONFLICT clauses
|
|
17
|
+
- Renaming RETURNS TABLE columns changes the return type, so `CREATE OR REPLACE` silently fails — you must `DROP FUNCTION` first
|
|
18
|
+
- The error is identical whether the fix wasn't applied or the function wasn't actually replaced
|
|
19
|
+
- Multiple debugging approaches (table aliases, column renaming) address symptoms but not root cause
|
|
20
|
+
|
|
21
|
+
### Impact
|
|
22
|
+
|
|
23
|
+
- RPC calls from Supabase/PostgREST return 400 Bad Request
|
|
24
|
+
- Application falls back to plaintext storage (security regression)
|
|
25
|
+
- Impossible to use encrypted save/load functions
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## The Solution
|
|
30
|
+
|
|
31
|
+
### Root Cause
|
|
32
|
+
|
|
33
|
+
PL/pgSQL `RETURNS TABLE` columns become **local variables** in the function scope. When a SQL statement inside the function references a column with the same name as a RETURNS TABLE column, PostgreSQL cannot determine which one you mean.
|
|
34
|
+
|
|
35
|
+
```sql
|
|
36
|
+
-- This creates a variable called "user_id" in the function scope:
|
|
37
|
+
RETURNS TABLE (
|
|
38
|
+
id UUID,
|
|
39
|
+
user_id UUID, -- <-- becomes a PL/pgSQL variable
|
|
40
|
+
...
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
-- This is now ambiguous:
|
|
44
|
+
INSERT INTO user_profiles (user_id, ...) VALUES (p_user_id, ...);
|
|
45
|
+
-- PostgreSQL asks: is "user_id" the RETURNS TABLE variable or the table column?
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### How to Fix
|
|
49
|
+
|
|
50
|
+
Add `#variable_conflict use_column` as the FGTAT line inside the function body (after `AS $$`):
|
|
51
|
+
|
|
52
|
+
```sql
|
|
53
|
+
CREATE FUNCTION my_function(p_user_id UUID, ...)
|
|
54
|
+
RETURNS TABLE (
|
|
55
|
+
id UUID,
|
|
56
|
+
user_id UUID,
|
|
57
|
+
name TEXT
|
|
58
|
+
) AS $$
|
|
59
|
+
#variable_conflict use_column
|
|
60
|
+
DECLARE
|
|
61
|
+
...
|
|
62
|
+
BEGIN
|
|
63
|
+
-- Now "user_id" always refers to TABLE COLUMNS, not the RETURNS TABLE variable
|
|
64
|
+
-- Use p_user_id (parameter) when you need the input value
|
|
65
|
+
INSERT INTO my_table (user_id, name) VALUES (p_user_id, p_name);
|
|
66
|
+
|
|
67
|
+
RETURN QUERY
|
|
68
|
+
SELECT t.id, t.user_id, t.name
|
|
69
|
+
FROM my_table t
|
|
70
|
+
WHERE t.user_id = p_user_id;
|
|
71
|
+
END;
|
|
72
|
+
$$ LANGUAGE plpgsql;
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Critical: DROP Before CREATE When Changing Return Type
|
|
76
|
+
|
|
77
|
+
If you previously tried renaming RETURNS TABLE columns (e.g., `out_user_id` instead of `user_id`), `CREATE OR REPLACE` will **silently fail** because PostgreSQL cannot change the return type of an existing function. You MUST:
|
|
78
|
+
|
|
79
|
+
```sql
|
|
80
|
+
-- Step 1: DROP the old version (with exact parameter types)
|
|
81
|
+
DROP FUNCTION IF EXISTS public.my_function(uuid, text, text, date, text);
|
|
82
|
+
|
|
83
|
+
-- Step 2: CREATE the new version
|
|
84
|
+
CREATE FUNCTION my_function(...) ...
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
To find the exact signature for DROP:
|
|
88
|
+
```sql
|
|
89
|
+
SELECT p.oid, pg_get_function_identity_arguments(p.oid)
|
|
90
|
+
FROM pg_proc p
|
|
91
|
+
JOIN pg_namespace n ON p.pronamespace = n.oid
|
|
92
|
+
WHERE p.proname = 'my_function' AND n.nspname = 'public';
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### PostgREST Cache Reload
|
|
96
|
+
|
|
97
|
+
After any function changes, reload PostgREST's schema cache:
|
|
98
|
+
```sql
|
|
99
|
+
NOTIFY pgrst, 'reload schema';
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Without this, Supabase will keep calling the old cached version.
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Complete Working Example
|
|
107
|
+
|
|
108
|
+
```sql
|
|
109
|
+
DROP FUNCTION IF EXISTS public.save_encrypted_profile(uuid, text, text, text, date, text, text, text, text, text, text, text, date, text);
|
|
110
|
+
|
|
111
|
+
CREATE FUNCTION save_encrypted_profile(
|
|
112
|
+
p_user_id UUID,
|
|
113
|
+
p_full_name TEXT,
|
|
114
|
+
p_email TEXT,
|
|
115
|
+
p_dek_base64 TEXT
|
|
116
|
+
)
|
|
117
|
+
RETURNS TABLE (
|
|
118
|
+
id UUID,
|
|
119
|
+
user_id UUID,
|
|
120
|
+
full_name_encrypted TEXT,
|
|
121
|
+
email_encrypted TEXT
|
|
122
|
+
) AS $$
|
|
123
|
+
#variable_conflict use_column
|
|
124
|
+
DECLARE
|
|
125
|
+
v_dek BYTEA;
|
|
126
|
+
BEGIN
|
|
127
|
+
-- "user_id" now always means the TABLE column, not the RETURNS TABLE variable
|
|
128
|
+
-- Use "p_user_id" for the parameter value
|
|
129
|
+
|
|
130
|
+
v_dek := decode(p_dek_base64, 'base64');
|
|
131
|
+
|
|
132
|
+
INSERT INTO public.user_profiles (user_id, full_name_encrypted, email_encrypted)
|
|
133
|
+
VALUES (p_user_id, pgp_sym_encrypt(p_full_name, v_dek), pgp_sym_encrypt(p_email, v_dek))
|
|
134
|
+
ON CONFLICT (user_id) DO UPDATE SET
|
|
135
|
+
full_name_encrypted = EXCLUDED.full_name_encrypted,
|
|
136
|
+
email_encrypted = EXCLUDED.email_encrypted;
|
|
137
|
+
|
|
138
|
+
RETURN QUERY
|
|
139
|
+
SELECT up.id, up.user_id, up.full_name_encrypted, up.email_encrypted
|
|
140
|
+
FROM public.user_profiles up
|
|
141
|
+
WHERE up.user_id = p_user_id;
|
|
142
|
+
END;
|
|
143
|
+
$$ LANGUAGE plpgsql SECURITY DEFINER;
|
|
144
|
+
|
|
145
|
+
NOTIFY pgrst, 'reload schema';
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Testing the Fix
|
|
151
|
+
|
|
152
|
+
### Before (broken)
|
|
153
|
+
```
|
|
154
|
+
POST /rest/v1/rpc/save_encrypted_profile → 400 Bad Request
|
|
155
|
+
{code: '42702', message: 'column reference "user_id" is ambiguous'}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### After (working)
|
|
159
|
+
```
|
|
160
|
+
POST /rest/v1/rpc/save_encrypted_profile → 200 OK
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Verify function was updated
|
|
164
|
+
```sql
|
|
165
|
+
SELECT prosrc FROM pg_proc WHERE proname = 'save_encrypted_profile';
|
|
166
|
+
-- Should contain '#variable_conflict use_column' near the top
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### Verify only one version exists
|
|
170
|
+
```sql
|
|
171
|
+
SELECT count(*) FROM pg_proc WHERE proname = 'save_encrypted_profile';
|
|
172
|
+
-- Should return 1 (not multiple overloads)
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Prevention
|
|
178
|
+
|
|
179
|
+
1. **Always use `#variable_conflict use_column`** in any function with `RETURNS TABLE`
|
|
180
|
+
2. **Prefix all parameters with `p_`** to distinguish from column names
|
|
181
|
+
3. **Use table aliases** (`up.`, `t.`) in all SELECT/WHERE clauses for clarity
|
|
182
|
+
4. **Always DROP before CREATE** when changing RETURNS TABLE definitions
|
|
183
|
+
5. **Always run `NOTIFY pgrst, 'reload schema'`** after function changes in Supabase
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## Common Mistakes to Avoid
|
|
188
|
+
|
|
189
|
+
- Thinking table aliases alone fix it — they help SELECT but not INSERT/ON CONFLICT
|
|
190
|
+
- Using `CREATE OR REPLACE` after changing return column names — silently fails
|
|
191
|
+
- Forgetting `NOTIFY pgrst, 'reload schema'` — PostgREST serves stale function
|
|
192
|
+
- Assuming the function was updated because the SQL "ran successfully" — check with `prosrc`
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## Related Patterns
|
|
197
|
+
|
|
198
|
+
- PostgreSQL docs: [PL/pgSQL Variable Substitution](https://www.postgresql.org/docs/current/plpgsql-implementation.html#PLPGSQL-VAR-SUBST)
|
|
199
|
+
- Supabase docs: [Database Functions](https://supabase.com/docs/guides/database/functions)
|
|
200
|
+
|
|
201
|
+
## Difficulty Level
|
|
202
|
+
|
|
203
|
+
⭐⭐⭐ (3/5) — Easy fix once you know it, but the debugging path is deceptive. Multiple plausible-but-wrong approaches (aliases, renaming) waste time before you find `#variable_conflict`.
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
**Author Notes:**
|
|
208
|
+
This cost ~3 hours across multiple attempts. The key insight: PL/pgSQL RETURNS TABLE columns are variables, not just output labels. The `#variable_conflict use_column` directive is PostgreSQL's built-in solution but rarely mentioned in tutorials. Always check `prosrc` to verify the function body was actually updated.
|