[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EEHAWRMJWASFFYSRZ1M57G":3,"skill-same:01M6EEHAWRMJWASFFYSRZ1M57G":103},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":20,"linkOnly":21,"markdownContent":22,"markdownBody":22,"frontMatter":23,"refName":24,"commitSha":25,"skillDirectory":26,"forksCount":27,"repositoryHtmlUrl":28,"repositoryHomepageUrl":29,"ownerHtmlUrl":30,"ownerBlogUrl":6,"ownerDescription":31,"updatedAt":32,"install":33,"resources":46},"01M6EEHAWRMJWASFFYSRZ1M57G","bull-mq",null,"ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FTerminalSkills\u002Fskills\u002Fbull-mq\u002FSKILL.md",[],[18,19],"mq","bull mq","2026-11-10 10:12:30",false,"# BullMQ — Redis-Based Job Queue for Node.js\n\nYou are an expert in BullMQ, the high-performance job queue for Node.js built on Redis. You help developers build reliable background processing systems with delayed jobs, rate limiting, prioritization, repeatable cron jobs, job dependencies, concurrency control, and dead-letter handling — powering email sending, image processing, webhook delivery, report generation, and any async workload.\n\n## Core Capabilities\n\n### Queue and Worker\n\n```typescript\nimport { Queue, Worker, QueueScheduler, FlowProducer } from \"bullmq\";\nimport IORedis from \"ioredis\";\n\nconst connection = new IORedis({ host: \"localhost\", port: 6379, maxRetriesPerRequest: null });\n\n\u002F\u002F Define queue\nconst emailQueue = new Queue(\"email\", { connection });\n\n\u002F\u002F Add jobs\nawait emailQueue.add(\"welcome\", {\n  to: \"user@example.com\",\n  template: \"welcome\",\n  data: { name: \"Alice\" },\n}, {\n  priority: 1,                            \u002F\u002F Lower = higher priority\n  attempts: 3,                            \u002F\u002F Retry up to 3 times\n  backoff: { type: \"exponential\", delay: 2000 },\n  removeOnComplete: { count: 1000 },      \u002F\u002F Keep last 1000 completed\n  removeOnFail: { age: 7 * 24 * 3600 },   \u002F\u002F Keep failed for 7 days\n});\n\n\u002F\u002F Delayed job\nawait emailQueue.add(\"reminder\", { userId: 42 }, {\n  delay: 24 * 60 * 60 * 1000,            \u002F\u002F 24 hours from now\n});\n\n\u002F\u002F Repeatable (cron)\nawait emailQueue.add(\"digest\", {}, {\n  repeat: { pattern: \"0 9 * * 1\" },       \u002F\u002F Every Monday at 9 AM\n});\n\n\u002F\u002F Worker\nconst worker = new Worker(\"email\", async (job) => {\n  switch (job.name) {\n    case \"welcome\":\n      await sendEmail(job.data.to, job.data.template, job.data.data);\n      break;\n    case \"reminder\":\n      await sendReminderEmail(job.data.userId);\n      break;\n    case \"digest\":\n      await sendWeeklyDigest();\n      break;\n  }\n\n  \u002F\u002F Progress reporting\n  await job.updateProgress(100);\n  return { sent: true, timestamp: Date.now() };\n}, {\n  connection,\n  concurrency: 5,                         \u002F\u002F Process 5 jobs simultaneously\n  limiter: { max: 100, duration: 60000 }, \u002F\u002F Rate limit: 100 jobs\u002Fmin\n});\n\nworker.on(\"completed\", (job, result) => console.log(`Job ${job.id} completed`));\nworker.on(\"failed\", (job, err) => console.error(`Job ${job?.id} failed: ${err.message}`));\n```\n\n### Job Flows (Parent-Child Dependencies)\n\n```typescript\nconst flow = new FlowProducer({ connection });\n\nawait flow.add({\n  name: \"generate-report\",\n  queueName: \"reports\",\n  data: { reportId: \"monthly-2026-03\" },\n  children: [\n    { name: \"fetch-sales\", queueName: \"data\", data: { source: \"sales\" } },\n    { name: \"fetch-users\", queueName: \"data\", data: { source: \"users\" } },\n    { name: \"fetch-metrics\", queueName: \"data\", data: { source: \"metrics\" } },\n  ],\n  \u002F\u002F Parent job runs only after ALL children complete\n});\n```\n\n## Installation\n\n```bash\nnpm install bullmq ioredis\n```\n\n## Best Practices\n\n1. **Separate workers** — Run workers in separate processes\u002Fcontainers from your API; scale independently\n2. **Idempotent jobs** — Design jobs to be safely retried; use unique job IDs to prevent duplicates\n3. **Backoff strategy** — Use exponential backoff for retries; prevents thundering herd on downstream failures\n4. **Rate limiting** — Use `limiter` to respect API rate limits (email providers, webhooks, external APIs)\n5. **Progress tracking** — Use `job.updateProgress()` for long-running jobs; clients can poll progress\n6. **Graceful shutdown** — Call `worker.close()` on SIGTERM; finishes current jobs before exiting\n7. **Flows for pipelines** — Use FlowProducer for job dependencies; parent waits for all children to complete\n8. **Monitor with Bull Board** — Use `@bull-board\u002Fexpress` for a web UI showing queue status, job data, and failures\n",{},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002FTerminalSkills\u002Fskills\u002Fbull-mq",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":7,"skillName":5,"commands":34,"prompt":44,"zipAvailable":45},[35,38,41],{"tool":36,"command":37},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill bull-mq",{"tool":39,"command":40},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill bull-mq",{"tool":42,"command":43},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill bull-mq","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FTerminalSkills\u002Fskills\u002Fbull-mq\u002FSKILL.md",true,[47,53,59,63,67,71,75,79,83,87,91,95,99],{"path":48,"resourceType":49,"resourceTypeDesc":50,"sizeBytes":51,"sourceHtmlUrl":52},"checklist.md","REFERENCE","参考文档",10101,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.pi\u002Fskills\u002Fbmad-document-project\u002Fchecklist.md",{"path":54,"resourceType":55,"resourceTypeDesc":56,"sizeBytes":57,"sourceHtmlUrl":58},"documentation-requirements.csv","ASSET","资产文件",8076,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.pi\u002Fskills\u002Fbmad-document-project\u002Fdocumentation-requirements.csv",{"path":60,"resourceType":49,"resourceTypeDesc":50,"sizeBytes":61,"sourceHtmlUrl":62},"instructions.md",5164,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.pi\u002Fskills\u002Fbmad-document-project\u002Finstructions.md",{"path":64,"resourceType":49,"resourceTypeDesc":50,"sizeBytes":65,"sourceHtmlUrl":66},"templates\u002Fdeep-dive-template.md",5854,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.pi\u002Fskills\u002Fbmad-document-project\u002Ftemplates\u002Fdeep-dive-template.md",{"path":68,"resourceType":49,"resourceTypeDesc":50,"sizeBytes":69,"sourceHtmlUrl":70},"templates\u002Findex-template.md",4510,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.pi\u002Fskills\u002Fbmad-document-project\u002Ftemplates\u002Findex-template.md",{"path":72,"resourceType":49,"resourceTypeDesc":50,"sizeBytes":73,"sourceHtmlUrl":74},"templates\u002Fproject-overview-template.md",1951,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.pi\u002Fskills\u002Fbmad-document-project\u002Ftemplates\u002Fproject-overview-template.md",{"path":76,"resourceType":49,"resourceTypeDesc":50,"sizeBytes":77,"sourceHtmlUrl":78},"templates\u002Fproject-scan-report-schema.json",4836,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.pi\u002Fskills\u002Fbmad-document-project\u002Ftemplates\u002Fproject-scan-report-schema.json",{"path":80,"resourceType":49,"resourceTypeDesc":50,"sizeBytes":81,"sourceHtmlUrl":82},"templates\u002Fsource-tree-template.md",2160,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.pi\u002Fskills\u002Fbmad-document-project\u002Ftemplates\u002Fsource-tree-template.md",{"path":84,"resourceType":49,"resourceTypeDesc":50,"sizeBytes":85,"sourceHtmlUrl":86},"workflow.md",719,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.pi\u002Fskills\u002Fbmad-document-project\u002Fworkflow.md",{"path":88,"resourceType":49,"resourceTypeDesc":50,"sizeBytes":89,"sourceHtmlUrl":90},"workflows\u002Fdeep-dive-instructions.md",11909,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.pi\u002Fskills\u002Fbmad-document-project\u002Fworkflows\u002Fdeep-dive-instructions.md",{"path":92,"resourceType":49,"resourceTypeDesc":50,"sizeBytes":93,"sourceHtmlUrl":94},"workflows\u002Fdeep-dive-workflow.md",979,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.pi\u002Fskills\u002Fbmad-document-project\u002Fworkflows\u002Fdeep-dive-workflow.md",{"path":96,"resourceType":49,"resourceTypeDesc":50,"sizeBytes":97,"sourceHtmlUrl":98},"workflows\u002Ffull-scan-instructions.md",43200,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.pi\u002Fskills\u002Fbmad-document-project\u002Fworkflows\u002Ffull-scan-instructions.md",{"path":100,"resourceType":49,"resourceTypeDesc":50,"sizeBytes":101,"sourceHtmlUrl":102},"workflows\u002Ffull-scan-workflow.md",970,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.pi\u002Fskills\u002Fbmad-document-project\u002Fworkflows\u002Ffull-scan-workflow.md",[104,118,128,137,143,150],{"skillNo":105,"name":106,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":107,"categories":108,"keywords":114,"publishedAt":20},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[109],{"categoryNo":110,"categoryName":111,"taxonomyType":112,"taxonomyTypeDesc":113},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[115,116,117],"model","model hierarchy","model hierarchy skill",{"skillNo":119,"name":120,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":121,"categories":122,"keywords":124,"publishedAt":20},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[123],{"categoryNo":110,"categoryName":111,"taxonomyType":112,"taxonomyTypeDesc":113},[125,126,127],"MCP","zoom","zoom mcp",{"skillNo":129,"name":130,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":131,"categories":132,"keywords":133,"publishedAt":20},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[134,135,136,126],"sdk","zoom apps sdk","apps",{"skillNo":138,"name":139,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":140,"categories":141,"keywords":142,"publishedAt":20},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[139],{"skillNo":144,"name":145,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":146,"categories":147,"keywords":149,"publishedAt":20},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[148],{"categoryNo":110,"categoryName":111,"taxonomyType":112,"taxonomyTypeDesc":113},[145],{"skillNo":151,"name":152,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":153,"categories":154,"keywords":155,"publishedAt":20},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[152]]