@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,605 @@
|
|
|
1
|
+
# Image Optimization Pipeline (Sharp.js)
|
|
2
|
+
## Description
|
|
3
|
+
|
|
4
|
+
Production-ready Node.js image processing pipeline using Sharp (libvips). Covers resizing, format conversion, responsive image generation, metadata handling, compositing, batch processing, and Express/Multer integration.
|
|
5
|
+
|
|
6
|
+
## When to Use
|
|
7
|
+
|
|
8
|
+
- Building an upload pipeline that needs thumbnails, responsive sizes, or format conversion
|
|
9
|
+
- Optimizing existing images for web delivery (WebP, AVIF)
|
|
10
|
+
- Generating watermarked or branded image variants
|
|
11
|
+
- Extracting image metadata or dominant colors
|
|
12
|
+
- Any server-side image manipulation in Node.js
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Sharp.js Core Operations
|
|
17
|
+
|
|
18
|
+
### Installation
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm install sharp
|
|
22
|
+
# or
|
|
23
|
+
bun add sharp
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Sharp ships prebuilt binaries for most platforms. No native compilation needed.
|
|
27
|
+
|
|
28
|
+
### Resize
|
|
29
|
+
|
|
30
|
+
```javascript
|
|
31
|
+
import sharp from 'sharp';
|
|
32
|
+
|
|
33
|
+
// Fit modes control how the image fills the target dimensions
|
|
34
|
+
await sharp('input.jpg')
|
|
35
|
+
.resize(800, 600, { fit: 'cover' }) // Crop to fill exactly 800x600 (default)
|
|
36
|
+
.toFile('output-cover.jpg');
|
|
37
|
+
|
|
38
|
+
await sharp('input.jpg')
|
|
39
|
+
.resize(800, 600, { fit: 'contain', background: '#ffffff' }) // Letterbox, no crop
|
|
40
|
+
.toFile('output-contain.jpg');
|
|
41
|
+
|
|
42
|
+
await sharp('input.jpg')
|
|
43
|
+
.resize(800, 600, { fit: 'fill' }) // Stretch/squash to exact dimensions
|
|
44
|
+
.toFile('output-fill.jpg');
|
|
45
|
+
|
|
46
|
+
await sharp('input.jpg')
|
|
47
|
+
.resize(800, 600, { fit: 'inside' }) // Shrink to fit inside 800x600, preserve aspect
|
|
48
|
+
.toFile('output-inside.jpg');
|
|
49
|
+
|
|
50
|
+
await sharp('input.jpg')
|
|
51
|
+
.resize(800, 600, { fit: 'outside' }) // Shrink so smallest side matches, preserve aspect
|
|
52
|
+
.toFile('output-outside.jpg');
|
|
53
|
+
|
|
54
|
+
// Resize by width only (auto-calculate height)
|
|
55
|
+
await sharp('input.jpg')
|
|
56
|
+
.resize({ width: 1200 })
|
|
57
|
+
.toFile('output-width.jpg');
|
|
58
|
+
|
|
59
|
+
// Resize with position control for cover mode
|
|
60
|
+
await sharp('input.jpg')
|
|
61
|
+
.resize(400, 400, { fit: 'cover', position: 'attention' }) // Smart crop using saliency
|
|
62
|
+
.toFile('output-smart.jpg');
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Format Conversion
|
|
66
|
+
|
|
67
|
+
```javascript
|
|
68
|
+
// JPEG to WebP
|
|
69
|
+
await sharp('photo.jpg')
|
|
70
|
+
.webp({ quality: 80 })
|
|
71
|
+
.toFile('photo.webp');
|
|
72
|
+
|
|
73
|
+
// PNG to AVIF
|
|
74
|
+
await sharp('image.png')
|
|
75
|
+
.avif({ quality: 65 })
|
|
76
|
+
.toFile('image.avif');
|
|
77
|
+
|
|
78
|
+
// Any format to JPEG with specific settings
|
|
79
|
+
await sharp('input.png')
|
|
80
|
+
.jpeg({
|
|
81
|
+
quality: 85,
|
|
82
|
+
mozjpeg: true, // Use mozjpeg encoder for smaller files
|
|
83
|
+
chromaSubsampling: '4:4:4', // Better color for sharp edges
|
|
84
|
+
})
|
|
85
|
+
.toFile('output.jpg');
|
|
86
|
+
|
|
87
|
+
// Convert to multiple formats from a single read
|
|
88
|
+
const pipeline = sharp('source.jpg');
|
|
89
|
+
await Promise.all([
|
|
90
|
+
pipeline.clone().webp({ quality: 80 }).toFile('output.webp'),
|
|
91
|
+
pipeline.clone().avif({ quality: 65 }).toFile('output.avif'),
|
|
92
|
+
pipeline.clone().jpeg({ quality: 85, mozjpeg: true }).toFile('output.jpg'),
|
|
93
|
+
]);
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Responsive Image Generation
|
|
97
|
+
|
|
98
|
+
```javascript
|
|
99
|
+
const WIDTHS = [320, 640, 1024, 1920];
|
|
100
|
+
|
|
101
|
+
async function generateResponsiveImages(inputPath, outputDir, baseName) {
|
|
102
|
+
const pipeline = sharp(inputPath);
|
|
103
|
+
const metadata = await pipeline.metadata();
|
|
104
|
+
|
|
105
|
+
const results = await Promise.all(
|
|
106
|
+
WIDTHS
|
|
107
|
+
.filter(w => w <= metadata.width) // Don't upscale
|
|
108
|
+
.flatMap(width => [
|
|
109
|
+
pipeline.clone()
|
|
110
|
+
.resize({ width })
|
|
111
|
+
.webp({ quality: 80 })
|
|
112
|
+
.toFile(`${outputDir}/${baseName}-${width}w.webp`),
|
|
113
|
+
pipeline.clone()
|
|
114
|
+
.resize({ width })
|
|
115
|
+
.avif({ quality: 65 })
|
|
116
|
+
.toFile(`${outputDir}/${baseName}-${width}w.avif`),
|
|
117
|
+
])
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
return results;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Usage
|
|
124
|
+
await generateResponsiveImages('./uploads/hero.jpg', './public/images', 'hero');
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Metadata Extraction and Stripping
|
|
128
|
+
|
|
129
|
+
```javascript
|
|
130
|
+
// Extract metadata
|
|
131
|
+
const metadata = await sharp('photo.jpg').metadata();
|
|
132
|
+
console.log({
|
|
133
|
+
width: metadata.width, // 4032
|
|
134
|
+
height: metadata.height, // 3024
|
|
135
|
+
format: metadata.format, // 'jpeg'
|
|
136
|
+
space: metadata.space, // 'srgb'
|
|
137
|
+
channels: metadata.channels, // 3
|
|
138
|
+
hasAlpha: metadata.hasAlpha, // false
|
|
139
|
+
orientation: metadata.orientation, // EXIF orientation (1-8)
|
|
140
|
+
exif: metadata.exif, // Buffer of raw EXIF data
|
|
141
|
+
density: metadata.density, // DPI (72, 300, etc.)
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
// Strip all metadata (EXIF, IPTC, XMP) for privacy
|
|
145
|
+
await sharp('photo-with-gps.jpg')
|
|
146
|
+
.withMetadata(false) // Strips everything
|
|
147
|
+
.toFile('photo-clean.jpg');
|
|
148
|
+
|
|
149
|
+
// Keep metadata but fix orientation
|
|
150
|
+
await sharp('rotated.jpg')
|
|
151
|
+
.rotate() // Auto-rotate based on EXIF orientation
|
|
152
|
+
.withMetadata() // Preserve other metadata
|
|
153
|
+
.toFile('fixed.jpg');
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Composite / Overlay (Watermarks, Text)
|
|
157
|
+
|
|
158
|
+
```javascript
|
|
159
|
+
// Watermark overlay
|
|
160
|
+
await sharp('photo.jpg')
|
|
161
|
+
.composite([{
|
|
162
|
+
input: 'watermark.png',
|
|
163
|
+
gravity: 'southeast', // Bottom-right corner
|
|
164
|
+
blend: 'over',
|
|
165
|
+
}])
|
|
166
|
+
.toFile('watermarked.jpg');
|
|
167
|
+
|
|
168
|
+
// Semi-transparent overlay with offset
|
|
169
|
+
await sharp('photo.jpg')
|
|
170
|
+
.composite([{
|
|
171
|
+
input: Buffer.from(
|
|
172
|
+
`<svg width="200" height="50">
|
|
173
|
+
<text x="10" y="35" font-size="28" fill="white" opacity="0.7"
|
|
174
|
+
font-family="sans-serif">My Brand</text>
|
|
175
|
+
</svg>`
|
|
176
|
+
),
|
|
177
|
+
top: 20,
|
|
178
|
+
left: 20,
|
|
179
|
+
}])
|
|
180
|
+
.toFile('branded.jpg');
|
|
181
|
+
|
|
182
|
+
// Multiple overlays
|
|
183
|
+
await sharp('background.jpg')
|
|
184
|
+
.composite([
|
|
185
|
+
{ input: 'logo.png', gravity: 'northwest', blend: 'over' },
|
|
186
|
+
{ input: 'badge.png', gravity: 'northeast', blend: 'over' },
|
|
187
|
+
])
|
|
188
|
+
.toFile('composed.jpg');
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### Blur, Sharpen, Rotate, Flip
|
|
192
|
+
|
|
193
|
+
```javascript
|
|
194
|
+
// Gaussian blur (sigma 1-1000)
|
|
195
|
+
await sharp('input.jpg').blur(5).toFile('blurred.jpg');
|
|
196
|
+
|
|
197
|
+
// Sharpen
|
|
198
|
+
await sharp('input.jpg')
|
|
199
|
+
.sharpen({
|
|
200
|
+
sigma: 1.5, // Gaussian mask size
|
|
201
|
+
m1: 1.0, // Flat area sharpening
|
|
202
|
+
m2: 2.0, // Edge sharpening
|
|
203
|
+
})
|
|
204
|
+
.toFile('sharpened.jpg');
|
|
205
|
+
|
|
206
|
+
// Rotate by exact degrees (background fills empty space)
|
|
207
|
+
await sharp('input.jpg')
|
|
208
|
+
.rotate(45, { background: '#00000000' }) // Transparent fill
|
|
209
|
+
.toFile('rotated.png');
|
|
210
|
+
|
|
211
|
+
// Flip and flop
|
|
212
|
+
await sharp('input.jpg').flip().toFile('flipped.jpg'); // Vertical flip
|
|
213
|
+
await sharp('input.jpg').flop().toFile('flopped.jpg'); // Horizontal mirror
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### Extract Dominant Color Palette
|
|
217
|
+
|
|
218
|
+
```javascript
|
|
219
|
+
// Get dominant color via stats
|
|
220
|
+
const { dominant } = await sharp('photo.jpg').stats();
|
|
221
|
+
console.log(`Dominant: rgb(${dominant.r}, ${dominant.g}, ${dominant.b})`);
|
|
222
|
+
|
|
223
|
+
// Extract a palette by downscaling heavily, then reading pixels
|
|
224
|
+
async function extractPalette(inputPath, colorCount = 5) {
|
|
225
|
+
const { data, info } = await sharp(inputPath)
|
|
226
|
+
.resize(colorCount, 1, { fit: 'cover' }) // Crush to N pixels
|
|
227
|
+
.raw()
|
|
228
|
+
.toBuffer({ resolveWithObject: true });
|
|
229
|
+
|
|
230
|
+
const colors = [];
|
|
231
|
+
for (let i = 0; i < info.width; i++) {
|
|
232
|
+
const offset = i * info.channels;
|
|
233
|
+
colors.push({
|
|
234
|
+
r: data[offset],
|
|
235
|
+
g: data[offset + 1],
|
|
236
|
+
b: data[offset + 2],
|
|
237
|
+
hex: `#${data[offset].toString(16).padStart(2, '0')}${data[offset + 1].toString(16).padStart(2, '0')}${data[offset + 2].toString(16).padStart(2, '0')}`,
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
return colors;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
const palette = await extractPalette('sunset.jpg', 5);
|
|
244
|
+
// [{ r: 214, g: 87, b: 42, hex: '#d6572a' }, ...]
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
## Production Pipeline Pattern
|
|
250
|
+
|
|
251
|
+
Complete Express middleware that handles upload, resizes to multiple sizes, converts to WebP and AVIF, strips metadata, and saves to disk.
|
|
252
|
+
|
|
253
|
+
```javascript
|
|
254
|
+
import sharp from 'sharp';
|
|
255
|
+
import path from 'path';
|
|
256
|
+
import fs from 'fs/promises';
|
|
257
|
+
import crypto from 'crypto';
|
|
258
|
+
|
|
259
|
+
const SIZES = {
|
|
260
|
+
thumb: { width: 320, quality: { webp: 70, avif: 55 } },
|
|
261
|
+
medium: { width: 640, quality: { webp: 78, avif: 60 } },
|
|
262
|
+
large: { width: 1024, quality: { webp: 80, avif: 65 } },
|
|
263
|
+
full: { width: 1920, quality: { webp: 82, avif: 68 } },
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
const FORMATS = ['webp', 'avif'];
|
|
267
|
+
const OUTPUT_DIR = './public/uploads/processed';
|
|
268
|
+
|
|
269
|
+
async function processImage(inputBuffer, originalName) {
|
|
270
|
+
const id = crypto.randomUUID();
|
|
271
|
+
const baseName = path.parse(originalName).name;
|
|
272
|
+
const imageDir = path.join(OUTPUT_DIR, id);
|
|
273
|
+
await fs.mkdir(imageDir, { recursive: true });
|
|
274
|
+
|
|
275
|
+
const pipeline = sharp(inputBuffer).rotate().withMetadata(false);
|
|
276
|
+
const metadata = await pipeline.metadata();
|
|
277
|
+
|
|
278
|
+
const variants = [];
|
|
279
|
+
|
|
280
|
+
for (const [sizeName, config] of Object.entries(SIZES)) {
|
|
281
|
+
if (config.width > metadata.width) continue; // Never upscale
|
|
282
|
+
|
|
283
|
+
for (const format of FORMATS) {
|
|
284
|
+
const filename = `${baseName}-${sizeName}.${format}`;
|
|
285
|
+
const outputPath = path.join(imageDir, filename);
|
|
286
|
+
|
|
287
|
+
await pipeline.clone()
|
|
288
|
+
.resize({ width: config.width, fit: 'inside' })
|
|
289
|
+
[format]({ quality: config.quality[format] })
|
|
290
|
+
.toFile(outputPath);
|
|
291
|
+
|
|
292
|
+
variants.push({
|
|
293
|
+
size: sizeName,
|
|
294
|
+
format,
|
|
295
|
+
width: config.width,
|
|
296
|
+
path: `/uploads/processed/${id}/${filename}`,
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
return { id, originalName, variants };
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// Express middleware
|
|
305
|
+
export async function imageProcessingMiddleware(req, res, next) {
|
|
306
|
+
if (!req.file) return next();
|
|
307
|
+
|
|
308
|
+
try {
|
|
309
|
+
const result = await processImage(req.file.buffer, req.file.originalname);
|
|
310
|
+
req.processedImage = result;
|
|
311
|
+
next();
|
|
312
|
+
} catch (err) {
|
|
313
|
+
next(new Error(`Image processing failed: ${err.message}`));
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
---
|
|
319
|
+
|
|
320
|
+
## Responsive Image HTML
|
|
321
|
+
|
|
322
|
+
Serve the processed variants with proper `<picture>` tags:
|
|
323
|
+
|
|
324
|
+
```html
|
|
325
|
+
<picture>
|
|
326
|
+
<!-- AVIF: best compression, modern browsers -->
|
|
327
|
+
<source
|
|
328
|
+
type="image/avif"
|
|
329
|
+
srcset="
|
|
330
|
+
/uploads/processed/abc123/hero-thumb.avif 320w,
|
|
331
|
+
/uploads/processed/abc123/hero-medium.avif 640w,
|
|
332
|
+
/uploads/processed/abc123/hero-large.avif 1024w,
|
|
333
|
+
/uploads/processed/abc123/hero-full.avif 1920w
|
|
334
|
+
"
|
|
335
|
+
sizes="(max-width: 640px) 100vw, (max-width: 1024px) 80vw, 1200px"
|
|
336
|
+
/>
|
|
337
|
+
|
|
338
|
+
<!-- WebP: fallback for older browsers -->
|
|
339
|
+
<source
|
|
340
|
+
type="image/webp"
|
|
341
|
+
srcset="
|
|
342
|
+
/uploads/processed/abc123/hero-thumb.webp 320w,
|
|
343
|
+
/uploads/processed/abc123/hero-medium.webp 640w,
|
|
344
|
+
/uploads/processed/abc123/hero-large.webp 1024w,
|
|
345
|
+
/uploads/processed/abc123/hero-full.webp 1920w
|
|
346
|
+
"
|
|
347
|
+
sizes="(max-width: 640px) 100vw, (max-width: 1024px) 80vw, 1200px"
|
|
348
|
+
/>
|
|
349
|
+
|
|
350
|
+
<!-- JPEG: ultimate fallback -->
|
|
351
|
+
<img
|
|
352
|
+
src="/uploads/processed/abc123/hero-large.jpg"
|
|
353
|
+
alt="Course hero image"
|
|
354
|
+
width="1024"
|
|
355
|
+
height="576"
|
|
356
|
+
loading="lazy"
|
|
357
|
+
decoding="async"
|
|
358
|
+
/>
|
|
359
|
+
</picture>
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
**`sizes` attribute explained:**
|
|
363
|
+
- `(max-width: 640px) 100vw` — on mobile, the image fills the viewport
|
|
364
|
+
- `(max-width: 1024px) 80vw` — on tablets, it fills 80% of the viewport
|
|
365
|
+
- `1200px` — on desktop, it never exceeds 1200px display width
|
|
366
|
+
|
|
367
|
+
The browser picks the smallest image from `srcset` that satisfies `sizes`.
|
|
368
|
+
|
|
369
|
+
---
|
|
370
|
+
|
|
371
|
+
## Format Decision Matrix
|
|
372
|
+
|
|
373
|
+
| Use Case | Format | Quality | Why |
|
|
374
|
+
|----------|--------|---------|-----|
|
|
375
|
+
| Photos (hero, gallery) | WebP 80 / AVIF 65 | High visual | AVIF 50% smaller than JPEG at equivalent quality |
|
|
376
|
+
| Thumbnails (cards, lists) | WebP 70 | Small dims reduce quality needs | Fast decode at small sizes matters more than fidelity |
|
|
377
|
+
| Icons / logos | SVG or PNG | Lossless | Sharp edges; SVG scales infinitely; PNG for raster icons |
|
|
378
|
+
| OG / social images | PNG 90 | High | Social platforms re-compress; start high to survive double encoding |
|
|
379
|
+
| User avatars | WebP 75 | Small crops | Typically 128-256px; WebP handles small images well |
|
|
380
|
+
| Screenshots / text-heavy | PNG or WebP lossless | Lossless | Text artifacts are very visible in lossy formats |
|
|
381
|
+
| Background patterns | WebP 85 | Medium-high | Repeated patterns show banding at low quality |
|
|
382
|
+
|
|
383
|
+
---
|
|
384
|
+
|
|
385
|
+
## Batch Processing Script
|
|
386
|
+
|
|
387
|
+
Convert an entire directory of images to optimized WebP and AVIF:
|
|
388
|
+
|
|
389
|
+
```javascript
|
|
390
|
+
#!/usr/bin/env node
|
|
391
|
+
// batch-optimize.mjs — Convert all images in a directory
|
|
392
|
+
import sharp from 'sharp';
|
|
393
|
+
import fs from 'fs/promises';
|
|
394
|
+
import path from 'path';
|
|
395
|
+
|
|
396
|
+
const INPUT_DIR = process.argv[2] || './images';
|
|
397
|
+
const OUTPUT_DIR = process.argv[3] || './images/optimized';
|
|
398
|
+
const MAX_WIDTH = 1920;
|
|
399
|
+
const CONCURRENCY = 4; // Process 4 images simultaneously
|
|
400
|
+
|
|
401
|
+
const IMAGE_EXTENSIONS = new Set(['.jpg', '.jpeg', '.png', '.tiff', '.bmp', '.gif']);
|
|
402
|
+
|
|
403
|
+
async function optimizeImage(inputPath, outputDir) {
|
|
404
|
+
const baseName = path.parse(inputPath).name;
|
|
405
|
+
const pipeline = sharp(inputPath).rotate().withMetadata(false);
|
|
406
|
+
const meta = await pipeline.metadata();
|
|
407
|
+
const needsResize = meta.width > MAX_WIDTH;
|
|
408
|
+
|
|
409
|
+
const tasks = [
|
|
410
|
+
pipeline.clone()
|
|
411
|
+
.resize(needsResize ? { width: MAX_WIDTH } : undefined)
|
|
412
|
+
.webp({ quality: 80 })
|
|
413
|
+
.toFile(path.join(outputDir, `${baseName}.webp`)),
|
|
414
|
+
pipeline.clone()
|
|
415
|
+
.resize(needsResize ? { width: MAX_WIDTH } : undefined)
|
|
416
|
+
.avif({ quality: 65 })
|
|
417
|
+
.toFile(path.join(outputDir, `${baseName}.avif`)),
|
|
418
|
+
];
|
|
419
|
+
|
|
420
|
+
const [webpResult, avifResult] = await Promise.all(tasks);
|
|
421
|
+
const originalSize = (await fs.stat(inputPath)).size;
|
|
422
|
+
|
|
423
|
+
return {
|
|
424
|
+
file: baseName,
|
|
425
|
+
original: `${(originalSize / 1024).toFixed(0)}KB`,
|
|
426
|
+
webp: `${(webpResult.size / 1024).toFixed(0)}KB (${((1 - webpResult.size / originalSize) * 100).toFixed(0)}% smaller)`,
|
|
427
|
+
avif: `${(avifResult.size / 1024).toFixed(0)}KB (${((1 - avifResult.size / originalSize) * 100).toFixed(0)}% smaller)`,
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
async function main() {
|
|
432
|
+
await fs.mkdir(OUTPUT_DIR, { recursive: true });
|
|
433
|
+
|
|
434
|
+
const files = (await fs.readdir(INPUT_DIR))
|
|
435
|
+
.filter(f => IMAGE_EXTENSIONS.has(path.extname(f).toLowerCase()));
|
|
436
|
+
|
|
437
|
+
console.log(`Processing ${files.length} images (concurrency: ${CONCURRENCY})...\n`);
|
|
438
|
+
|
|
439
|
+
// Process in batches to control memory
|
|
440
|
+
for (let i = 0; i < files.length; i += CONCURRENCY) {
|
|
441
|
+
const batch = files.slice(i, i + CONCURRENCY);
|
|
442
|
+
const results = await Promise.all(
|
|
443
|
+
batch.map(f => optimizeImage(path.join(INPUT_DIR, f), OUTPUT_DIR))
|
|
444
|
+
);
|
|
445
|
+
results.forEach(r => console.log(`${r.file}: ${r.original} -> WebP ${r.webp}, AVIF ${r.avif}`));
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
console.log('\nDone.');
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
main().catch(console.error);
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
Run: `node batch-optimize.mjs ./photos ./photos/optimized`
|
|
455
|
+
|
|
456
|
+
---
|
|
457
|
+
|
|
458
|
+
## Performance Tips
|
|
459
|
+
|
|
460
|
+
### Streaming vs Buffer
|
|
461
|
+
|
|
462
|
+
```javascript
|
|
463
|
+
// BUFFER MODE — holds entire image in memory (simpler, fine for < 20MB)
|
|
464
|
+
const buffer = await sharp(inputBuffer)
|
|
465
|
+
.resize(800)
|
|
466
|
+
.webp()
|
|
467
|
+
.toBuffer();
|
|
468
|
+
|
|
469
|
+
// STREAMING MODE — lower memory for large images or high concurrency
|
|
470
|
+
import { createReadStream, createWriteStream } from 'fs';
|
|
471
|
+
|
|
472
|
+
const transform = sharp().resize(800).webp();
|
|
473
|
+
createReadStream('large-input.tiff')
|
|
474
|
+
.pipe(transform)
|
|
475
|
+
.pipe(createWriteStream('output.webp'));
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
### Sharp Concurrency Settings
|
|
479
|
+
|
|
480
|
+
```javascript
|
|
481
|
+
import sharp from 'sharp';
|
|
482
|
+
|
|
483
|
+
// Default: uses all CPU cores for libvips thread pool
|
|
484
|
+
// In a web server with many concurrent requests, LOWER this to prevent thread contention
|
|
485
|
+
sharp.concurrency(2); // Use only 2 threads per Sharp operation
|
|
486
|
+
|
|
487
|
+
// Check current setting
|
|
488
|
+
console.log(sharp.concurrency()); // 2
|
|
489
|
+
|
|
490
|
+
// Guideline:
|
|
491
|
+
// - CLI batch script: sharp.concurrency(os.cpus().length) — use all cores
|
|
492
|
+
// - Web server (low traffic): sharp.concurrency(2)
|
|
493
|
+
// - Web server (high traffic): sharp.concurrency(1) — let Node handle parallelism
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
### Memory Management
|
|
497
|
+
|
|
498
|
+
```javascript
|
|
499
|
+
// Sharp caches decoded images by default. In long-running servers, control the cache:
|
|
500
|
+
sharp.cache({ memory: 256, files: 20, items: 100 });
|
|
501
|
+
|
|
502
|
+
// Or disable caching entirely if each image is processed once
|
|
503
|
+
sharp.cache(false);
|
|
504
|
+
|
|
505
|
+
// Always handle pipeline errors to prevent memory leaks
|
|
506
|
+
try {
|
|
507
|
+
await sharp(input).resize(800).webp().toFile(output);
|
|
508
|
+
} catch (err) {
|
|
509
|
+
console.error(`Failed to process ${input}: ${err.message}`);
|
|
510
|
+
// Sharp cleans up internally on error, but log for monitoring
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
// For very large batches, process sequentially or in small batches
|
|
514
|
+
// to avoid opening hundreds of file descriptors simultaneously
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
---
|
|
518
|
+
|
|
519
|
+
## Integration with Multer
|
|
520
|
+
|
|
521
|
+
Complete upload endpoint with Multer + Sharp processing:
|
|
522
|
+
|
|
523
|
+
```javascript
|
|
524
|
+
import express from 'express';
|
|
525
|
+
import multer from 'multer';
|
|
526
|
+
import sharp from 'sharp';
|
|
527
|
+
import path from 'path';
|
|
528
|
+
import crypto from 'crypto';
|
|
529
|
+
|
|
530
|
+
const app = express();
|
|
531
|
+
|
|
532
|
+
// Store in memory buffer for Sharp processing (not disk)
|
|
533
|
+
const upload = multer({
|
|
534
|
+
storage: multer.memoryStorage(),
|
|
535
|
+
limits: {
|
|
536
|
+
fileSize: 10 * 1024 * 1024, // 10MB max
|
|
537
|
+
},
|
|
538
|
+
fileFilter: (req, file, cb) => {
|
|
539
|
+
const allowed = /^image\/(jpeg|png|webp|avif|gif|tiff)$/;
|
|
540
|
+
if (allowed.test(file.mimetype)) {
|
|
541
|
+
cb(null, true);
|
|
542
|
+
} else {
|
|
543
|
+
cb(new Error(`Unsupported image type: ${file.mimetype}`));
|
|
544
|
+
}
|
|
545
|
+
},
|
|
546
|
+
});
|
|
547
|
+
|
|
548
|
+
app.post('/api/upload', upload.single('image'), async (req, res) => {
|
|
549
|
+
if (!req.file) {
|
|
550
|
+
return res.status(400).json({ error: 'No image provided' });
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
try {
|
|
554
|
+
const id = crypto.randomUUID();
|
|
555
|
+
const outputDir = path.resolve(`./public/uploads/${id}`);
|
|
556
|
+
const { mkdir } = await import('fs/promises');
|
|
557
|
+
await mkdir(outputDir, { recursive: true });
|
|
558
|
+
|
|
559
|
+
const pipeline = sharp(req.file.buffer).rotate().withMetadata(false);
|
|
560
|
+
const meta = await pipeline.metadata();
|
|
561
|
+
|
|
562
|
+
// Generate thumbnail + main image in WebP
|
|
563
|
+
const [thumb, main] = await Promise.all([
|
|
564
|
+
pipeline.clone()
|
|
565
|
+
.resize(320, 320, { fit: 'cover', position: 'attention' })
|
|
566
|
+
.webp({ quality: 70 })
|
|
567
|
+
.toFile(path.join(outputDir, 'thumb.webp')),
|
|
568
|
+
pipeline.clone()
|
|
569
|
+
.resize({ width: Math.min(meta.width, 1920) })
|
|
570
|
+
.webp({ quality: 80 })
|
|
571
|
+
.toFile(path.join(outputDir, 'main.webp')),
|
|
572
|
+
]);
|
|
573
|
+
|
|
574
|
+
res.json({
|
|
575
|
+
id,
|
|
576
|
+
original: {
|
|
577
|
+
width: meta.width,
|
|
578
|
+
height: meta.height,
|
|
579
|
+
format: meta.format,
|
|
580
|
+
size: req.file.size,
|
|
581
|
+
},
|
|
582
|
+
variants: {
|
|
583
|
+
thumb: { path: `/uploads/${id}/thumb.webp`, size: thumb.size },
|
|
584
|
+
main: { path: `/uploads/${id}/main.webp`, size: main.size },
|
|
585
|
+
},
|
|
586
|
+
});
|
|
587
|
+
} catch (err) {
|
|
588
|
+
res.status(500).json({ error: `Processing failed: ${err.message}` });
|
|
589
|
+
}
|
|
590
|
+
});
|
|
591
|
+
|
|
592
|
+
// Error handler for Multer errors
|
|
593
|
+
app.use((err, req, res, next) => {
|
|
594
|
+
if (err instanceof multer.MulterError) {
|
|
595
|
+
return res.status(400).json({ error: err.message });
|
|
596
|
+
}
|
|
597
|
+
if (err.message.startsWith('Unsupported image type')) {
|
|
598
|
+
return res.status(400).json({ error: err.message });
|
|
599
|
+
}
|
|
600
|
+
next(err);
|
|
601
|
+
});
|
|
602
|
+
```
|
|
603
|
+
|
|
604
|
+
---
|
|
605
|
+
|