vibes-plug 2.5.0 → 2.11.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.
- package/.claude/rules/vibes-plug-core.md +32 -0
- package/.cursor/rules/vibes-plug-core.mdc +51 -0
- package/.cursorrules +42 -0
- package/AGENTS.md +37 -7
- package/BLUEPRINT.md +309 -217
- package/CHANGELOG.md +133 -1
- package/CLAUDE.md +70 -0
- package/LICENSE +1 -1
- package/README.md +641 -415
- package/index.js +19 -0
- package/package.json +44 -8
- package/plugin.json +24 -7
- package/scripts/generate_swarm_gif.py +295 -0
- package/scripts/install.js +201 -0
- package/skills/accessibility-testing-expert/SKILL.md +116 -0
- package/skills/ai-cost-token-optimizer/SKILL.md +82 -52
- package/skills/ai-evals-benchmark-expert/SKILL.md +188 -0
- package/skills/ai-llm-integration-expert/SKILL.md +185 -178
- package/skills/ai-media-generation-expert/SKILL.md +172 -0
- package/skills/ai-prompt-engineering-expert/SKILL.md +84 -0
- package/skills/angular-expert/SKILL.md +148 -0
- package/skills/api-design-expert/SKILL.md +6 -3
- package/skills/api-gateway-proxy-expert/SKILL.md +81 -0
- package/skills/app-analyzer-optimizer/SKILL.md +6 -3
- package/skills/apple-ecosystem-expert/SKILL.md +144 -141
- package/skills/{asisten_ramah → asisten-ramah}/SKILL.md +7 -1
- package/skills/astro-framework-expert/SKILL.md +200 -0
- package/skills/async-queue-temporal-expert/SKILL.md +210 -24
- package/skills/authentication-identity-expert/SKILL.md +278 -275
- package/skills/auto-doc-updater/SKILL.md +7 -1
- package/skills/autonomous-chaos-monkey/SKILL.md +63 -63
- package/skills/autonomous-red-teamer/SKILL.md +172 -28
- package/skills/autonomous-tdd-debugger/SKILL.md +70 -64
- package/skills/background-jobs-queue-expert/SKILL.md +235 -0
- package/skills/biome-linter-formatter-expert/SKILL.md +89 -0
- package/skills/blockchain-web3-expert/SKILL.md +115 -0
- package/skills/bootstrap-to-modern/SKILL.md +9 -6
- package/skills/brainstorming/SKILL.md +58 -50
- package/skills/browser-automation-expert/SKILL.md +197 -21
- package/skills/bun-runtime-expert/SKILL.md +7 -1
- package/skills/chatbot-messaging-expert/SKILL.md +114 -0
- package/skills/ci-cd-devops-architect/SKILL.md +45 -36
- package/skills/cloud-hosting-expert/SKILL.md +7 -1
- package/skills/coderabbit/SKILL.md +7 -1
- package/skills/compliance-gdpr-privacy-expert/SKILL.md +85 -0
- package/skills/cron-scheduler-expert/SKILL.md +303 -297
- package/skills/data-pipeline-etl-expert/SKILL.md +84 -0
- package/skills/data-telemetry-expert/SKILL.md +7 -1
- package/skills/data-visualization-expert/SKILL.md +154 -0
- package/skills/database-migration-versioning-expert/SKILL.md +90 -0
- package/skills/database-orm-expert/SKILL.md +13 -3
- package/skills/dependency-upgrade-migrator/SKILL.md +300 -294
- package/skills/design-system-architect/SKILL.md +278 -259
- package/skills/desktop-electron-expert/SKILL.md +128 -0
- package/skills/documentation-site-expert/SKILL.md +59 -0
- package/skills/doku-mcp-server/SKILL.md +7 -1
- package/skills/doku-payment-gateway/SKILL.md +7 -1
- package/skills/domain-driven-design-expert/SKILL.md +82 -0
- package/skills/e2e-testing-expert/SKILL.md +7 -1
- package/skills/ecommerce-expert/SKILL.md +87 -0
- package/skills/edge-serverless-db-expert/SKILL.md +98 -42
- package/skills/email-notification-expert/SKILL.md +367 -361
- package/skills/error-resilience-expert/SKILL.md +485 -479
- package/skills/event-driven-architect/SKILL.md +7 -1
- package/skills/feature-flag-analytics-expert/SKILL.md +65 -45
- package/skills/file-upload-media-expert/SKILL.md +436 -430
- package/skills/firebase-security-expert/SKILL.md +7 -1
- package/skills/form-validation-expert/SKILL.md +406 -400
- package/skills/fullstack-expert/SKILL.md +60 -1
- package/skills/gemini-agent-booster/SKILL.md +173 -135
- package/skills/geospatial-maps-expert/SKILL.md +80 -0
- package/skills/global-a11y-i18n-expert/SKILL.md +7 -1
- package/skills/glsl-shader-expert/SKILL.md +106 -100
- package/skills/go-programming-expert/SKILL.md +21 -15
- package/skills/graph-rag-knowledge-expert/SKILL.md +159 -0
- package/skills/graphql-apollo-expert/SKILL.md +113 -107
- package/skills/headless-cms-expert/SKILL.md +181 -0
- package/skills/hig/SKILL.md +7 -1
- package/skills/js-backend-expert/SKILL.md +218 -216
- package/skills/legacy-code-translator/SKILL.md +70 -64
- package/skills/local-slm-edge-ai-expert/SKILL.md +167 -0
- package/skills/logging-error-tracking-expert/SKILL.md +343 -337
- package/skills/mcp-client-orchestrator/SKILL.md +75 -69
- package/skills/mcp-server-architect/SKILL.md +294 -194
- package/skills/micro-frontend-architect/SKILL.md +111 -105
- package/skills/mobile-expo-expert/SKILL.md +8 -2
- package/skills/mobile-push-notification-expert/SKILL.md +70 -50
- package/skills/modern-css-native-expert/SKILL.md +189 -0
- package/skills/monday-design-aesthetic/SKILL.md +7 -1
- package/skills/monorepo-architect/SKILL.md +7 -1
- package/skills/mpa-orchestrator/SKILL.md +20 -1
- package/skills/multi-agent-orchestration/SKILL.md +254 -234
- package/skills/multiple-entry-points/SKILL.md +37 -1
- package/skills/mvc-expert/SKILL.md +7 -1
- package/skills/n8n-automation-expert/SKILL.md +89 -0
- package/skills/nextjs-app-router-expert/SKILL.md +148 -0
- package/skills/openapi-swagger-codegen-expert/SKILL.md +67 -0
- package/skills/payment-gateway-expert/SKILL.md +85 -1
- package/skills/pdf-document-generation-expert/SKILL.md +91 -0
- package/skills/performance-web-vitals/SKILL.md +7 -1
- package/skills/post-quantum-crypto-migrator/SKILL.md +57 -57
- package/skills/prd-architect/SKILL.md +7 -1
- package/skills/proactive-background-watcher/SKILL.md +67 -61
- package/skills/production-ready-hardener/SKILL.md +461 -455
- package/skills/project-context-mapper/SKILL.md +84 -78
- package/skills/pwa-offline-first-expert/SKILL.md +185 -0
- package/skills/python-programming-expert/SKILL.md +407 -401
- package/skills/rate-limit-abuse-prevention/SKILL.md +376 -370
- package/skills/realtime-collaboration-expert/SKILL.md +55 -1
- package/skills/rich-text-editor-expert/SKILL.md +177 -0
- package/skills/rust-programming-expert/SKILL.md +7 -1
- package/skills/saas-billing/SKILL.md +7 -1
- package/skills/saas-multi-tenant/SKILL.md +7 -1
- package/skills/saas-mvp-launcher/SKILL.md +20 -1
- package/skills/saas-transformer/SKILL.md +499 -488
- package/skills/scalability-clean-code/SKILL.md +7 -1
- package/skills/search-engine-expert/SKILL.md +89 -0
- package/skills/secure-fuzz-testing/SKILL.md +7 -1
- package/skills/self-evolving-memory-graph/SKILL.md +90 -74
- package/skills/self-healing-cloud-orchestrator/SKILL.md +57 -57
- package/skills/senior-frontend/SKILL.md +141 -161
- package/skills/seo/SKILL.md +41 -17
- package/skills/session-context-loader/SKILL.md +82 -76
- package/skills/session-handoff-resume/SKILL.md +7 -1
- package/skills/{skill_baru → skill-baru}/SKILL.md +8 -2
- package/skills/solidjs-expert/SKILL.md +80 -0
- package/skills/spa-orchestrator/SKILL.md +20 -1
- package/skills/sse-websocket-streaming-expert/SKILL.md +93 -0
- package/skills/state-management-expert/SKILL.md +7 -1
- package/skills/supabase-migration/SKILL.md +47 -1
- package/skills/supabase-security-expert/SKILL.md +7 -1
- package/skills/svelte-sveltekit-expert/SKILL.md +91 -0
- package/skills/svg-animation-motion-expert/SKILL.md +115 -0
- package/skills/tailwind-expert/SKILL.md +88 -136
- package/skills/tanstack-query-expert/SKILL.md +7 -1
- package/skills/tauri-expert/SKILL.md +7 -1
- package/skills/token-saver/SKILL.md +1 -1
- package/skills/typescript-expert/SKILL.md +12 -6
- package/skills/ui-components-expert/SKILL.md +165 -279
- package/skills/ui-ux-pro-max/SKILL.md +23 -3
- package/skills/vector-db-rag-expert/SKILL.md +175 -19
- package/skills/vibe-code-gardener/SKILL.md +1 -1
- package/skills/visual-qa-vision-agent/SKILL.md +70 -64
- package/skills/voice-ai-realtime-agent/SKILL.md +202 -0
- package/skills/vue-frontend-expert/SKILL.md +131 -125
- package/skills/wasm-edge-computing-expert/SKILL.md +97 -0
- package/skills/web-3d-graphics-expert/SKILL.md +136 -130
- package/skills/web-game-engine-expert/SKILL.md +101 -95
- package/skills/web-scraper/SKILL.md +157 -207
- package/skills/website-design-cloner/SKILL.md +179 -173
- package/skills/webxr-ar-vr-expert/SKILL.md +122 -116
- package/skills/wordpress-headless-expert/SKILL.md +144 -0
- package/skills/zero-to-prod-orchestrator/SKILL.md +52 -27
- package/skills/zero-trust-secret-vault/SKILL.md +87 -39
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
- package/.github/workflows/publish.yml +0 -20
- package/CONTRIBUTING.md +0 -199
- package/SECURITY.md +0 -21
- package/banner.png +0 -0
- package/skills/autonomous-swarm-director/SKILL.md +0 -69
- package/skills/hyper-context-synthesizer/SKILL.md +0 -55
- package/skills/llm-cost-arbitrage-router/SKILL.md +0 -59
- package/skills/senior-fullstack/SKILL.md +0 -167
- package/skills/senior-fullstack/references/architecture_patterns.md +0 -160
- package/skills/senior-fullstack/references/development_workflows.md +0 -222
- package/skills/senior-fullstack/references/tech_stack_guide.md +0 -190
- package/skills/senior-fullstack/scripts/code_quality_analyzer.py +0 -114
- package/skills/senior-fullstack/scripts/fullstack_scaffolder.py +0 -114
- package/skills/senior-fullstack/scripts/project_scaffolder.py +0 -114
- package/skills/seo-aeo-landing-page-writer/SKILL.md +0 -97
- package/skills/seo-geo/SKILL.md +0 -188
- package/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-310.pyc +0 -0
- package/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-312.pyc +0 -0
- package/skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-310.pyc +0 -0
- package/skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-312.pyc +0 -0
- package/skills/ui_ux_expert/SKILL.md +0 -125
- package/vibes-swarm-demo.gif +0 -0
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: background-jobs-queue-expert
|
|
3
|
+
description: "Dedicated deep-dive for BullMQ v5, Trigger.dev v3, Inngest, delayed jobs, job deduplication, idempotency, dead letter queues, and job priority / Panduan mendalam untuk BullMQ v5, Trigger.dev v3, Inngest, delayed jobs, deduplikasi job, idempotency, dead letter queue, dan prioritas job."
|
|
4
|
+
author: "Roedy Rustam"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Background Jobs & Queue Expert (BullMQ v5 & Resilient Queues)
|
|
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 engineering guide for background job queues and asynchronous task processing using **BullMQ v5**, **Trigger.dev v3**, and **Inngest**. Focuses on the core mechanics of fault-tolerant distributed queues: job deduplication, multi-tenant priority queues, exponential backoff jitter, Dead Letter Queue (DLQ) automated forwarding, and strict transactional idempotency.
|
|
18
|
+
|
|
19
|
+
### Key Capabilities
|
|
20
|
+
1. **Strict Idempotency**: Ensuring background workers execute with deterministic effects using database-backed idempotency keys.
|
|
21
|
+
2. **Job Deduplication**: Leveraging deterministic BullMQ `jobId` hashing to prevent duplicate enqueueing of ongoing or delayed tasks.
|
|
22
|
+
3. **Dead Letter Queues (DLQ)**: Automatic relocation of permanently failing jobs after retry exhaustion for manual inspection and alerting.
|
|
23
|
+
4. **Tenant Prioritization**: Differentiating throughput between VIP/enterprise tiers and free-tier users using BullMQ job priorities.
|
|
24
|
+
5. **Backoff Jitter & Throttling**: Exponential backoff combined with randomized full jitter to prevent upstream thundering herds.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
### Production Implementation Recipes
|
|
29
|
+
|
|
30
|
+
#### Recipe 1: Production BullMQ v5 Worker with Deduplication & DLQ Forwarding (TypeScript)
|
|
31
|
+
```typescript
|
|
32
|
+
import { Queue, Worker, Job } from 'bullmq';
|
|
33
|
+
import Redis from 'ioredis';
|
|
34
|
+
|
|
35
|
+
const redisConnection = new Redis(process.env.REDIS_URL || 'redis://localhost:6379', {
|
|
36
|
+
maxRetriesPerRequest: null, // Required by BullMQ
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
export interface NotificationPayload {
|
|
40
|
+
tenantId: string;
|
|
41
|
+
userId: string;
|
|
42
|
+
type: 'email' | 'webhook';
|
|
43
|
+
payload: Record<string, unknown>;
|
|
44
|
+
idempotencyKey: string;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Main Queue
|
|
48
|
+
export const notificationQueue = new Queue<NotificationPayload>('notifications', {
|
|
49
|
+
connection: redisConnection,
|
|
50
|
+
defaultJobOptions: {
|
|
51
|
+
attempts: 5,
|
|
52
|
+
backoff: {
|
|
53
|
+
type: 'exponential',
|
|
54
|
+
delay: 1500, // Starts at 1.5s, doubles up to ~24s with jitter
|
|
55
|
+
},
|
|
56
|
+
removeOnComplete: { age: 86400, count: 5000 },
|
|
57
|
+
removeOnFail: false, // Preserved for DLQ audit
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
// Dead Letter Queue (DLQ)
|
|
62
|
+
export const notificationDLQ = new Queue('notifications-dlq', {
|
|
63
|
+
connection: redisConnection,
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Enqueues a notification job with strict deduplication and priority
|
|
68
|
+
*/
|
|
69
|
+
export async function enqueueNotification(
|
|
70
|
+
data: NotificationPayload,
|
|
71
|
+
isVip = false
|
|
72
|
+
) {
|
|
73
|
+
return await notificationQueue.add('send_notification', data, {
|
|
74
|
+
jobId: `notif_${data.idempotencyKey}`, // Deterministic deduplication key
|
|
75
|
+
priority: isVip ? 1 : 10, // Lower numbers denote higher priority in BullMQ
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Background Worker
|
|
80
|
+
export const notificationWorker = new Worker<NotificationPayload>(
|
|
81
|
+
'notifications',
|
|
82
|
+
async (job: Job<NotificationPayload>) => {
|
|
83
|
+
console.log(`[Worker] Processing Job ${job.id} for Tenant: ${job.data.tenantId}`);
|
|
84
|
+
|
|
85
|
+
// Simulate task processing with idempotency verification
|
|
86
|
+
if (job.data.type === 'email') {
|
|
87
|
+
await deliverEmail(job.data);
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
connection: redisConnection,
|
|
92
|
+
concurrency: 20, // Max concurrent jobs per worker process
|
|
93
|
+
limiter: {
|
|
94
|
+
max: 100, // Maximum 100 jobs processed
|
|
95
|
+
duration: 1000, // Per 1000ms (Rate Limiting)
|
|
96
|
+
},
|
|
97
|
+
}
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
// Forward to DLQ upon exhaustion of retry attempts
|
|
101
|
+
notificationWorker.on('failed', async (job, error) => {
|
|
102
|
+
if (job && job.attemptsMade >= (job.opts.attempts || 5)) {
|
|
103
|
+
console.error(`[DLQ] Job ${job.id} exhausted retries. Forwarding to notifications-dlq:`, error.message);
|
|
104
|
+
await notificationDLQ.add('failed_notification', {
|
|
105
|
+
originalJobId: job.id,
|
|
106
|
+
failedReason: error.message,
|
|
107
|
+
data: job.data,
|
|
108
|
+
exhaustedAt: new Date().toISOString(),
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
### Implementation Checklist
|
|
117
|
+
- [ ] Configure `maxRetriesPerRequest: null` on the Redis client as required by BullMQ v5.
|
|
118
|
+
- [ ] Use deterministic `jobId` derived from business logic (`order_${orderId}`) to enforce deduplication.
|
|
119
|
+
- [ ] Add event listener on `failed` to automatically forward permanently dead jobs to a Dead Letter Queue.
|
|
120
|
+
- [ ] Implement rate limiting using worker `limiter` to protect third-party services against rate-limit bans.
|
|
121
|
+
|
|
122
|
+
## Orchestration & Integration
|
|
123
|
+
- Integrates with: `js-backend-expert`, `async-queue-temporal-expert`, `error-resilience-expert`, `data-telemetry-expert`.
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
<a name="bahasa-indonesia"></a>
|
|
128
|
+
## Bahasa Indonesia
|
|
129
|
+
|
|
130
|
+
### Tujuan & Gambaran Umum
|
|
131
|
+
Panduan rekayasa tingkat produksi untuk antrean pekerjaan latar belakang (*background job queues*) dan pemrosesan tugas asinkron menggunakan **BullMQ v5**, **Trigger.dev v3**, dan **Inngest**. Berfokus pada mekanika inti antrean terdistribusi yang tangguh: deduplikasi job, prioritas multi-tenant, *exponential backoff jitter*, pemindahan otomatis ke Dead Letter Queue (DLQ), dan idempotensi transaksi yang ketat.
|
|
132
|
+
|
|
133
|
+
### Kemampuan Utama
|
|
134
|
+
1. **Idempotensi Ketat**: Memastikan pekerja (*worker*) mengeksekusi tugas dengan dampak deterministik menggunakan kunci idempotensi yang tercatat di database.
|
|
135
|
+
2. **Deduplikasi Job**: Memanfaatkan penetapan `jobId` deterministik di BullMQ untuk mencegah antrean ganda pada tugas yang sedang berjalan atau tertunda.
|
|
136
|
+
3. **Dead Letter Queue (DLQ)**: Pemindahan otomatis tugas yang gagal total setelah jatah percobaan ulang habis untuk audit dan penanganan manual.
|
|
137
|
+
4. **Prioritas Tenant**: Membedakan prioritas tugas antara pengguna VIP/Enterprise dengan pengguna paket gratis menggunakan nilai prioritas BullMQ.
|
|
138
|
+
5. **Backoff Jitter & Throttling**: Mekanisme penundaan eksponensial dengan *jitter* acak untuk mencegah fenomena *thundering herd* pada server hilir.
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
### Resep Implementasi Produksi
|
|
143
|
+
|
|
144
|
+
#### Resep 1: Worker BullMQ v5 Produksi dengan Deduplikasi & Forward DLQ (TypeScript)
|
|
145
|
+
```typescript
|
|
146
|
+
import { Queue, Worker, Job } from 'bullmq';
|
|
147
|
+
import Redis from 'ioredis';
|
|
148
|
+
|
|
149
|
+
const koneksiRedis = new Redis(process.env.REDIS_URL || 'redis://localhost:6379', {
|
|
150
|
+
maxRetriesPerRequest: null,
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
export interface MuatanNotifikasi {
|
|
154
|
+
tenantId: string;
|
|
155
|
+
userId: string;
|
|
156
|
+
type: 'email' | 'webhook';
|
|
157
|
+
payload: Record<string, unknown>;
|
|
158
|
+
idempotencyKey: string;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Antrean Utama
|
|
162
|
+
export const antreanNotifikasi = new Queue<MuatanNotifikasi>('notifikasi', {
|
|
163
|
+
connection: koneksiRedis,
|
|
164
|
+
defaultJobOptions: {
|
|
165
|
+
attempts: 5,
|
|
166
|
+
backoff: {
|
|
167
|
+
type: 'exponential',
|
|
168
|
+
delay: 1500,
|
|
169
|
+
},
|
|
170
|
+
removeOnComplete: { age: 86400, count: 5000 },
|
|
171
|
+
removeOnFail: false,
|
|
172
|
+
},
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
// Antrean Dead Letter (DLQ)
|
|
176
|
+
export const antreanDLQ = new Queue('notifikasi-dlq', {
|
|
177
|
+
connection: koneksiRedis,
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Memasukkan tugas ke antrean dengan deduplikasi dan prioritas
|
|
182
|
+
*/
|
|
183
|
+
export async function masukkanNotifikasi(
|
|
184
|
+
data: MuatanNotifikasi,
|
|
185
|
+
isVip = false
|
|
186
|
+
) {
|
|
187
|
+
return await antreanNotifikasi.add('kirim_notifikasi', data, {
|
|
188
|
+
jobId: `notif_${data.idempotencyKey}`, // Kunci deduplikasi unik
|
|
189
|
+
priority: isVip ? 1 : 10, // Nilai lebih kecil menandakan prioritas lebih tinggi
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Worker Pemroses
|
|
194
|
+
export const workerNotifikasi = new Worker<MuatanNotifikasi>(
|
|
195
|
+
'notifikasi',
|
|
196
|
+
async (job: Job<MuatanNotifikasi>) => {
|
|
197
|
+
console.log(`[Worker] Memproses Job ${job.id} untuk Tenant: ${job.data.tenantId}`);
|
|
198
|
+
if (job.data.type === 'email') {
|
|
199
|
+
await kirimEmail(job.data);
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
connection: koneksiRedis,
|
|
204
|
+
concurrency: 20,
|
|
205
|
+
limiter: {
|
|
206
|
+
max: 100,
|
|
207
|
+
duration: 1000,
|
|
208
|
+
},
|
|
209
|
+
}
|
|
210
|
+
);
|
|
211
|
+
|
|
212
|
+
// Teruskan ke DLQ jika jatah retry telah habis
|
|
213
|
+
workerNotifikasi.on('failed', async (job, error) => {
|
|
214
|
+
if (job && job.attemptsMade >= (job.opts.attempts || 5)) {
|
|
215
|
+
console.error(`[DLQ] Job ${job.id} gagal total. Memindahkan ke DLQ:`, error.message);
|
|
216
|
+
await antreanDLQ.add('notifikasi_gagal', {
|
|
217
|
+
originalJobId: job.id,
|
|
218
|
+
failedReason: error.message,
|
|
219
|
+
data: job.data,
|
|
220
|
+
exhaustedAt: new Date().toISOString(),
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
### Checklist Implementasi
|
|
229
|
+
- [ ] Atur konfigurasi `maxRetriesPerRequest: null` pada koneksi ioredis untuk BullMQ v5.
|
|
230
|
+
- [ ] Gunakan `jobId` deterministik dari ID transaksi bisnis (`invoice_${invoiceId}`) untuk mencegah duplikasi.
|
|
231
|
+
- [ ] Pasang *event listener* pada event `failed` untuk meneruskan job yang gagal total ke antrean DLQ.
|
|
232
|
+
- [ ] Terapkan pembatasan *rate limiter* pada worker untuk menjaga kestabilan API eksternal.
|
|
233
|
+
|
|
234
|
+
## Integrasi Orkestrasi
|
|
235
|
+
- Terintegrasi dengan: `js-backend-expert`, `async-queue-temporal-expert`, `error-resilience-expert`, `data-telemetry-expert`.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: biome-linter-formatter-expert
|
|
3
|
+
description: "Expert guide for Biome (Rust-based linter + formatter), ESLint/Prettier migration, and code quality tooling / Panduan ahli Biome (linter + formatter berbasis Rust), migrasi dari ESLint/Prettier, dan tooling kualitas kode."
|
|
4
|
+
author: "Roedy Rustam"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Biome Linter & Formatter Expert (2026 Edition)
|
|
8
|
+
|
|
9
|
+
[English](#english) | [Bahasa Indonesia](#bahasa-indonesia)
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
<a name="english"></a>
|
|
14
|
+
## English
|
|
15
|
+
|
|
16
|
+
### Orchestration & Integration
|
|
17
|
+
- **`monorepo-architect`**: Biome configuration in monorepo workspaces.
|
|
18
|
+
- **`ci-cd-devops-architect`**: Biome in CI/CD pipelines.
|
|
19
|
+
- **`scalability-clean-code`**: Code quality standards enforcement.
|
|
20
|
+
- **`typescript-expert`**: TypeScript-specific lint rules.
|
|
21
|
+
|
|
22
|
+
### Description
|
|
23
|
+
Expert guide for Biome v2, the Rust-based unified linter and formatter replacing ESLint + Prettier. Covers migration from ESLint/Prettier, custom rule configuration, CI integration, monorepo setup, and editor integration. Includes performance comparison and best practices for 2026 JavaScript/TypeScript projects.
|
|
24
|
+
|
|
25
|
+
### Trigger Conditions
|
|
26
|
+
- Setting up code linting and formatting for new projects.
|
|
27
|
+
- Migrating from ESLint + Prettier to Biome.
|
|
28
|
+
- Configuring Biome in monorepo or CI/CD pipelines.
|
|
29
|
+
- Resolving linting or formatting configuration issues.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
### Why Biome over ESLint + Prettier?
|
|
34
|
+
|
|
35
|
+
| Aspect | Biome v2 | ESLint 9 + Prettier 3 |
|
|
36
|
+
|--------|----------|----------------------|
|
|
37
|
+
| Speed | 10-100x faster (Rust) | Baseline (Node.js) |
|
|
38
|
+
| Config Files | 1 (`biome.json`) | 2-3 files |
|
|
39
|
+
| Formatter + Linter | ✅ Unified | Separate tools |
|
|
40
|
+
| Import Sorting | ✅ Built-in | Plugin required |
|
|
41
|
+
| CSS/JSON Support | ✅ Built-in | Plugin required |
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# Install and init
|
|
45
|
+
npm install --save-dev @biomejs/biome
|
|
46
|
+
npx biome init
|
|
47
|
+
|
|
48
|
+
# Migrate from ESLint/Prettier
|
|
49
|
+
npx biome migrate eslint --write
|
|
50
|
+
npx biome migrate prettier --write
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
```json
|
|
54
|
+
// biome.json
|
|
55
|
+
{
|
|
56
|
+
"$schema": "https://biomejs.dev/schemas/2.0.0/schema.json",
|
|
57
|
+
"organizeImports": { "enabled": true },
|
|
58
|
+
"linter": {
|
|
59
|
+
"enabled": true,
|
|
60
|
+
"rules": {
|
|
61
|
+
"recommended": true,
|
|
62
|
+
"complexity": { "noExcessiveCognitiveComplexity": "warn" },
|
|
63
|
+
"suspicious": { "noExplicitAny": "error" }
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
"formatter": {
|
|
67
|
+
"enabled": true,
|
|
68
|
+
"indentStyle": "space",
|
|
69
|
+
"indentWidth": 2,
|
|
70
|
+
"lineWidth": 100
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Orchestration & Integration
|
|
76
|
+
- `monorepo-architect`, `ci-cd-devops-architect`, `scalability-clean-code`
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
<a name="bahasa-indonesia"></a>
|
|
81
|
+
## Bahasa Indonesia
|
|
82
|
+
|
|
83
|
+
### Deskripsi
|
|
84
|
+
Panduan ahli Biome v2, linter dan formatter berbasis Rust yang menggantikan ESLint + Prettier. Mencakup migrasi, konfigurasi rule, integrasi CI, dan setup monorepo.
|
|
85
|
+
|
|
86
|
+
### Kondisi Pemicu
|
|
87
|
+
- Menyiapkan linting dan formatting kode untuk proyek baru.
|
|
88
|
+
- Migrasi dari ESLint + Prettier ke Biome.
|
|
89
|
+
- Mengkonfigurasi Biome di monorepo atau pipeline CI/CD.
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: blockchain-web3-expert
|
|
3
|
+
description: "Expert guide for Web3 and blockchain dApp integration — viem, wagmi v2, ethers.js v6, RainbowKit, smart contract interactions, and EVM wallet state / Panduan ahli integrasi Web3 dan blockchain."
|
|
4
|
+
author: "Roedy Rustam"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Blockchain & Web3 Expert (2026 Edition)
|
|
8
|
+
|
|
9
|
+
[English](#english) | [Bahasa Indonesia](#bahasa-indonesia)
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
<a name="english"></a>
|
|
14
|
+
## English
|
|
15
|
+
|
|
16
|
+
### Orchestration & Integration
|
|
17
|
+
- **`senior-frontend`**: React and Next.js frontend state for Web3 wallets.
|
|
18
|
+
- **`authentication-identity-expert`**: Sign-In with Ethereum (SIWE / ERC-4361).
|
|
19
|
+
- **`error-resilience-expert`**: Handling RPC node timeouts, network switches, and user transaction rejections.
|
|
20
|
+
- **`post-quantum-crypto-migrator`**: Future-proofing cryptographic signatures and hash functions.
|
|
21
|
+
|
|
22
|
+
### Description
|
|
23
|
+
Production-ready guide for building decentralized applications (dApps) on EVM-compatible blockchains. Covers typed smart contract interactions with **viem** and **wagmi v2**, wallet connectivity with **RainbowKit / AppKit**, gas estimation, transaction lifecycle management, ERC-20 / ERC-721 / ERC-1155 standards, and decentralized storage (IPFS/Arweave).
|
|
24
|
+
|
|
25
|
+
### Trigger Conditions
|
|
26
|
+
- Integrating crypto wallet connections (MetaMask, Coinbase Wallet, WalletConnect).
|
|
27
|
+
- Reading from and writing to Ethereum / Polygon / Arbitrum / Base smart contracts.
|
|
28
|
+
- Implementing Sign-In With Ethereum (SIWE) authentication.
|
|
29
|
+
- Minting, transferring, or querying ERC-20 tokens or NFTs.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
### Core Architecture & Modern Patterns
|
|
34
|
+
|
|
35
|
+
#### 1. Wallet Connection & Config (`wagmi.config.ts`)
|
|
36
|
+
```typescript
|
|
37
|
+
import { http, createConfig } from 'wagmi';
|
|
38
|
+
import { mainnet, base, arbitrum } from 'wagmi/chains';
|
|
39
|
+
import { injected, walletConnect } from 'wagmi/connectors';
|
|
40
|
+
|
|
41
|
+
export const config = createConfig({
|
|
42
|
+
chains: [mainnet, base, arbitrum],
|
|
43
|
+
connectors: [
|
|
44
|
+
injected(),
|
|
45
|
+
walletConnect({ projectId: process.env.NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID! }),
|
|
46
|
+
],
|
|
47
|
+
transports: {
|
|
48
|
+
[mainnet.id]: http(),
|
|
49
|
+
[base.id]: http(),
|
|
50
|
+
[arbitrum.id]: http(),
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
#### 2. Contract Interaction Hook (Wagmi v2 + Viem)
|
|
56
|
+
```tsx
|
|
57
|
+
import { useAccount, useReadContract, useWriteContract, useWaitForTransactionReceipt } from 'wagmi';
|
|
58
|
+
import { parseAbi } from 'viem';
|
|
59
|
+
|
|
60
|
+
const ERC20_ABI = parseAbi([
|
|
61
|
+
'function balanceOf(address owner) view returns (uint256)',
|
|
62
|
+
'function transfer(address to, uint256 amount) returns (bool)',
|
|
63
|
+
]);
|
|
64
|
+
|
|
65
|
+
export function TokenTransferCard({ tokenAddress }: { tokenAddress: `0x${string}` }) {
|
|
66
|
+
const { address, isConnected } = useAccount();
|
|
67
|
+
const { data: balance, refetch } = useReadContract({
|
|
68
|
+
address: tokenAddress,
|
|
69
|
+
abi: ERC20_ABI,
|
|
70
|
+
functionName: 'balanceOf',
|
|
71
|
+
args: address ? [address] : undefined,
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
const { data: hash, writeContract, isPending } = useWriteContract();
|
|
75
|
+
const { isLoading: isConfirming, isSuccess } = useWaitForTransactionReceipt({ hash });
|
|
76
|
+
|
|
77
|
+
const handleSend = (recipient: `0x${string}`, amount: bigint) => {
|
|
78
|
+
writeContract({
|
|
79
|
+
address: tokenAddress,
|
|
80
|
+
abi: ERC20_ABI,
|
|
81
|
+
functionName: 'transfer',
|
|
82
|
+
args: [recipient, amount],
|
|
83
|
+
});
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
if (!isConnected) return <p>Please connect your wallet.</p>;
|
|
87
|
+
|
|
88
|
+
return (
|
|
89
|
+
<div>
|
|
90
|
+
<p>Balance: {balance?.toString()}</p>
|
|
91
|
+
{isPending && <p>Waiting for signature...</p>}
|
|
92
|
+
{isConfirming && <p>Confirming transaction on-chain...</p>}
|
|
93
|
+
{isSuccess && <p>Transfer completed successfully!</p>}
|
|
94
|
+
</div>
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
<a name="bahasa-indonesia"></a>
|
|
102
|
+
## Bahasa Indonesia
|
|
103
|
+
|
|
104
|
+
### Integrasi Orkestrasi
|
|
105
|
+
- **`senior-frontend`**: Integrasi komponen React dan Next.js untuk antarmuka dApp.
|
|
106
|
+
- **`authentication-identity-expert`**: Autentikasi Sign-In with Ethereum (SIWE).
|
|
107
|
+
- **`error-resilience-expert`**: Penanganan kegagalan RPC dan penolakan transaksi oleh pengguna.
|
|
108
|
+
|
|
109
|
+
### Deskripsi
|
|
110
|
+
Panduan produksi untuk membangun aplikasi terdesentralisasi (dApp) di jaringan EVM. Mencakup koneksi dompet Web3 via viem, wagmi v2, RainbowKit, interaksi smart contract type-safe, estimasi gas, dan standar token ERC-20/721.
|
|
111
|
+
|
|
112
|
+
### Kondisi Pemicu
|
|
113
|
+
- Mengintegrasikan koneksi dompet Web3 ke aplikasi web.
|
|
114
|
+
- Berinteraksi dengan smart contract di jaringan Ethereum, Base, Arbitrum, atau Polygon.
|
|
115
|
+
- Menerapkan login dengan dompet kripto (SIWE).
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: bootstrap-to-modern
|
|
3
3
|
description: "Expert skill to refactor and migrate legacy Bootstrap CSS applications to modern stacks using Tailwind CSS v4 and Alpine.js / Skill ahli untuk melakukan refaktor dan migrasi aplikasi Bootstrap CSS lama ke stack modern menggunakan Tailwind CSS v4 dan Alpine.js."
|
|
4
|
-
author:
|
|
4
|
+
author: "Roedy Rustam"
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Bootstrap to Modern (Tailwind + Alpine.js) / Refaktor Bootstrap ke Modern
|
|
@@ -37,7 +37,7 @@ This skill transforms legacy web applications styled with Bootstrap (jQuery-depe
|
|
|
37
37
|
- **Tabs**: Manage active tab state with `x-data="{ tab: 'home' }"`.
|
|
38
38
|
5. **UI/UX Modernization & Skill Integration**:
|
|
39
39
|
- Do NOT just do a 1:1 translation of Bootstrap classes. The goal is to elevate the design.
|
|
40
|
-
- You MUST orchestrate and apply guidelines from other UI/UX skills (`
|
|
40
|
+
- You MUST orchestrate and apply guidelines from other UI/UX skills (`ui-ux-expert`, `ui-ux-pro-max`, and `hig`).
|
|
41
41
|
- Implement Human Interface Guidelines (HIG) principles: Hierarchy, Harmony, and Consistency.
|
|
42
42
|
- Use vibrant colors, smooth micro-animations, glassmorphism (if appropriate), and modern typography to "WOW" the user.
|
|
43
43
|
6. **Quality Assurance**:
|
|
@@ -52,6 +52,9 @@ Active whenever the user asks to migrate, refactor, or update a Bootstrap projec
|
|
|
52
52
|
<a name="bahasa-indonesia"></a>
|
|
53
53
|
## Bahasa Indonesia
|
|
54
54
|
|
|
55
|
+
### Integrasi Orkestrasi
|
|
56
|
+
Terhubung dan mengorkestrasi skill domain yang relevan seperti `brainstorming`, `zero-to-prod-orchestrator`, dan `project-context-mapper` untuk memastikan eksekusi yang kohesif.
|
|
57
|
+
|
|
55
58
|
### Deskripsi
|
|
56
59
|
Skill ini mengubah aplikasi web lama yang di-style dengan Bootstrap (baik yang bergantung pada jQuery maupun murni CSS) menjadi arsitektur modern berbasis utility menggunakan **Tailwind CSS v4** untuk styling dan **Alpine.js** untuk behavior reaktif yang ringan.
|
|
57
60
|
|
|
@@ -76,7 +79,7 @@ Skill ini mengubah aplikasi web lama yang di-style dengan Bootstrap (baik yang b
|
|
|
76
79
|
- **Tab**: Kelola state tab aktif dengan `x-data="{ tab: 'home' }"`.
|
|
77
80
|
5. **Modernisasi UI/UX & Integrasi Skill**:
|
|
78
81
|
- JANGAN hanya menerjemahkan kelas Bootstrap 1:1. Tujuannya adalah meningkatkan kualitas desain.
|
|
79
|
-
- Anda WAJIB mengorkestrasi dan menerapkan pedoman dari skill UI/UX lainnya (`
|
|
82
|
+
- Anda WAJIB mengorkestrasi dan menerapkan pedoman dari skill UI/UX lainnya (`ui-ux-expert`, `ui-ux-pro-max`, dan `hig`).
|
|
80
83
|
- Terapkan prinsip Human Interface Guidelines (HIG): Hierarchy, Harmony, dan Consistency.
|
|
81
84
|
- Gunakan warna cerah, mikro-animasi halus, glassmorphism (jika sesuai), dan tipografi modern untuk memberikan kesan "WOW" pada pengguna.
|
|
82
85
|
6. **Quality Assurance**:
|
|
@@ -86,6 +89,6 @@ Skill ini mengubah aplikasi web lama yang di-style dengan Bootstrap (baik yang b
|
|
|
86
89
|
### Kondisi Pemicu
|
|
87
90
|
Aktif setiap kali pengguna meminta untuk memigrasi, merefaktor, atau memperbarui proyek Bootstrap ke Tailwind CSS, atau memodernisasi CSS/JS lama.
|
|
88
91
|
|
|
89
|
-
|
|
90
|
-
## Orchestration & Integration
|
|
91
|
-
- Integrates with: `
|
|
92
|
+
|
|
93
|
+
## Orchestration & Integration
|
|
94
|
+
- Integrates with: `ui-ux-expert`, `ui-ux-pro-max`, `hig`.
|