[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EBKNBN50KGKBTC9WCFDG3C":3,"skill-same:01M6EBKNBN50KGKBTC9WCFDG3C":101},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":31,"linkOnly":32,"markdownContent":33,"markdownBody":34,"frontMatter":35,"refName":36,"commitSha":37,"skillDirectory":38,"forksCount":39,"repositoryHtmlUrl":40,"repositoryHomepageUrl":41,"ownerHtmlUrl":42,"ownerBlogUrl":6,"ownerDescription":43,"updatedAt":44,"install":45,"resources":58},"01M6EBKNBN50KGKBTC9WCFDG3C","nestjs-scheduling",null,"Distributed cron jobs and locking patterns. Use when implementing scheduled tasks or distributed locking patterns in NestJS. (triggers: **\u002F*.service.ts, @Cron, CronExpression, ScheduleModule)","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",66,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FHoangNguyen0403\u002Fagent-skills-standard\u002Fnestjs-scheduling\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30],"scheduling","nestjs","nestjs scheduling","distributed","tasks","cron jobs","cron","use","jobs","patterns","service","triggers","2026-11-10 10:12:30",false,"---\nname: nestjs-scheduling\ndescription: \"Distributed cron jobs and locking patterns. Use when implementing scheduled tasks or distributed locking patterns in NestJS. (triggers: **\u002F*.service.ts, @Cron, CronExpression, ScheduleModule)\"\n---\n\n# Task Scheduling & Jobs\n\n## **Priority: P1 (OPERATIONAL)**\n\nBackground job processing and scheduled task patterns.\n\n- **Problem**: `@Cron()` runs on **every** instance. In K8s with 3 pods, your \"Daily Report\" runs 3 times.\n- **Solution**: **Distributed Locking** using Redis.\n  - **Pattern**: Using a decorator to wrap the cron method.\n  - **Logic**: `SET resource_name my_random_value NX PX 30000` (Redis Atomic Set).\n\n## Cron Decorator Pattern\n\n- **Implementation**:\n\n  ```typescript\n  @Cron(CronExpression.EVERY_MINUTE)\n  @DistributedLock({ key: 'send_emails', ttl: 5000 })\n  async handleCron() {\n    \u002F\u002F Only runs if lock acquired\n  }\n  ```\n\n- **Tools**: Use `nestjs-redlock` or custom Redis wrapper via `redlock` library.\n\n## Job Robustness\n\n- **Isolation**: Never perform heavy processing inside the Cron handler.\n  - **Pattern**: Cron -> Push Job ID to Queue (BullMQ) -> Worker processes it.\n  - **Why**: Cron schedulers can get blocked by the Event Loop; Workers are scalable.\n- **Error Handling**: Wrap ALL cron logic in `try\u002Fcatch`. Uncaught exceptions in a Cron job can crash the entire Node process.\n\n\n## Anti-Patterns\n\n- **No unguarded cron logic**: Always wrap in `try\u002Fcatch`; uncaught exceptions crash the entire Node process.\n- **No direct cron processing**: Push to BullMQ queue; workers are scalable, cron handlers are not.\n- **No bare @Cron in multi-pod**: Use distributed locking (redlock) to prevent duplicate concurrent runs.\n\n","# Task Scheduling & Jobs\n\n## **Priority: P1 (OPERATIONAL)**\n\nBackground job processing and scheduled task patterns.\n\n- **Problem**: `@Cron()` runs on **every** instance. In K8s with 3 pods, your \"Daily Report\" runs 3 times.\n- **Solution**: **Distributed Locking** using Redis.\n  - **Pattern**: Using a decorator to wrap the cron method.\n  - **Logic**: `SET resource_name my_random_value NX PX 30000` (Redis Atomic Set).\n\n## Cron Decorator Pattern\n\n- **Implementation**:\n\n  ```typescript\n  @Cron(CronExpression.EVERY_MINUTE)\n  @DistributedLock({ key: 'send_emails', ttl: 5000 })\n  async handleCron() {\n    \u002F\u002F Only runs if lock acquired\n  }\n  ```\n\n- **Tools**: Use `nestjs-redlock` or custom Redis wrapper via `redlock` library.\n\n## Job Robustness\n\n- **Isolation**: Never perform heavy processing inside the Cron handler.\n  - **Pattern**: Cron -> Push Job ID to Queue (BullMQ) -> Worker processes it.\n  - **Why**: Cron schedulers can get blocked by the Event Loop; Workers are scalable.\n- **Error Handling**: Wrap ALL cron logic in `try\u002Fcatch`. Uncaught exceptions in a Cron job can crash the entire Node process.\n\n\n## Anti-Patterns\n\n- **No unguarded cron logic**: Always wrap in `try\u002Fcatch`; uncaught exceptions crash the entire Node process.\n- **No direct cron processing**: Push to BullMQ queue; workers are scalable, cron handlers are not.\n- **No bare @Cron in multi-pod**: Use distributed locking (redlock) to prevent duplicate concurrent runs.\n\n",{"name":5,"description":7},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002FHoangNguyen0403\u002Fagent-skills-standard\u002Fnestjs-scheduling",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":8,"skillName":5,"commands":46,"prompt":56,"zipAvailable":57},[47,50,53],{"tool":48,"command":49},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill nestjs-scheduling",{"tool":51,"command":52},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill nestjs-scheduling",{"tool":54,"command":55},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill nestjs-scheduling","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FHoangNguyen0403\u002Fagent-skills-standard\u002Fnestjs-scheduling\u002FSKILL.md",true,[59,65,69,73,77,81,85,89,93,97],{"path":60,"resourceType":61,"resourceTypeDesc":62,"sizeBytes":63,"sourceHtmlUrl":64},"references\u002Fcoordinator_summary_contract.md","REFERENCE","参考文档",1009,"https:\u002F\u002Fgithub.com\u002Fvitalikpestov\u002FSkills-Catalog\u002Fblob\u002Fmain\u002F_AI-Automation\u002Fclaude-code-skills-levnikolaevich\u002Fplugins\u002Fdocumentation-pipeline\u002Fskills\u002Fln-130-tasks-docs-creator\u002Freferences\u002Fcoordinator_summary_contract.md",{"path":66,"resourceType":61,"resourceTypeDesc":62,"sizeBytes":67,"sourceHtmlUrl":68},"references\u002Fdocs_generation_summary_contract.md",535,"https:\u002F\u002Fgithub.com\u002Fvitalikpestov\u002FSkills-Catalog\u002Fblob\u002Fmain\u002F_AI-Automation\u002Fclaude-code-skills-levnikolaevich\u002Fplugins\u002Fdocumentation-pipeline\u002Fskills\u002Fln-130-tasks-docs-creator\u002Freferences\u002Fdocs_generation_summary_contract.md",{"path":70,"resourceType":61,"resourceTypeDesc":62,"sizeBytes":71,"sourceHtmlUrl":72},"references\u002Fdocs_quality_contract.md",2236,"https:\u002F\u002Fgithub.com\u002Fvitalikpestov\u002FSkills-Catalog\u002Fblob\u002Fmain\u002F_AI-Automation\u002Fclaude-code-skills-levnikolaevich\u002Fplugins\u002Fdocumentation-pipeline\u002Fskills\u002Fln-130-tasks-docs-creator\u002Freferences\u002Fdocs_quality_contract.md",{"path":74,"resourceType":61,"resourceTypeDesc":62,"sizeBytes":75,"sourceHtmlUrl":76},"references\u002Fdocs_quality_rules.json",8029,"https:\u002F\u002Fgithub.com\u002Fvitalikpestov\u002FSkills-Catalog\u002Fblob\u002Fmain\u002F_AI-Automation\u002Fclaude-code-skills-levnikolaevich\u002Fplugins\u002Fdocumentation-pipeline\u002Fskills\u002Fln-130-tasks-docs-creator\u002Freferences\u002Fdocs_quality_rules.json",{"path":78,"resourceType":61,"resourceTypeDesc":62,"sizeBytes":79,"sourceHtmlUrl":80},"references\u002Fdocs_quality_rules.json.SOURCE.md",1283,"https:\u002F\u002Fgithub.com\u002Fvitalikpestov\u002FSkills-Catalog\u002Fblob\u002Fmain\u002F_AI-Automation\u002Fclaude-code-skills-levnikolaevich\u002Fplugins\u002Fdocumentation-pipeline\u002Fskills\u002Fln-130-tasks-docs-creator\u002Freferences\u002Fdocs_quality_rules.json.SOURCE.md",{"path":82,"resourceType":61,"resourceTypeDesc":62,"sizeBytes":83,"sourceHtmlUrl":84},"references\u002Fmarkdown_read_protocol.md",1505,"https:\u002F\u002Fgithub.com\u002Fvitalikpestov\u002FSkills-Catalog\u002Fblob\u002Fmain\u002F_AI-Automation\u002Fclaude-code-skills-levnikolaevich\u002Fplugins\u002Fdocumentation-pipeline\u002Fskills\u002Fln-130-tasks-docs-creator\u002Freferences\u002Fmarkdown_read_protocol.md",{"path":86,"resourceType":61,"resourceTypeDesc":62,"sizeBytes":87,"sourceHtmlUrl":88},"references\u002Fquestions.md",7684,"https:\u002F\u002Fgithub.com\u002Fvitalikpestov\u002FSkills-Catalog\u002Fblob\u002Fmain\u002F_AI-Automation\u002Fclaude-code-skills-levnikolaevich\u002Fplugins\u002Fdocumentation-pipeline\u002Fskills\u002Fln-130-tasks-docs-creator\u002Freferences\u002Fquestions.md",{"path":90,"resourceType":61,"resourceTypeDesc":62,"sizeBytes":91,"sourceHtmlUrl":92},"references\u002Fstorage_mode_detection.md",2042,"https:\u002F\u002Fgithub.com\u002Fvitalikpestov\u002FSkills-Catalog\u002Fblob\u002Fmain\u002F_AI-Automation\u002Fclaude-code-skills-levnikolaevich\u002Fplugins\u002Fdocumentation-pipeline\u002Fskills\u002Fln-130-tasks-docs-creator\u002Freferences\u002Fstorage_mode_detection.md",{"path":94,"resourceType":61,"resourceTypeDesc":62,"sizeBytes":95,"sourceHtmlUrl":96},"references\u002Ftemplates\u002Fkanban_board_template.md",4851,"https:\u002F\u002Fgithub.com\u002Fvitalikpestov\u002FSkills-Catalog\u002Fblob\u002Fmain\u002F_AI-Automation\u002Fclaude-code-skills-levnikolaevich\u002Fplugins\u002Fdocumentation-pipeline\u002Fskills\u002Fln-130-tasks-docs-creator\u002Freferences\u002Ftemplates\u002Fkanban_board_template.md",{"path":98,"resourceType":61,"resourceTypeDesc":62,"sizeBytes":99,"sourceHtmlUrl":100},"references\u002Ftemplates\u002Ftasks_readme_template.md",14775,"https:\u002F\u002Fgithub.com\u002Fvitalikpestov\u002FSkills-Catalog\u002Fblob\u002Fmain\u002F_AI-Automation\u002Fclaude-code-skills-levnikolaevich\u002Fplugins\u002Fdocumentation-pipeline\u002Fskills\u002Fln-130-tasks-docs-creator\u002Freferences\u002Ftemplates\u002Ftasks_readme_template.md",[102,116,126,135,141,148],{"skillNo":103,"name":104,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":105,"categories":106,"keywords":112,"publishedAt":31},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[107],{"categoryNo":108,"categoryName":109,"taxonomyType":110,"taxonomyTypeDesc":111},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[113,114,115],"model","model hierarchy","model hierarchy skill",{"skillNo":117,"name":118,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":119,"categories":120,"keywords":122,"publishedAt":31},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[121],{"categoryNo":108,"categoryName":109,"taxonomyType":110,"taxonomyTypeDesc":111},[123,124,125],"MCP","zoom","zoom mcp",{"skillNo":127,"name":128,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":129,"categories":130,"keywords":131,"publishedAt":31},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[132,133,134,124],"sdk","zoom apps sdk","apps",{"skillNo":136,"name":137,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":138,"categories":139,"keywords":140,"publishedAt":31},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[137],{"skillNo":142,"name":143,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":144,"categories":145,"keywords":147,"publishedAt":31},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[146],{"categoryNo":108,"categoryName":109,"taxonomyType":110,"taxonomyTypeDesc":111},[143],{"skillNo":149,"name":150,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":151,"categories":152,"keywords":153,"publishedAt":31},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[150]]