vibes-plug 2.11.0 → 3.9.0

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.
Files changed (181) hide show
  1. package/.claude/rules/vibes-plug-core.md +5 -0
  2. package/.cursor/rules/vibes-plug-core.mdc +8 -3
  3. package/.cursorrules +9 -3
  4. package/AGENTS.md +25 -4
  5. package/CHANGELOG.md +151 -0
  6. package/CLAUDE.md +15 -8
  7. package/README.md +216 -641
  8. package/bin/vibes.mjs +1104 -0
  9. package/index.js +1 -1
  10. package/package.json +11 -3
  11. package/plugin.json +4 -3
  12. package/scripts/check-anti-slop.js +53 -0
  13. package/scripts/check-anti-slop.mjs +53 -0
  14. package/scripts/generate_swarm_gif.py +2 -2
  15. package/scripts/install.js +3 -1
  16. package/scripts/update_skills.js +1 -1
  17. package/scripts/update_skills.mjs +86 -0
  18. package/scripts/validate-skills.mjs +111 -0
  19. package/skills/accessibility-testing-expert/SKILL.md +117 -116
  20. package/skills/affective-computing-emotion-ai/SKILL.md +83 -0
  21. package/skills/agentic-coding-workflow-expert/SKILL.md +297 -0
  22. package/skills/agentic-memory-architect/SKILL.md +52 -0
  23. package/skills/agentic-micro-economy-architect/SKILL.md +92 -0
  24. package/skills/ai-llm-integration-expert/SKILL.md +330 -187
  25. package/skills/ai-media-generation-expert/SKILL.md +173 -172
  26. package/skills/ai-prompt-engineering-expert/SKILL.md +170 -50
  27. package/skills/ai-safety-governance-expert/SKILL.md +223 -0
  28. package/skills/angular-expert/SKILL.md +149 -148
  29. package/skills/anti-slop/SKILL.md +134 -0
  30. package/skills/api-design-expert/SKILL.md +4 -3
  31. package/skills/api-gateway-proxy-expert/SKILL.md +3 -2
  32. package/skills/app-analyzer-optimizer/SKILL.md +4 -3
  33. package/skills/apple-ecosystem-expert/SKILL.md +6 -5
  34. package/skills/astro-framework-expert/SKILL.md +201 -200
  35. package/skills/async-queue-temporal-expert/SKILL.md +218 -240
  36. package/skills/authentication-identity-expert/SKILL.md +79 -184
  37. package/skills/autonomous-red-teamer/SKILL.md +338 -203
  38. package/skills/autonomous-tdd-debugger/SKILL.md +6 -5
  39. package/skills/biome-linter-formatter-expert/SKILL.md +90 -89
  40. package/skills/blockchain-web3-expert/SKILL.md +116 -115
  41. package/skills/brainstorming/SKILL.md +392 -377
  42. package/skills/browser-automation-expert/SKILL.md +260 -222
  43. package/skills/bun-runtime-expert/SKILL.md +5 -4
  44. package/skills/chatbot-messaging-expert/SKILL.md +115 -114
  45. package/skills/ci-cd-devops-architect/SKILL.md +3 -2
  46. package/skills/cloud-hosting-expert/SKILL.md +5 -4
  47. package/skills/coderabbit/SKILL.md +5 -4
  48. package/skills/compliance-gdpr-privacy-expert/SKILL.md +3 -2
  49. package/skills/composable-mach-architect/SKILL.md +338 -0
  50. package/skills/cron-scheduler-expert/SKILL.md +5 -4
  51. package/skills/data-pipeline-etl-expert/SKILL.md +3 -2
  52. package/skills/data-telemetry-expert/SKILL.md +5 -4
  53. package/skills/data-visualization-expert/SKILL.md +155 -154
  54. package/skills/database-orm-expert/SKILL.md +102 -240
  55. package/skills/deep-research-analyst/SKILL.md +182 -0
  56. package/skills/dependency-upgrade-migrator/SKILL.md +11 -10
  57. package/skills/design-system-architect/SKILL.md +34 -3
  58. package/skills/desktop-electron-expert/SKILL.md +129 -128
  59. package/skills/documentation-site-expert/SKILL.md +60 -59
  60. package/skills/doku-mcp-server/SKILL.md +5 -4
  61. package/skills/doku-payment-gateway/SKILL.md +250 -232
  62. package/skills/domain-driven-design-expert/SKILL.md +3 -2
  63. package/skills/e2e-testing-expert/SKILL.md +5 -4
  64. package/skills/ecommerce-expert/SKILL.md +88 -87
  65. package/skills/email-notification-expert/SKILL.md +35 -7
  66. package/skills/ephemeral-generative-ui-architect/SKILL.md +88 -0
  67. package/skills/error-resilience-expert/SKILL.md +26 -4
  68. package/skills/event-driven-architect/SKILL.md +5 -4
  69. package/skills/feature-flag-analytics-expert/SKILL.md +3 -2
  70. package/skills/file-upload-media-expert/SKILL.md +5 -4
  71. package/skills/firebase-security-expert/SKILL.md +5 -4
  72. package/skills/form-validation-expert/SKILL.md +7 -6
  73. package/skills/frontier-ai-models-expert/SKILL.md +116 -0
  74. package/skills/fullstack-expert/SKILL.md +68 -144
  75. package/skills/gemini-agent-booster/SKILL.md +248 -172
  76. package/skills/geospatial-maps-expert/SKILL.md +81 -80
  77. package/skills/global-a11y-i18n-expert/SKILL.md +5 -4
  78. package/skills/glsl-shader-expert/SKILL.md +155 -71
  79. package/skills/go-programming-expert/SKILL.md +5 -4
  80. package/skills/graph-rag-knowledge-expert/SKILL.md +201 -159
  81. package/skills/graphql-apollo-expert/SKILL.md +5 -4
  82. package/skills/headless-cms-expert/SKILL.md +182 -181
  83. package/skills/hig/SKILL.md +5 -4
  84. package/skills/js-backend-expert/SKILL.md +219 -218
  85. package/skills/legacy-code-translator/SKILL.md +6 -5
  86. package/skills/llm-finops-router/SKILL.md +52 -0
  87. package/skills/local-slm-edge-ai-expert/SKILL.md +168 -167
  88. package/skills/logging-error-tracking-expert/SKILL.md +5 -4
  89. package/skills/mcp-server-architect/SKILL.md +316 -294
  90. package/skills/micro-frontend-architect/SKILL.md +5 -4
  91. package/skills/mobile-expo-expert/SKILL.md +5 -4
  92. package/skills/modern-css-native-expert/SKILL.md +190 -189
  93. package/skills/monorepo-architect/SKILL.md +5 -4
  94. package/skills/mpa-orchestrator/SKILL.md +41 -4
  95. package/skills/multi-agent-orchestration/SKILL.md +388 -254
  96. package/skills/mvc-expert/SKILL.md +5 -4
  97. package/skills/n8n-automation-expert/SKILL.md +90 -89
  98. package/skills/nextjs-app-router-expert/SKILL.md +3 -2
  99. package/skills/openapi-swagger-codegen-expert/SKILL.md +4 -3
  100. package/skills/payment-gateway-expert/SKILL.md +131 -128
  101. package/skills/pdf-document-generation-expert/SKILL.md +92 -91
  102. package/skills/performance-web-vitals/SKILL.md +5 -4
  103. package/skills/post-quantum-crypto-migrator/SKILL.md +3 -2
  104. package/skills/prd-architect/SKILL.md +85 -109
  105. package/skills/proactive-background-watcher/SKILL.md +5 -4
  106. package/skills/production-ready-hardener/SKILL.md +25 -27
  107. package/skills/pwa-offline-first-expert/SKILL.md +227 -185
  108. package/skills/pydantic-ai-expert/SKILL.md +162 -0
  109. package/skills/python-programming-expert/SKILL.md +5 -4
  110. package/skills/rate-limit-abuse-prevention/SKILL.md +5 -4
  111. package/skills/realtime-collaboration-expert/SKILL.md +3 -2
  112. package/skills/rich-text-editor-expert/SKILL.md +178 -177
  113. package/skills/rust-programming-expert/SKILL.md +5 -4
  114. package/skills/saas-architect/SKILL.md +155 -0
  115. package/skills/saas-billing/SKILL.md +394 -382
  116. package/skills/saas-multi-tenant/SKILL.md +7 -6
  117. package/skills/scalability-clean-code/SKILL.md +5 -4
  118. package/skills/search-engine-expert/SKILL.md +90 -89
  119. package/skills/self-healing-cloud-orchestrator/SKILL.md +3 -2
  120. package/skills/senior-frontend/SKILL.md +21 -18
  121. package/skills/senior-frontend/scripts/frontend_scaffolder.py +1 -1
  122. package/skills/seo/SKILL.md +4 -4
  123. package/skills/session-memory-manager/SKILL.md +129 -0
  124. package/skills/solidjs-expert/SKILL.md +81 -80
  125. package/skills/spa-orchestrator/SKILL.md +5 -4
  126. package/skills/sse-websocket-streaming-expert/SKILL.md +3 -2
  127. package/skills/state-management-expert/SKILL.md +5 -4
  128. package/skills/supabase-security-expert/SKILL.md +5 -4
  129. package/skills/svelte-sveltekit-expert/SKILL.md +92 -91
  130. package/skills/svg-animation-motion-expert/SKILL.md +3 -2
  131. package/skills/synthetic-data-finetuning-expert/SKILL.md +156 -0
  132. package/skills/tailwind-expert/SKILL.md +62 -5
  133. package/skills/tanstack-query-expert/SKILL.md +5 -4
  134. package/skills/tauri-expert/SKILL.md +5 -4
  135. package/skills/typescript-expert/SKILL.md +5 -4
  136. package/skills/ui-ux-pro-max/SKILL.md +7 -4
  137. package/skills/vector-db-rag-expert/SKILL.md +209 -208
  138. package/skills/vercel-ai-sdk-expert/SKILL.md +226 -0
  139. package/skills/voice-ai-realtime-agent/SKILL.md +243 -202
  140. package/skills/vue-frontend-expert/SKILL.md +5 -4
  141. package/skills/wasm-edge-computing-expert/SKILL.md +3 -2
  142. package/skills/web-3d-graphics-expert/SKILL.md +259 -82
  143. package/skills/web-game-engine-expert/SKILL.md +278 -50
  144. package/skills/web-scraper/SKILL.md +158 -157
  145. package/skills/website-design-cloner/SKILL.md +5 -4
  146. package/skills/webxr-ar-vr-expert/SKILL.md +105 -65
  147. package/skills/wordpress-headless-expert/SKILL.md +145 -144
  148. package/skills/zero-tech-debt-auditor/SKILL.md +115 -0
  149. package/skills/zero-to-prod-orchestrator/SKILL.md +281 -227
  150. package/skills/zero-trust-secret-vault/SKILL.md +3 -2
  151. package/BLUEPRINT.md +0 -309
  152. package/skills/ai-cost-token-optimizer/SKILL.md +0 -82
  153. package/skills/ai-evals-benchmark-expert/SKILL.md +0 -188
  154. package/skills/asisten-ramah/SKILL.md +0 -47
  155. package/skills/auto-doc-updater/SKILL.md +0 -220
  156. package/skills/autonomous-chaos-monkey/SKILL.md +0 -63
  157. package/skills/background-jobs-queue-expert/SKILL.md +0 -235
  158. package/skills/bootstrap-to-modern/SKILL.md +0 -94
  159. package/skills/database-migration-versioning-expert/SKILL.md +0 -90
  160. package/skills/edge-serverless-db-expert/SKILL.md +0 -99
  161. package/skills/mcp-client-orchestrator/SKILL.md +0 -76
  162. package/skills/mobile-push-notification-expert/SKILL.md +0 -71
  163. package/skills/monday-design-aesthetic/SKILL.md +0 -73
  164. package/skills/multiple-entry-points/SKILL.md +0 -91
  165. package/skills/project-context-mapper/SKILL.md +0 -85
  166. package/skills/saas-mvp-launcher/SKILL.md +0 -260
  167. package/skills/saas-transformer/SKILL.md +0 -500
  168. package/skills/saas-transformer/references/billing_integration_guide.md +0 -401
  169. package/skills/secure-fuzz-testing/SKILL.md +0 -207
  170. package/skills/self-evolving-memory-graph/SKILL.md +0 -91
  171. package/skills/session-context-loader/SKILL.md +0 -83
  172. package/skills/session-handoff-resume/SKILL.md +0 -164
  173. package/skills/skill-baru/SKILL.md +0 -178
  174. package/skills/supabase-migration/SKILL.md +0 -91
  175. package/skills/token-saver/SKILL.md +0 -119
  176. package/skills/ui-components-expert/SKILL.md +0 -166
  177. package/skills/vibe-code-gardener/SKILL.md +0 -181
  178. package/skills/visual-qa-vision-agent/SKILL.md +0 -71
  179. /package/skills/{saas-transformer → saas-architect}/references/feature_gating_patterns.md +0 -0
  180. /package/skills/{saas-transformer → saas-architect}/references/saas_transformation_checklist.md +0 -0
  181. /package/skills/{saas-transformer → saas-architect}/scripts/saas_transformation_scanner.py +0 -0
@@ -1,240 +1,218 @@
1
- ---
2
- name: async-queue-temporal-expert
3
- description: "Expert guide for Durable Workflow Engines (Temporal.io, Trigger.dev v3, Inngest, BullMQ v5) and fault-tolerant background sagas / Panduan ahli workflow engine tahan-gagal (Temporal, Trigger.dev, Inngest, BullMQ)."
4
- author: "Roedy Rustam"
5
- ---
6
-
7
- # Async Queue & Durable Workflow Expert (Temporal & Sagas 2026)
8
-
9
- [English](#english) | [Bahasa Indonesia](#bahasa-indonesia)
10
-
11
- ---
12
-
13
- <a name="english"></a>
14
- ## English
15
-
16
- ### Purpose & Overview
17
- Production-grade architectural guide for designing durable, fault-tolerant background execution pipelines, asynchronous job queues, and distributed state machines using **Temporal.io**, **Trigger.dev v3**, **Inngest**, and **BullMQ v5**. Guarantees eventual completion across long-running sagas, API rate limits, worker crashes, and network partitions.
18
-
19
- ### Key Capabilities
20
- 1. **Durable State Machines**: Workflows survive process restarts, deployments, and database blips without losing state or re-executing completed side-effects.
21
- 2. **Distributed Saga Pattern**: Multi-step transactions paired with automated compensating activities (rollbacks) whenever a downstream service permanently fails.
22
- 3. **Idempotency & Deduplication**: Ensuring unique idempotency keys per transaction to prevent double billing or duplicate emails.
23
- 4. **Queue Concurrency & Rate Limiting**: Token-bucket throttles, exponential backoff with jitter, and dead-letter queues (DLQ) for poison-pill isolation.
24
-
25
- ---
26
-
27
- ### Production Implementation Recipes
28
-
29
- #### Recipe 1: Temporal.io Saga Pattern with Compensations (TypeScript SDK)
30
- ```typescript
31
- import { proxyActivities, ApplicationFailure } from '@temporalio/workflow';
32
- import type * as activities from './activities';
33
-
34
- // Proxy activities with aggressive retry policies
35
- const { chargeCustomer, provisionLicense, sendWelcomeEmail, refundCustomer, revokeLicense } =
36
- proxyActivities<typeof activities>({
37
- startToCloseTimeout: '1 minute',
38
- retry: {
39
- initialInterval: '1s',
40
- backoffCoefficient: 2,
41
- maximumAttempts: 5,
42
- nonRetryableErrorTypes: ['InvalidCardError', 'AccountSuspendedError'],
43
- },
44
- });
45
-
46
- export interface SubscriptionWorkflowInput {
47
- customerId: string;
48
- planId: string;
49
- amountCents: number;
50
- }
51
-
52
- /**
53
- * Distributed Subscription Saga with Compensating Rollbacks
54
- */
55
- export async function subscriptionSagaWorkflow(input: SubscriptionWorkflowInput): Promise<{ status: string }> {
56
- const compensations: Array<() => Promise<void>> = [];
57
-
58
- try {
59
- // Step 1: Charge Customer
60
- const chargeResult = await chargeCustomer(input.customerId, input.amountCents);
61
- compensations.unshift(() => refundCustomer(chargeResult.chargeId));
62
-
63
- // Step 2: Provision License
64
- const licenseResult = await provisionLicense(input.customerId, input.planId);
65
- compensations.unshift(() => revokeLicense(licenseResult.licenseId));
66
-
67
- // Step 3: Send Welcome Notification
68
- await sendWelcomeEmail(input.customerId, licenseResult.licenseKey);
69
-
70
- return { status: 'COMPLETED' };
71
- } catch (error) {
72
- // Execute compensating activities in reverse order
73
- for (const compensate of compensations) {
74
- try {
75
- await compensate();
76
- } catch (compError) {
77
- console.error('Compensation failed, alerting on-call engineer:', compError);
78
- }
79
- }
80
- throw ApplicationFailure.create({
81
- message: `Subscription saga failed and rolled back: ${(error as Error).message}`,
82
- nonRetryable: true,
83
- });
84
- }
85
- }
86
- ```
87
-
88
- #### Recipe 2: Trigger.dev v3 Durable Task with Idempotency
89
- ```typescript
90
- import { task } from '@trigger.dev/sdk/v3';
91
-
92
- export const generateEnterpriseAnalyticsReport = task({
93
- id: 'generate-enterprise-report',
94
- retry: {
95
- maxAttempts: 4,
96
- minTimeoutInMs: 2000,
97
- factor: 2,
98
- randomize: true, // Jitter
99
- },
100
- run: async (payload: { tenantId: string; month: string }, { ctx }) => {
101
- // Automatic checkpointing: each step runs durably
102
- const data = await ctx.run('fetch-telemetry', async () => {
103
- return await fetchTelemetryFromWarehouse(payload.tenantId, payload.month);
104
- });
105
-
106
- const pdfUrl = await ctx.run('render-pdf', async () => {
107
- return await generateReportPdf(data);
108
- });
109
-
110
- await ctx.run('dispatch-webhook', async () => {
111
- return await sendWebhookNotification(payload.tenantId, pdfUrl);
112
- });
113
-
114
- return { success: true, pdfUrl };
115
- },
116
- });
117
- ```
118
-
119
- ---
120
-
121
- ### Implementation Checklist
122
- - [ ] Implement Saga rollback handlers for multi-step distributed payments and user provisioning.
123
- - [ ] Enforce deterministic code inside Temporal workflows (never use `Math.random()`, `Date.now()`, or direct DB calls in workflow files; run them inside activities).
124
- - [ ] Store large payloads in object storage (S3/R2); pass only IDs and signed URLs through queues.
125
- - [ ] Configure DLQ (Dead Letter Queue) and alert thresholds for persistent failures.
126
-
127
- ## Orchestration & Integration
128
- - Integrates with: `js-backend-expert`, `background-jobs-queue-expert`, `error-resilience-expert`, `saas-billing`, `doku-payment-gateway`.
129
-
130
- ---
131
-
132
- <a name="bahasa-indonesia"></a>
133
- ## Bahasa Indonesia
134
-
135
- ### Tujuan & Gambaran Umum
136
- Panduan arsitektur tingkat produksi untuk merancang pipeline eksekusi background yang tahan-gagal (durable execution), antrean tugas asinkron, dan state machine terdistribusi menggunakan **Temporal.io**, **Trigger.dev v3**, **Inngest**, dan **BullMQ v5**. Menjamin penyelesaian mutlak tugas berdurasi panjang terhadap pembatasan rate limit API, kegagalan worker, dan partisi jaringan.
137
-
138
- ### Kemampuan Utama
139
- 1. **State Machine Tahan-Gagal (Durable Execution)**: Alur kerja (workflow) tetap bertahan saat restart server, deployment, atau gangguan database tanpa kehilangan progres state.
140
- 2. **Pola Transaksi Terdistribusi (Saga Pattern)**: Transaksi multi-langkah yang dilengkapi dengan aktivitas kompensasi (rollback otomatis) jika langkah lanjutan gagal permanen.
141
- 3. **Idempotensi & Anti-Duplikasi**: Menjamin kunci idempotensi unik pada setiap transaksi guna mencegah duplikasi penagihan atau email berulang.
142
- 4. **Pembatasan Rate Limit & DLQ**: Throttling berbasis token bucket, exponential backoff dengan jitter acak, dan dead-letter queue (DLQ) untuk mengisolasi tugas beracun (*poison pills*).
143
-
144
- ---
145
-
146
- ### Resep Implementasi Produksi
147
-
148
- #### Resep 1: Pola Saga Temporal.io dengan Logika Kompensasi (TypeScript)
149
- ```typescript
150
- import { proxyActivities, ApplicationFailure } from '@temporalio/workflow';
151
- import type * as activities from './activities';
152
-
153
- const { tagihPelanggan, aktifkanLisensi, kirimEmailSambutan, kembalikanDana, cabutLisensi } =
154
- proxyActivities<typeof activities>({
155
- startToCloseTimeout: '1 minute',
156
- retry: {
157
- initialInterval: '1s',
158
- backoffCoefficient: 2,
159
- maximumAttempts: 5,
160
- },
161
- });
162
-
163
- export interface InputWorkflowLangganan {
164
- customerId: string;
165
- planId: string;
166
- amountCents: number;
167
- }
168
-
169
- export async function workflowSagaLangganan(input: InputWorkflowLangganan) {
170
- const kompensasi: Array<() => Promise<void>> = [];
171
-
172
- try {
173
- // Langkah 1: Tagih Pembayaran
174
- const hasilTagihan = await tagihPelanggan(input.customerId, input.amountCents);
175
- kompensasi.unshift(() => kembalikanDana(hasilTagihan.chargeId));
176
-
177
- // Langkah 2: Aktifkan Lisensi
178
- const hasilLisensi = await aktifkanLisensi(input.customerId, input.planId);
179
- kompensasi.unshift(() => cabutLisensi(hasilLisensi.licenseId));
180
-
181
- // Langkah 3: Kirim Notifikasi
182
- await kirimEmailSambutan(input.customerId, hasilLisensi.licenseKey);
183
-
184
- return { status: 'SELESAI' };
185
- } catch (error) {
186
- // Eksekusi kompensasi rollback secara berurutan mundur
187
- for (const compensate of kompensasi) {
188
- try {
189
- await compensate();
190
- } catch (err) {
191
- console.error('Kompensasi gagal:', err);
192
- }
193
- }
194
- throw ApplicationFailure.create({
195
- message: `Saga gagal dan dilakukan rollback: ${(error as Error).message}`,
196
- nonRetryable: true,
197
- });
198
- }
199
- }
200
- ```
201
-
202
- #### Resep 2: Tugas Background Tahan-Gagal Trigger.dev v3
203
- ```typescript
204
- import { task } from '@trigger.dev/sdk/v3';
205
-
206
- export const buatLaporanAnalitik = task({
207
- id: 'buat-laporan-analitik',
208
- retry: {
209
- maxAttempts: 4,
210
- factor: 2,
211
- randomize: true, // Jitter
212
- },
213
- run: async (payload: { tenantId: string; bulan: string }, { ctx }) => {
214
- const data = await ctx.run('ambil-data', async () => {
215
- return await ambilDataWarehouse(payload.tenantId, payload.bulan);
216
- });
217
-
218
- const urlPdf = await ctx.run('buat-pdf', async () => {
219
- return await renderDokumenPdf(data);
220
- });
221
-
222
- await ctx.run('kirim-webhook', async () => {
223
- return await notifikasiWebhook(payload.tenantId, urlPdf);
224
- });
225
-
226
- return { sukses: true, urlPdf };
227
- },
228
- });
229
- ```
230
-
231
- ---
232
-
233
- ### Checklist Implementasi
234
- - [ ] Terapkan penanganan rollback (Saga) untuk alur transaksi pembayaran dan provisi akun bertahap.
235
- - [ ] Pastikan kode di dalam alur Temporal selalu deterministik (jangan gunakan `Math.random()` atau kueri DB langsung di dalam workflow, tempatkan di dalam activities).
236
- - [ ] Pindahkan berkas besar ke S3/R2 dan hanya teruskan referensi ID melalui queue.
237
- - [ ] Pasang konfigurasi DLQ (Dead Letter Queue) dan notifikasi peringatan jika ada job yang macet.
238
-
239
- ## Integrasi Orkestrasi
240
- - Terintegrasi dengan: `js-backend-expert`, `background-jobs-queue-expert`, `error-resilience-expert`, `saas-billing`, `doku-payment-gateway`.
1
+ ---
2
+ name: async-queue-temporal-expert
3
+ description: "Unified expert guide for async job queues & durable workflows: BullMQ v5 (Redis queues), Trigger.dev v3 (serverless tasks), Inngest, and Temporal.io (distributed sagas) / Panduan ahli terpadu untuk antrean job asinkron & workflow tahan-gagal: BullMQ v5, Trigger.dev v3, Inngest, dan Temporal.io."
4
+ author: "Roedy Rustam"
5
+ version: "3.0.0"
6
+ ---
7
+
8
+ # Async Queue & Durable Workflow Expert (2026 Unified Edition)
9
+
10
+ [English](#english) | [Bahasa Indonesia](#bahasa-indonesia)
11
+
12
+ ---
13
+
14
+ <a name="english"></a>
15
+ ## English
16
+
17
+ ### Purpose & Overview
18
+ Unified production-grade guide for background execution pipelines, async job queues, and distributed state machines. Covers the full spectrum from simple Redis-backed task queues to complex multi-service sagas with compensating rollbacks.
19
+
20
+ ### 3-Tier Execution Model
21
+ | Tier | Engine | Best For |
22
+ |------|--------|----------|
23
+ | **Tier 1: Redis Task Queues** | BullMQ v5 | High-throughput worker jobs, priority queues, rate limiting, DLQ |
24
+ | **Tier 2: Serverless Durable Tasks** | Trigger.dev v3 / Inngest | Step-checkpointed tasks, automatic resume across crashes, zero infra |
25
+ | **Tier 3: Distributed Sagas** | Temporal.io | Multi-service orchestration, compensating rollbacks, long-running workflows |
26
+
27
+ ### Core Capabilities
28
+ 1. **Idempotency & Deduplication**: Deterministic `jobId` keys prevent double billing or duplicate emails.
29
+ 2. **Dead Letter Queues (DLQ)**: Auto-relocate permanently failing jobs for audit and alerting.
30
+ 3. **Exponential Backoff with Jitter**: Prevents thundering herds on upstream services.
31
+ 4. **Tenant Priority Queues**: VIP/enterprise tiers get lower BullMQ priority numbers (higher throughput).
32
+ 5. **Durable State Machines**: Workflows survive restarts, deployments, and network partitions.
33
+ 6. **Saga Compensations**: Multi-step transactions with automated reverse-order rollbacks.
34
+
35
+ ---
36
+
37
+ ### Tier 1: BullMQ v5 — Redis Task Queues (TypeScript)
38
+
39
+ ```typescript
40
+ import { Queue, Worker, Job } from 'bullmq';
41
+ import Redis from 'ioredis';
42
+
43
+ const redisConnection = new Redis(process.env.REDIS_URL!, {
44
+ maxRetriesPerRequest: null, // Required by BullMQ
45
+ });
46
+
47
+ export interface NotificationPayload {
48
+ tenantId: string;
49
+ userId: string;
50
+ type: 'email' | 'webhook';
51
+ payload: Record<string, unknown>;
52
+ idempotencyKey: string;
53
+ }
54
+
55
+ // Main Queue
56
+ export const notificationQueue = new Queue<NotificationPayload>('notifications', {
57
+ connection: redisConnection,
58
+ defaultJobOptions: {
59
+ attempts: 5,
60
+ backoff: { type: 'exponential', delay: 1500 },
61
+ removeOnComplete: { age: 86400, count: 5000 },
62
+ removeOnFail: false, // Preserved for DLQ audit
63
+ },
64
+ });
65
+
66
+ // Dead Letter Queue
67
+ export const notificationDLQ = new Queue('notifications-dlq', {
68
+ connection: redisConnection,
69
+ });
70
+
71
+ // Enqueue with deduplication & priority
72
+ export async function enqueueNotification(data: NotificationPayload, isVip = false) {
73
+ return await notificationQueue.add('send_notification', data, {
74
+ jobId: `notif_${data.idempotencyKey}`, // Deterministic dedup key
75
+ priority: isVip ? 1 : 10,
76
+ });
77
+ }
78
+
79
+ // Worker with concurrency & rate limiting
80
+ export const notificationWorker = new Worker<NotificationPayload>(
81
+ 'notifications',
82
+ async (job: Job<NotificationPayload>) => {
83
+ if (job.data.type === 'email') await deliverEmail(job.data);
84
+ },
85
+ {
86
+ connection: redisConnection,
87
+ concurrency: 20,
88
+ limiter: { max: 100, duration: 1000 },
89
+ }
90
+ );
91
+
92
+ // DLQ forwarding on retry exhaustion
93
+ notificationWorker.on('failed', async (job, error) => {
94
+ if (job && job.attemptsMade >= (job.opts.attempts || 5)) {
95
+ await notificationDLQ.add('failed_notification', {
96
+ originalJobId: job.id, failedReason: error.message,
97
+ data: job.data, exhaustedAt: new Date().toISOString(),
98
+ });
99
+ }
100
+ });
101
+ ```
102
+
103
+ ---
104
+
105
+ ### Tier 2: Trigger.dev v3 — Serverless Durable Tasks
106
+
107
+ ```typescript
108
+ import { task } from '@trigger.dev/sdk/v3';
109
+
110
+ export const generateReport = task({
111
+ id: 'generate-enterprise-report',
112
+ retry: { maxAttempts: 4, minTimeoutInMs: 2000, factor: 2, randomize: true },
113
+ run: async (payload: { tenantId: string; month: string }, { ctx }) => {
114
+ // Each step is a durable checkpoint — survives crashes
115
+ const data = await ctx.run('fetch-telemetry', async () => {
116
+ return await fetchTelemetryFromWarehouse(payload.tenantId, payload.month);
117
+ });
118
+ const pdfUrl = await ctx.run('render-pdf', async () => {
119
+ return await generateReportPdf(data);
120
+ });
121
+ await ctx.run('dispatch-webhook', async () => {
122
+ return await sendWebhookNotification(payload.tenantId, pdfUrl);
123
+ });
124
+ return { success: true, pdfUrl };
125
+ },
126
+ });
127
+ ```
128
+
129
+ ---
130
+
131
+ ### Tier 3: Temporal.io — Distributed Saga with Compensations
132
+
133
+ ```typescript
134
+ import { proxyActivities, ApplicationFailure } from '@temporalio/workflow';
135
+ import type * as activities from './activities';
136
+
137
+ const { chargeCustomer, provisionLicense, sendWelcomeEmail, refundCustomer, revokeLicense } =
138
+ proxyActivities<typeof activities>({
139
+ startToCloseTimeout: '1 minute',
140
+ retry: {
141
+ initialInterval: '1s', backoffCoefficient: 2, maximumAttempts: 5,
142
+ nonRetryableErrorTypes: ['InvalidCardError', 'AccountSuspendedError'],
143
+ },
144
+ });
145
+
146
+ export async function subscriptionSagaWorkflow(input: {
147
+ customerId: string; planId: string; amountCents: number;
148
+ }) {
149
+ const compensations: Array<() => Promise<void>> = [];
150
+ try {
151
+ const charge = await chargeCustomer(input.customerId, input.amountCents);
152
+ compensations.unshift(() => refundCustomer(charge.chargeId));
153
+
154
+ const license = await provisionLicense(input.customerId, input.planId);
155
+ compensations.unshift(() => revokeLicense(license.licenseId));
156
+
157
+ await sendWelcomeEmail(input.customerId, license.licenseKey);
158
+ return { status: 'COMPLETED' };
159
+ } catch (error) {
160
+ for (const compensate of compensations) {
161
+ try { await compensate(); } catch (e) { console.error('Compensation failed:', e); }
162
+ }
163
+ throw ApplicationFailure.create({
164
+ message: `Saga rolled back: ${(error as Error).message}`, nonRetryable: true,
165
+ });
166
+ }
167
+ }
168
+ ```
169
+
170
+ > **Temporal Determinism Rule**: Never use `Math.random()`, `Date.now()`, or direct DB calls inside workflow files. Run them inside activities.
171
+
172
+ ---
173
+
174
+ ### Implementation Checklist
175
+ - [ ] Configure `maxRetriesPerRequest: null` on ioredis for BullMQ v5.
176
+ - [ ] Use deterministic `jobId` from business logic (`order_${orderId}`) for deduplication.
177
+ - [ ] Forward permanently dead jobs to DLQ via `worker.on('failed')` listener.
178
+ - [ ] Implement rate limiting via worker `limiter` to protect third-party APIs.
179
+ - [ ] Enforce deterministic code inside Temporal workflows (activities for side-effects).
180
+ - [ ] Store large payloads in S3/R2; pass only IDs through queues.
181
+ - [ ] Implement Saga rollback handlers for multi-step distributed payments.
182
+
183
+ ## Orchestration & Integration
184
+ - Integrates with: `js-backend-expert`, `cron-scheduler-expert`, `error-resilience-expert`, `saas-billing`, `doku-payment-gateway`, `data-telemetry-expert`.
185
+
186
+ ---
187
+
188
+ <a name="bahasa-indonesia"></a>
189
+ ## Bahasa Indonesia
190
+
191
+ ### Tujuan & Gambaran Umum
192
+ Panduan terpadu tingkat produksi untuk pipeline eksekusi latar belakang, antrean job asinkron, dan state machine terdistribusi. Mencakup spektrum penuh dari antrean Redis sederhana hingga saga multi-layanan dengan rollback kompensasi.
193
+
194
+ ### Model Eksekusi 3-Tier
195
+ | Tier | Engine | Cocok Untuk |
196
+ |------|--------|-------------|
197
+ | **Tier 1: Antrean Redis** | BullMQ v5 | Job worker throughput tinggi, prioritas, rate limiting, DLQ |
198
+ | **Tier 2: Task Serverless** | Trigger.dev v3 / Inngest | Task dengan checkpoint, resume otomatis, tanpa infra |
199
+ | **Tier 3: Saga Terdistribusi** | Temporal.io | Orkestrasi multi-layanan, rollback kompensasi, workflow jangka panjang |
200
+
201
+ ### Kemampuan Utama
202
+ 1. **Idempotensi & Deduplikasi**: Kunci `jobId` deterministik mencegah duplikasi penagihan atau email.
203
+ 2. **Dead Letter Queue (DLQ)**: Pemindahan otomatis job gagal total untuk audit.
204
+ 3. **Backoff Eksponensial + Jitter**: Mencegah thundering herd pada server hilir.
205
+ 4. **Prioritas Tenant**: Tier VIP/enterprise mendapat prioritas lebih tinggi (angka lebih kecil di BullMQ).
206
+ 5. **State Machine Tahan-Gagal**: Workflow bertahan saat restart, deployment, dan partisi jaringan.
207
+ 6. **Kompensasi Saga**: Transaksi multi-langkah dengan rollback otomatis urutan mundur.
208
+
209
+ ### Checklist Implementasi
210
+ - [ ] Atur `maxRetriesPerRequest: null` pada ioredis untuk BullMQ v5.
211
+ - [ ] Gunakan `jobId` deterministik dari ID bisnis (`invoice_${invoiceId}`) untuk deduplikasi.
212
+ - [ ] Pasang listener `worker.on('failed')` untuk forward job gagal ke DLQ.
213
+ - [ ] Terapkan rate limiter pada worker untuk stabilitas API eksternal.
214
+ - [ ] Pastikan kode Temporal selalu deterministik (side-effect hanya di activities).
215
+ - [ ] Simpan file besar di S3/R2; kirim hanya referensi ID melalui queue.
216
+
217
+ ## Integrasi Orkestrasi
218
+ - Terintegrasi dengan: `js-backend-expert`, `cron-scheduler-expert`, `error-resilience-expert`, `saas-billing`, `doku-payment-gateway`, `data-telemetry-expert`.