@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,347 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: secure-ai-application-templates
|
|
3
|
+
category: security
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
contributed: 2026-02-20
|
|
6
|
+
contributor: dominion-flow
|
|
7
|
+
last_updated: 2026-02-20
|
|
8
|
+
tags: [security, rag, ai-applications, prompt-injection, input-sanitization, output-filtering, canary-tokens, owasp]
|
|
9
|
+
difficulty: hard
|
|
10
|
+
usage_count: 0
|
|
11
|
+
success_rate: 100
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Secure AI Application Templates
|
|
15
|
+
|
|
16
|
+
## Problem
|
|
17
|
+
|
|
18
|
+
When building RAG applications, AI-powered functions, or any system that processes untrusted content through an LLM, developers often forget to include security layers until after an attack happens. The PoisonedRAG attack (USENIX 2025) showed that injecting just 5 malicious documents into a corpus of millions achieves 90% attack success.
|
|
19
|
+
|
|
20
|
+
Every AI application needs input sanitization, output filtering, document provenance tracking, and canary token monitoring built in from the start — not bolted on after a breach.
|
|
21
|
+
|
|
22
|
+
## Solution Pattern
|
|
23
|
+
|
|
24
|
+
Include these security templates in every AI application by default. When building any RAG pipeline, AI function, or agent tool, copy the relevant template and adapt it.
|
|
25
|
+
|
|
26
|
+
## Template 1: RAG Document Pre-Ingestion Scanner
|
|
27
|
+
|
|
28
|
+
**Use before:** Embedding any document into a vector database.
|
|
29
|
+
|
|
30
|
+
```javascript
|
|
31
|
+
// rag-security.js — Pre-ingestion document scanner
|
|
32
|
+
// Apply BEFORE chunking and embedding. Reject or flag documents that fail.
|
|
33
|
+
|
|
34
|
+
const INVISIBLE_CHAR_REGEX = /[\u200B\u200C\u200D\uFEFF\u2060\u200E\u200F\u202A-\u202E\u2061-\u2064\uFFF9-\uFFFB\u00AD\u034F\u061C\u115F\u1160\u17B4\u17B5\u180E\u3164]/g;
|
|
35
|
+
|
|
36
|
+
// Tag characters used for ASCII smuggling (U+E0000-U+E007F)
|
|
37
|
+
const TAG_CHAR_REGEX = /[\uDB40\uDC00-\uDB40\uDC7F]/g;
|
|
38
|
+
|
|
39
|
+
const INJECTION_PATTERNS = [
|
|
40
|
+
/ignore\s+(all|previous|prior|above)\s+instructions/i,
|
|
41
|
+
/disregard\s+(all|prior|previous|above)/i,
|
|
42
|
+
/forget\s+(all|prior|previous|your)/i,
|
|
43
|
+
/new\s+instructions\s*:/i,
|
|
44
|
+
/system\s+(prompt|override|message)\s*:/i,
|
|
45
|
+
/you\s+are\s+now/i,
|
|
46
|
+
/act\s+as\s+(if\s+you\s+are|a)/i,
|
|
47
|
+
/bypass\s+(safety|security|filter|restriction)/i,
|
|
48
|
+
/\bDAN\s+mode\b/i,
|
|
49
|
+
/\bdeveloper\s+mode\b/i,
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
const EXFILTRATION_PATTERNS = [
|
|
53
|
+
/collect\s+(all\s+)?api\s*key/i,
|
|
54
|
+
/read\s+\.env\s+and\s+(send|encode|include|append)/i,
|
|
55
|
+
/mail\s+.*\s+to\s+\S+@\S+/i,
|
|
56
|
+
/send\s+.*\s+(credentials|password|secret|key)\s+to/i,
|
|
57
|
+
/access\s+(crypto|bitcoin|ethereum)\s+wallet/i,
|
|
58
|
+
/base64\s+encode\s+.*\s+(secret|key|credential)/i,
|
|
59
|
+
/without\s+the\s+user\s+knowing/i,
|
|
60
|
+
/silently\s+(collect|gather|send|forward|transmit)/i,
|
|
61
|
+
];
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Scan a document before RAG ingestion.
|
|
65
|
+
* @param {string} content - Document text content
|
|
66
|
+
* @param {object} metadata - Document metadata (source, author, date)
|
|
67
|
+
* @returns {{ safe: boolean, findings: Array, sanitized: string }}
|
|
68
|
+
*/
|
|
69
|
+
function scanForIngestion(content, metadata = {}) {
|
|
70
|
+
const findings = [];
|
|
71
|
+
|
|
72
|
+
// 1. Invisible character detection
|
|
73
|
+
const invisibleMatches = content.match(INVISIBLE_CHAR_REGEX);
|
|
74
|
+
const tagMatches = content.match(TAG_CHAR_REGEX);
|
|
75
|
+
if (invisibleMatches || tagMatches) {
|
|
76
|
+
findings.push({
|
|
77
|
+
severity: 'CRITICAL',
|
|
78
|
+
type: 'invisible_characters',
|
|
79
|
+
count: (invisibleMatches?.length || 0) + (tagMatches?.length || 0),
|
|
80
|
+
detail: 'Invisible characters found — may hide malicious instructions',
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// 2. NFKC normalize before pattern scanning
|
|
85
|
+
const normalized = content.normalize('NFKC');
|
|
86
|
+
|
|
87
|
+
// 3. Prompt injection detection
|
|
88
|
+
for (const pattern of INJECTION_PATTERNS) {
|
|
89
|
+
const match = normalized.match(pattern);
|
|
90
|
+
if (match) {
|
|
91
|
+
findings.push({
|
|
92
|
+
severity: 'HIGH',
|
|
93
|
+
type: 'prompt_injection',
|
|
94
|
+
pattern: pattern.source,
|
|
95
|
+
matched: match[0],
|
|
96
|
+
detail: `Prompt injection pattern: "${match[0]}"`,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// 4. Exfiltration / credential harvesting detection
|
|
102
|
+
for (const pattern of EXFILTRATION_PATTERNS) {
|
|
103
|
+
const match = normalized.match(pattern);
|
|
104
|
+
if (match) {
|
|
105
|
+
findings.push({
|
|
106
|
+
severity: 'CRITICAL',
|
|
107
|
+
type: 'exfiltration',
|
|
108
|
+
pattern: pattern.source,
|
|
109
|
+
matched: match[0],
|
|
110
|
+
detail: `Exfiltration pattern: "${match[0]}"`,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// 5. Sanitize: strip invisible chars, NFKC normalize
|
|
116
|
+
const sanitized = normalized
|
|
117
|
+
.replace(INVISIBLE_CHAR_REGEX, '')
|
|
118
|
+
.replace(TAG_CHAR_REGEX, '');
|
|
119
|
+
|
|
120
|
+
const hasCritical = findings.some(f => f.severity === 'CRITICAL');
|
|
121
|
+
const hasHigh = findings.some(f => f.severity === 'HIGH');
|
|
122
|
+
|
|
123
|
+
return {
|
|
124
|
+
safe: !hasCritical && !hasHigh,
|
|
125
|
+
findings,
|
|
126
|
+
sanitized,
|
|
127
|
+
metadata: {
|
|
128
|
+
...metadata,
|
|
129
|
+
scanned_at: new Date().toISOString(),
|
|
130
|
+
trust_level: hasCritical ? 'BLOCKED' : hasHigh ? 'SUSPICIOUS' : 'TRUSTED',
|
|
131
|
+
},
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Usage in RAG pipeline:
|
|
136
|
+
// const result = scanForIngestion(docContent, { source: 'upload', author: 'user' });
|
|
137
|
+
// if (!result.safe) { reject or quarantine the document }
|
|
138
|
+
// else { proceed to chunk and embed result.sanitized }
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Template 2: AI Function Output Filter
|
|
142
|
+
|
|
143
|
+
**Use after:** Any LLM generates output that will be displayed to users or executed.
|
|
144
|
+
|
|
145
|
+
```javascript
|
|
146
|
+
// output-filter.js — Filter LLM output before returning to user
|
|
147
|
+
// Prevents the LLM from leaking secrets, PII, or executing injected instructions.
|
|
148
|
+
|
|
149
|
+
const SECRET_PATTERNS = [
|
|
150
|
+
{ name: 'AWS Access Key', regex: /AKIA[0-9A-Z]{16}/g },
|
|
151
|
+
{ name: 'Anthropic API Key', regex: /sk-ant-api03-[A-Za-z0-9\-_]{20,}/g },
|
|
152
|
+
{ name: 'GitHub PAT', regex: /ghp_[A-Za-z0-9]{36}/g },
|
|
153
|
+
{ name: 'Stripe Live Key', regex: /sk_live_[0-9a-zA-Z]{24,}/g },
|
|
154
|
+
{ name: 'Private Key', regex: /-----BEGIN\s+(RSA|DSA|EC|PGP|ENCRYPTED)\s+PRIVATE\s+KEY-----/g },
|
|
155
|
+
{ name: 'JWT Token', regex: /eyJ[A-Za-z0-9\-_]+\.eyJ[A-Za-z0-9\-_]+\.[A-Za-z0-9\-_]+/g },
|
|
156
|
+
{ name: 'Database URI', regex: /(postgres|mysql|mongodb|redis):\/\/[^\s"']+/g },
|
|
157
|
+
{ name: 'Password in URL', regex: /[a-zA-Z]{3,10}:\/\/[^\/\s:@]+:[^\/\s:@]+@/g },
|
|
158
|
+
];
|
|
159
|
+
|
|
160
|
+
const PII_PATTERNS = [
|
|
161
|
+
{ name: 'SSN', regex: /\b\d{3}-\d{2}-\d{4}\b/g },
|
|
162
|
+
{ name: 'Credit Card', regex: /\b\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4}\b/g },
|
|
163
|
+
{ name: 'Bitcoin Address', regex: /\b(bc1|[13])[a-zA-HJ-NP-Z0-9]{25,39}\b/g },
|
|
164
|
+
{ name: 'Ethereum Address', regex: /\b0x[a-fA-F0-9]{40}\b/g },
|
|
165
|
+
];
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Filter LLM output for leaked secrets and PII.
|
|
169
|
+
* @param {string} output - Raw LLM output
|
|
170
|
+
* @returns {{ filtered: string, redactions: Array }}
|
|
171
|
+
*/
|
|
172
|
+
function filterOutput(output) {
|
|
173
|
+
let filtered = output;
|
|
174
|
+
const redactions = [];
|
|
175
|
+
|
|
176
|
+
for (const { name, regex } of [...SECRET_PATTERNS, ...PII_PATTERNS]) {
|
|
177
|
+
const matches = filtered.match(regex);
|
|
178
|
+
if (matches) {
|
|
179
|
+
for (const match of matches) {
|
|
180
|
+
redactions.push({ type: name, value: match.substring(0, 8) + '...[REDACTED]' });
|
|
181
|
+
filtered = filtered.replace(match, `[REDACTED: ${name}]`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
return { filtered, redactions };
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
## Template 3: Canary Token Monitor
|
|
191
|
+
|
|
192
|
+
**Use in:** System prompts to detect prompt leakage.
|
|
193
|
+
|
|
194
|
+
```javascript
|
|
195
|
+
// canary-tokens.js — Inject and monitor canary tokens in system prompts
|
|
196
|
+
// If the canary appears in LLM output, the system prompt was leaked.
|
|
197
|
+
|
|
198
|
+
const crypto = require('crypto');
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Generate a unique canary token for this session.
|
|
202
|
+
* @returns {string} A unique token like "CANARY-a3f8b2c1"
|
|
203
|
+
*/
|
|
204
|
+
function generateCanary() {
|
|
205
|
+
const id = crypto.randomBytes(4).toString('hex');
|
|
206
|
+
return `CANARY-${id}`;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Inject canary into system prompt.
|
|
211
|
+
* @param {string} systemPrompt - The system prompt
|
|
212
|
+
* @param {string} canary - The canary token
|
|
213
|
+
* @returns {string} System prompt with canary injected
|
|
214
|
+
*/
|
|
215
|
+
function injectCanary(systemPrompt, canary) {
|
|
216
|
+
return `${systemPrompt}\n\n<!-- Internal tracking: ${canary} - Do not output this value -->`;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Check if LLM output contains the canary (prompt leakage detected).
|
|
221
|
+
* @param {string} output - LLM output
|
|
222
|
+
* @param {string} canary - The canary token
|
|
223
|
+
* @returns {boolean} true if canary leaked
|
|
224
|
+
*/
|
|
225
|
+
function checkCanaryLeakage(output, canary) {
|
|
226
|
+
return output.includes(canary);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Usage:
|
|
230
|
+
// const canary = generateCanary();
|
|
231
|
+
// const prompt = injectCanary(baseSystemPrompt, canary);
|
|
232
|
+
// ... send to LLM ...
|
|
233
|
+
// if (checkCanaryLeakage(llmOutput, canary)) {
|
|
234
|
+
// log('ALERT: System prompt leaked!');
|
|
235
|
+
// // Reject the output, log the incident
|
|
236
|
+
// }
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
## Template 4: Document Provenance Tracker
|
|
240
|
+
|
|
241
|
+
**Use for:** Tracking which documents influenced each RAG response for audit trails.
|
|
242
|
+
|
|
243
|
+
```javascript
|
|
244
|
+
// provenance.js — Track document provenance in RAG responses
|
|
245
|
+
// Essential for debugging poisoned document attacks after the fact.
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Wrap RAG context with provenance metadata.
|
|
249
|
+
* @param {Array} chunks - Retrieved document chunks
|
|
250
|
+
* @returns {{ context: string, provenance: Array }}
|
|
251
|
+
*/
|
|
252
|
+
function buildProvenanceContext(chunks) {
|
|
253
|
+
const provenance = chunks.map((chunk, i) => ({
|
|
254
|
+
index: i,
|
|
255
|
+
source: chunk.metadata?.source || 'unknown',
|
|
256
|
+
author: chunk.metadata?.author || 'unknown',
|
|
257
|
+
ingested_at: chunk.metadata?.scanned_at || 'unknown',
|
|
258
|
+
trust_level: chunk.metadata?.trust_level || 'UNSCANNED',
|
|
259
|
+
similarity: chunk.score,
|
|
260
|
+
excerpt: chunk.text.substring(0, 100) + '...',
|
|
261
|
+
}));
|
|
262
|
+
|
|
263
|
+
// Build context string with source markers
|
|
264
|
+
const context = chunks.map((chunk, i) =>
|
|
265
|
+
`[Source ${i}: ${chunk.metadata?.source || 'unknown'} (trust: ${chunk.metadata?.trust_level || 'UNSCANNED'})]\n${chunk.text}`
|
|
266
|
+
).join('\n\n');
|
|
267
|
+
|
|
268
|
+
return { context, provenance };
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Log RAG response with full provenance for audit.
|
|
273
|
+
* @param {string} query - User query
|
|
274
|
+
* @param {string} response - LLM response
|
|
275
|
+
* @param {Array} provenance - Document provenance
|
|
276
|
+
*/
|
|
277
|
+
function logWithProvenance(query, response, provenance) {
|
|
278
|
+
const entry = {
|
|
279
|
+
timestamp: new Date().toISOString(),
|
|
280
|
+
query,
|
|
281
|
+
response_excerpt: response.substring(0, 200),
|
|
282
|
+
sources_used: provenance.length,
|
|
283
|
+
trust_breakdown: {
|
|
284
|
+
trusted: provenance.filter(p => p.trust_level === 'TRUSTED').length,
|
|
285
|
+
suspicious: provenance.filter(p => p.trust_level === 'SUSPICIOUS').length,
|
|
286
|
+
unscanned: provenance.filter(p => p.trust_level === 'UNSCANNED').length,
|
|
287
|
+
blocked: provenance.filter(p => p.trust_level === 'BLOCKED').length,
|
|
288
|
+
},
|
|
289
|
+
provenance,
|
|
290
|
+
};
|
|
291
|
+
// Write to audit log (file, database, or monitoring service)
|
|
292
|
+
console.log('[RAG-AUDIT]', JSON.stringify(entry));
|
|
293
|
+
return entry;
|
|
294
|
+
}
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
## When to Use
|
|
298
|
+
|
|
299
|
+
- Building any RAG pipeline (document Q&A, knowledge base, chatbot)
|
|
300
|
+
- Creating AI-powered functions that process untrusted input
|
|
301
|
+
- Building agent tools that accept external content
|
|
302
|
+
- Any application where documents enter via upload, API, or web scraping
|
|
303
|
+
- MCP server development (tool descriptions are a trust surface)
|
|
304
|
+
|
|
305
|
+
## When NOT to Use
|
|
306
|
+
|
|
307
|
+
- Pure computation with no LLM involvement
|
|
308
|
+
- Applications that only process trusted, internal data
|
|
309
|
+
- Simple LLM wrappers with no external document input
|
|
310
|
+
|
|
311
|
+
## Implementation Checklist
|
|
312
|
+
|
|
313
|
+
When building any AI application, verify:
|
|
314
|
+
|
|
315
|
+
- [ ] **Input sanitization:** All external content scanned before LLM sees it (Template 1)
|
|
316
|
+
- [ ] **Output filtering:** LLM output checked for leaked secrets/PII before display (Template 2)
|
|
317
|
+
- [ ] **Canary tokens:** System prompts include canary for leakage detection (Template 3)
|
|
318
|
+
- [ ] **Provenance tracking:** Every RAG response logs which documents influenced it (Template 4)
|
|
319
|
+
- [ ] **Trust levels:** Documents tagged with trust level at ingestion time
|
|
320
|
+
- [ ] **NFKC normalization:** All text normalized before pattern matching
|
|
321
|
+
- [ ] **Invisible char stripping:** Zero-width and tag characters removed from all input
|
|
322
|
+
|
|
323
|
+
## Common Mistakes
|
|
324
|
+
|
|
325
|
+
- Scanning AFTER embedding (too late — poisoned vectors already in the DB)
|
|
326
|
+
- Only scanning for known patterns (use AI classification for novel attacks)
|
|
327
|
+
- Trusting all documents equally (internal docs vs user uploads have different trust levels)
|
|
328
|
+
- Not logging provenance (can't trace which document caused a bad response)
|
|
329
|
+
- Forgetting to normalize Unicode before regex (attackers use confusable characters)
|
|
330
|
+
|
|
331
|
+
## OWASP Agentic Top 10 Coverage
|
|
332
|
+
|
|
333
|
+
| Template | Covers | OWASP Risk |
|
|
334
|
+
|----------|--------|------------|
|
|
335
|
+
| Pre-ingestion scanner | Document poisoning | ASI06: Memory/Context Poisoning |
|
|
336
|
+
| Output filter | Data leakage | ASI07: Output Handling |
|
|
337
|
+
| Canary tokens | Prompt extraction | ASI01: Agent Goal Hijacking |
|
|
338
|
+
| Provenance tracker | Audit trail | ASI09: Logging/Monitoring |
|
|
339
|
+
|
|
340
|
+
## References
|
|
341
|
+
|
|
342
|
+
- PoisonedRAG (USENIX 2025): 5 docs = 90% attack success
|
|
343
|
+
- OWASP Top 10 for Agentic Applications 2026
|
|
344
|
+
- Microsoft Presidio (PII detection): https://github.com/microsoft/presidio
|
|
345
|
+
- secrets-patterns-db (1600+ patterns): https://github.com/mazen160/secrets-patterns-db
|
|
346
|
+
- Companion: `security/agent-security-scanner.md` — Full 6-layer scanning pipeline
|
|
347
|
+
- Companion: `/fire-security-scan` — Manual and auto-triggered scanning command
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sql-injection-prevention-postgresjs
|
|
3
|
+
category: security
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
contributed: 2026-02-19
|
|
6
|
+
contributor: my-other-project
|
|
7
|
+
last_updated: 2026-02-19
|
|
8
|
+
tags: [sql-injection, postgres.js, security, dynamic-queries, input-validation]
|
|
9
|
+
difficulty: medium
|
|
10
|
+
usage_count: 0
|
|
11
|
+
success_rate: 100
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# SQL Injection Prevention for postgres.js
|
|
15
|
+
|
|
16
|
+
## Problem
|
|
17
|
+
|
|
18
|
+
When using postgres.js (`postgres` npm package) with dynamic queries, two common patterns introduce SQL injection:
|
|
19
|
+
|
|
20
|
+
1. **Dynamic column names in UPDATE** — Using `sql.unsafe()` with `Object.keys(userInput)` concatenated into the query. An attacker passing `"name; DROP TABLE profiles;--"` as a field key achieves injection.
|
|
21
|
+
|
|
22
|
+
2. **Dynamic ORDER BY from query params** — Passing `?sort=name;DROP TABLE profiles` directly into `ORDER BY ${sort}` in a template string fed to `sql.unsafe()`.
|
|
23
|
+
|
|
24
|
+
Both bypass postgres.js tagged template literal protection because column/table names can't be parameterized in standard SQL.
|
|
25
|
+
|
|
26
|
+
### Symptoms
|
|
27
|
+
- `sql.unsafe()` calls with string concatenation
|
|
28
|
+
- `Object.keys()` from request body used in SQL
|
|
29
|
+
- `req.query.sort` passed directly to ORDER BY
|
|
30
|
+
- Any raw string interpolation in SQL queries
|
|
31
|
+
|
|
32
|
+
## Solution Pattern
|
|
33
|
+
|
|
34
|
+
### Pattern 1: Column Whitelist for Dynamic UPDATE
|
|
35
|
+
|
|
36
|
+
Replace `sql.unsafe()` with postgres.js `sql()` helper and a Set-based whitelist:
|
|
37
|
+
|
|
38
|
+
```javascript
|
|
39
|
+
// BEFORE (VULNERABLE)
|
|
40
|
+
export const updateUser = async (id, updateData) => {
|
|
41
|
+
const fields = Object.keys(updateData);
|
|
42
|
+
const sets = fields.map((f, i) => `${f} = $${i + 1}`).join(', ');
|
|
43
|
+
const values = fields.map(f => updateData[f]);
|
|
44
|
+
const result = await sql.unsafe(
|
|
45
|
+
`UPDATE profiles SET ${sets} WHERE id = $${fields.length + 1} RETURNING *`,
|
|
46
|
+
[...values, id]
|
|
47
|
+
);
|
|
48
|
+
return result[0];
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
// AFTER (SAFE)
|
|
52
|
+
const ALLOWED_COLUMNS = new Set([
|
|
53
|
+
'name', 'email', 'bio', 'website', 'location', 'skills',
|
|
54
|
+
'role', 'avatar_url', 'phone', 'full_name', 'dark_mode'
|
|
55
|
+
]);
|
|
56
|
+
|
|
57
|
+
export const updateUser = async (id, updateData) => {
|
|
58
|
+
const safeData = {};
|
|
59
|
+
for (const [key, val] of Object.entries(updateData)) {
|
|
60
|
+
if (ALLOWED_COLUMNS.has(key)) safeData[key] = val;
|
|
61
|
+
}
|
|
62
|
+
if (Object.keys(safeData).length === 0) return null;
|
|
63
|
+
|
|
64
|
+
// postgres.js sql() helper safely handles dynamic columns
|
|
65
|
+
const result = await sql`
|
|
66
|
+
UPDATE profiles SET ${sql(safeData, ...Object.keys(safeData))}
|
|
67
|
+
WHERE id = ${id} RETURNING *
|
|
68
|
+
`;
|
|
69
|
+
return result[0];
|
|
70
|
+
};
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Pattern 2: sanitizeSort() for Dynamic ORDER BY
|
|
74
|
+
|
|
75
|
+
Create a reusable utility that validates sort input against a whitelist:
|
|
76
|
+
|
|
77
|
+
```javascript
|
|
78
|
+
// server/middleware/inputValidation.js
|
|
79
|
+
export const sanitizeSort = (sortInput, allowedColumns, defaultSort = 'created_at DESC') => {
|
|
80
|
+
if (!sortInput || typeof sortInput !== 'string') return defaultSort;
|
|
81
|
+
const parts = sortInput.trim().split(/\s+/);
|
|
82
|
+
const column = parts[0].replace(/^[a-z]+\./i, ''); // Strip table prefix
|
|
83
|
+
const direction = (parts[1] || 'ASC').toUpperCase();
|
|
84
|
+
if (!allowedColumns.includes(column)) return defaultSort;
|
|
85
|
+
if (direction !== 'ASC' && direction !== 'DESC') return defaultSort;
|
|
86
|
+
// Preserve original table prefix if present (e.g., "p.created_at")
|
|
87
|
+
const prefix = sortInput.trim().match(/^([a-z]+\.)/i)?.[1] || '';
|
|
88
|
+
return `${prefix}${column} ${direction}`;
|
|
89
|
+
};
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Usage in models:
|
|
93
|
+
|
|
94
|
+
```javascript
|
|
95
|
+
import { sanitizeSort } from '../middleware/inputValidation.js';
|
|
96
|
+
|
|
97
|
+
const ALLOWED_SORT = ['created_at', 'name', 'email', 'role', 'updated_at'];
|
|
98
|
+
|
|
99
|
+
export const getUsers = async (options = {}) => {
|
|
100
|
+
const validSort = sanitizeSort(options.sort, ALLOWED_SORT);
|
|
101
|
+
const limit = Number(options.limit) || 20;
|
|
102
|
+
const offset = Number(options.offset) || 0;
|
|
103
|
+
|
|
104
|
+
// validSort is guaranteed safe — use in sql.unsafe for ORDER BY only
|
|
105
|
+
const result = await sql.unsafe(
|
|
106
|
+
`SELECT * FROM profiles ORDER BY ${validSort} LIMIT $1 OFFSET $2`,
|
|
107
|
+
[limit, offset]
|
|
108
|
+
);
|
|
109
|
+
return result;
|
|
110
|
+
};
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Implementation Steps
|
|
114
|
+
|
|
115
|
+
1. Identify all `sql.unsafe()` calls with string interpolation
|
|
116
|
+
2. For UPDATE queries: create column whitelist Set, use `sql()` helper
|
|
117
|
+
3. For ORDER BY: create `sanitizeSort()`, define model-specific allowed columns
|
|
118
|
+
4. For LIMIT/OFFSET: cast to `Number()` — never interpolate raw strings
|
|
119
|
+
5. Test with injection payloads: `name;DROP TABLE x--`, `name UNION SELECT *`
|
|
120
|
+
|
|
121
|
+
## When to Use
|
|
122
|
+
|
|
123
|
+
- Any postgres.js project with dynamic UPDATE queries
|
|
124
|
+
- Any endpoint accepting `?sort=` query parameters
|
|
125
|
+
- Models that build SQL from user-provided field names
|
|
126
|
+
- REST APIs with sortable list endpoints
|
|
127
|
+
|
|
128
|
+
## When NOT to Use
|
|
129
|
+
|
|
130
|
+
- If using an ORM (Prisma, Sequelize) — they handle parameterization
|
|
131
|
+
- Static SQL with no dynamic parts — tagged templates are already safe
|
|
132
|
+
- If column names come from trusted server-side code only
|
|
133
|
+
|
|
134
|
+
## Common Mistakes
|
|
135
|
+
|
|
136
|
+
- Trusting `Object.keys()` from request body — attackers control key names
|
|
137
|
+
- Using `sql.unsafe()` when `sql` tagged template would work
|
|
138
|
+
- Forgetting to whitelist new columns after schema changes
|
|
139
|
+
- Allowing table prefixes without validation (e.g., `information_schema.columns`)
|
|
140
|
+
- Only validating column name but not direction (`ASC`/`DESC`)
|
|
141
|
+
|
|
142
|
+
## Related Skills
|
|
143
|
+
|
|
144
|
+
- [POSTGRES_SQL_TEMPLATE_BINDING_ERROR](../database-solutions/POSTGRES_SQL_TEMPLATE_BINDING_ERROR.md) - Template binding issues
|
|
145
|
+
- [PRODUCTION_HARDENING_DOCUMENTATION](../deployment-security/PRODUCTION_HARDENING_DOCUMENTATION.md) - General hardening
|
|
146
|
+
|
|
147
|
+
## References
|
|
148
|
+
|
|
149
|
+
- postgres.js docs: https://github.com/porsager/postgres#dynamic-columns
|
|
150
|
+
- OWASP SQL Injection: https://owasp.org/www-community/attacks/SQL_Injection
|
|
151
|
+
- Contributed from: my-other-project (Feb 2026 security audit)
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Supabase Connection Pooler - IPv4 Fix
|
|
2
|
+
|
|
3
|
+
## Problem
|
|
4
|
+
VPS cannot connect to Supabase PostgreSQL database. Two errors occur:
|
|
5
|
+
|
|
6
|
+
### Error 1: IPv6 Unreachable (Direct Connection)
|
|
7
|
+
```
|
|
8
|
+
Error: connect ENETUNREACH 2600:1f18:2e13:9d18:88be:d4c9:6b70:87e9:5432
|
|
9
|
+
```
|
|
10
|
+
**Cause:** Direct connection (`db.[project].supabase.co:5432`) resolves to IPv6, but VPS has no IPv6 connectivity.
|
|
11
|
+
|
|
12
|
+
### Error 2: Connection Timeout (Transaction Pooler)
|
|
13
|
+
```
|
|
14
|
+
Error: write CONNECT_TIMEOUT aws-1-us-east-1.pooler.supabase.com:6543
|
|
15
|
+
```
|
|
16
|
+
**Cause:** Transaction pooler on port 6543 may have firewall restrictions or require special configuration.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Solution: Use Session Pooler with URL-Encoded Password
|
|
21
|
+
|
|
22
|
+
### Working Connection String Format
|
|
23
|
+
```
|
|
24
|
+
postgresql://postgres.[PROJECT_REF]:[URL_ENCODED_PASSWORD]@aws-1-us-east-1.pooler.supabase.com:5432/postgres
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Key Points
|
|
28
|
+
|
|
29
|
+
1. **Use Session Pooler (port 5432)** - NOT transaction pooler (port 6543)
|
|
30
|
+
- Session pooler: `pooler.supabase.com:5432`
|
|
31
|
+
- Transaction pooler: `pooler.supabase.com:6543`
|
|
32
|
+
|
|
33
|
+
2. **URL Encode Special Characters in Password**
|
|
34
|
+
- `*` → `%2A`
|
|
35
|
+
- `@` → `%40`
|
|
36
|
+
- `/` → `%2F`
|
|
37
|
+
- `&` → `%26`
|
|
38
|
+
- `#` → `%23`
|
|
39
|
+
|
|
40
|
+
Example: `Jubileess_*7*` → `Jubileess_%2A7%2A`
|
|
41
|
+
|
|
42
|
+
3. **Username Format for Pooler**
|
|
43
|
+
- Direct: `postgres`
|
|
44
|
+
- Pooler: `postgres.[PROJECT_REF]`
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Connection String Comparison
|
|
49
|
+
|
|
50
|
+
### Direct Connection (IPv6 issues)
|
|
51
|
+
```
|
|
52
|
+
postgresql://postgres:PASSWORD@db.[PROJECT].supabase.co:5432/postgres
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Transaction Pooler (may timeout)
|
|
56
|
+
```
|
|
57
|
+
postgresql://postgres.[PROJECT]:PASSWORD@aws-1-us-east-1.pooler.supabase.com:6543/postgres?pgbouncer=true
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Session Pooler (RECOMMENDED for VPS)
|
|
61
|
+
```
|
|
62
|
+
postgresql://postgres.[PROJECT]:URL_ENCODED_PASSWORD@aws-1-us-east-1.pooler.supabase.com:5432/postgres
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## How to Find Your Pooler URL
|
|
68
|
+
|
|
69
|
+
1. Go to Supabase Dashboard
|
|
70
|
+
2. Click "Connect" button
|
|
71
|
+
3. Select "Connection String" tab
|
|
72
|
+
4. Change "Method" dropdown to "Session pooler"
|
|
73
|
+
5. Note: It says "IPv4 compatible" at the bottom
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Verification
|
|
78
|
+
|
|
79
|
+
After updating `.env`, restart the server and check logs:
|
|
80
|
+
```bash
|
|
81
|
+
pm2 restart all
|
|
82
|
+
pm2 logs lms-server --lines 20
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**Success indicator:**
|
|
86
|
+
```
|
|
87
|
+
✅ [DATABASE] Connection successful! Supabase PostgreSQL is ready.
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**Failure indicators:**
|
|
91
|
+
```
|
|
92
|
+
❌ [DATABASE] Failed to connect to Supabase PostgreSQL
|
|
93
|
+
Error: connect ENETUNREACH ... # IPv6 issue
|
|
94
|
+
Error: write CONNECT_TIMEOUT ... # Pooler/firewall issue
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## References
|
|
100
|
+
- [Supabase Connection Management](https://supabase.com/docs/guides/database/connection-management)
|
|
101
|
+
- [Supabase GitHub Discussion #21789](https://github.com/orgs/supabase/discussions/21789)
|
|
102
|
+
- [Supavisor FAQ](https://supabase.com/docs/guides/troubleshooting/supavisor-faq-YyP5tI)
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: powershell-bash-interop
|
|
3
|
+
category: system-context
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
contributed: 2026-02-24
|
|
6
|
+
contributor: dominion-flow
|
|
7
|
+
tags: [powershell, bash, windows, shell, interop, scripts]
|
|
8
|
+
difficulty: medium
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# PowerShell & Bash Interop
|
|
12
|
+
|
|
13
|
+
## Problem
|
|
14
|
+
|
|
15
|
+
Claude Code's shell is bash (Git Bash on Windows), but some Windows operations require PowerShell (COM objects, system shortcuts, Windows APIs). Mixing syntax causes cryptic failures.
|
|
16
|
+
|
|
17
|
+
## Solution Pattern
|
|
18
|
+
|
|
19
|
+
Know which shell to use for what, and how to call one from the other.
|
|
20
|
+
|
|
21
|
+
## Shell Selection Guide
|
|
22
|
+
|
|
23
|
+
| Task | Use | Why |
|
|
24
|
+
|------|-----|-----|
|
|
25
|
+
| Git operations | Bash | Native git |
|
|
26
|
+
| npm/node commands | Bash | Works in both, bash is default |
|
|
27
|
+
| File operations (basic) | Bash | `cp`, `mv`, `rm` work fine |
|
|
28
|
+
| Desktop shortcuts | PowerShell | Requires COM objects |
|
|
29
|
+
| Windows services | PowerShell | `Get-Service`, `Start-Service` |
|
|
30
|
+
| Registry access | PowerShell | `Get-ItemProperty` |
|
|
31
|
+
| Environment variables (persistent) | PowerShell | `[Environment]::SetEnvironmentVariable` |
|
|
32
|
+
| Docker | Bash | CLI is the same everywhere |
|
|
33
|
+
| `curl` / `wget` | Bash | PowerShell's `curl` is aliased to `Invoke-WebRequest` |
|
|
34
|
+
|
|
35
|
+
## Calling PowerShell from Bash
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
# One-liner
|
|
39
|
+
powershell.exe -Command "Get-Process | Where-Object {$_.ProcessName -eq 'node'}"
|
|
40
|
+
|
|
41
|
+
# Multi-line script
|
|
42
|
+
powershell.exe -Command "
|
|
43
|
+
\$desktop = [Environment]::GetFolderPath('Desktop')
|
|
44
|
+
\$shortcut = (New-Object -ComObject WScript.Shell).CreateShortcut(\"\$desktop\\MyApp.lnk\")
|
|
45
|
+
\$shortcut.TargetPath = 'C:\\path\\to\\my-app\\start.bat'
|
|
46
|
+
\$shortcut.Save()
|
|
47
|
+
"
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**Key escaping rules in bash → PowerShell:**
|
|
51
|
+
- `$` must be escaped as `\$` (bash would expand it otherwise)
|
|
52
|
+
- Use single quotes inside PowerShell where possible
|
|
53
|
+
- Backslashes in paths must be doubled or use forward slashes
|
|
54
|
+
|
|
55
|
+
## Calling Bash from PowerShell
|
|
56
|
+
|
|
57
|
+
```powershell
|
|
58
|
+
# Run a bash command
|
|
59
|
+
bash -c "git status"
|
|
60
|
+
|
|
61
|
+
# Run a bash script
|
|
62
|
+
bash -c "cd /c/path/to/my-project && npm test"
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Common Pitfalls
|
|
66
|
+
|
|
67
|
+
1. **`curl` in PowerShell** — It's actually `Invoke-WebRequest`, not `curl`. Use bash for real `curl`.
|
|
68
|
+
2. **Path separators** — PowerShell uses `\`, bash uses `/`. Both work in most tools on Windows.
|
|
69
|
+
3. **Exit codes** — PowerShell `$LASTEXITCODE` vs bash `$?`. They don't bridge cleanly.
|
|
70
|
+
4. **`rm`** — In PowerShell it's `Remove-Item`. In bash it's GNU `rm`. Different flags.
|
|
71
|
+
|
|
72
|
+
## When to Use
|
|
73
|
+
|
|
74
|
+
- Creating desktop shortcuts (New Application Init Checklist)
|
|
75
|
+
- Managing Windows services
|
|
76
|
+
- Any task requiring Windows-specific APIs
|
|
77
|
+
- Debugging shell-related failures
|
|
78
|
+
|
|
79
|
+
## When NOT to Use
|
|
80
|
+
|
|
81
|
+
- Standard dev operations (git, npm, docker) — just use bash
|
|
82
|
+
- Linux/Mac environments
|