[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-8f235abe-412e-4506-8323-3d3715f477b1":3,"$fy3pruko0IVdiddRoPb1U4swNPUbZ9LrWA8K-QbSBmek":43},{"id":4,"title":5,"description":6,"categoryId":7,"moduleId":8,"tags":9,"prompt":10,"icon":11,"source":12,"sourceUrl":13,"authorId":14,"authorName":15,"isPublic":16,"stars":17,"runs":18,"createdAt":19,"updatedAt":19,"module":20,"category":27,"packages":34},"8f235abe-412e-4506-8323-3d3715f477b1","trigger-dev","Trigger.dev 背景任务、AI 工作流和可靠专家","cat_life_career","mod_other","sickn33,other","---\nname: trigger-dev\ndescription: Trigger.dev expert for background jobs, AI workflows, and reliable\n  async execution with excellent developer experience and TypeScript-first\n  design.\nrisk: unknown\nsource: vibeship-spawner-skills (Apache 2.0)\ndate_added: 2026-02-27\n---\n\n# Trigger.dev Integration\n\nTrigger.dev expert for background jobs, AI workflows, and reliable async\nexecution with excellent developer experience and TypeScript-first design.\n\n## Principles\n\n- Tasks are the building blocks - each task is independently retryable\n- Runs are durable - state survives crashes and restarts\n- Integrations are first-class - use built-in API wrappers for reliability\n- Logs are your debugging lifeline - log liberally in tasks\n- Concurrency protects your resources - always set limits\n- Delays and schedules are built-in - no external cron needed\n- AI-ready by design - long-running AI tasks just work\n- Local development matches production - use the CLI\n\n## Capabilities\n\n- trigger-dev-tasks\n- ai-background-jobs\n- integration-tasks\n- scheduled-triggers\n- webhook-handlers\n- long-running-tasks\n- task-queues\n- batch-processing\n\n## Scope\n\n- redis-queues -> bullmq-specialist\n- pure-event-driven -> inngest\n- workflow-orchestration -> temporal-craftsman\n- infrastructure -> infra-architect\n\n## Tooling\n\n### Core\n\n- trigger-dev-sdk\n- trigger-cli\n\n### Frameworks\n\n- nextjs\n- remix\n- express\n- hono\n\n### Integrations\n\n- openai\n- anthropic\n- resend\n- stripe\n- slack\n- supabase\n\n### Deployment\n\n- trigger-cloud\n- self-hosted\n- docker\n\n## Patterns\n\n### Basic Task Setup\n\nSetting up Trigger.dev in a Next.js project\n\n**When to use**: Starting with Trigger.dev in any project\n\n\u002F\u002F trigger.config.ts\nimport { defineConfig } from '@trigger.dev\u002Fsdk\u002Fv3';\n\nexport default defineConfig({\n  project: 'my-project',\n  runtime: 'node',\n  logLevel: 'log',\n  retries: {\n    enabledInDev: true,\n    default: {\n      maxAttempts: 3,\n      minTimeoutInMs: 1000,\n      maxTimeoutInMs: 10000,\n      factor: 2,\n    },\n  },\n});\n\n\u002F\u002F src\u002Ftrigger\u002Ftasks.ts\nimport { task, logger } from '@trigger.dev\u002Fsdk\u002Fv3';\n\nexport const helloWorld = task({\n  id: 'hello-world',\n  run: async (payload: { name: string }) => {\n    logger.log('Processing hello world', { payload });\n\n    \u002F\u002F Simulate work\n    await new Promise(resolve => setTimeout(resolve, 1000));\n\n    return { message: `Hello, ${payload.name}!` };\n  },\n});\n\n\u002F\u002F Triggering from your app\nimport { helloWorld } from '@\u002Ftrigger\u002Ftasks';\n\n\u002F\u002F Fire and forget\nawait helloWorld.trigger({ name: 'World' });\n\n\u002F\u002F Wait for result\nconst handle = await helloWorld.trigger({ name: 'World' });\nconst result = await handle.wait();\n\n### AI Task with OpenAI Integration\n\nUsing built-in OpenAI integration with automatic retries\n\n**When to use**: Building AI-powered background tasks\n\nimport { task, logger } from '@trigger.dev\u002Fsdk\u002Fv3';\nimport { openai } from '@trigger.dev\u002Fopenai';\n\n\u002F\u002F Configure OpenAI with Trigger.dev\nconst openaiClient = openai.configure({\n  id: 'openai',\n  apiKey: process.env.OPENAI_API_KEY,\n});\n\nexport const generateContent = task({\n  id: 'generate-content',\n  retry: {\n    maxAttempts: 3,\n  },\n  run: async (payload: { topic: string; style: string }) => {\n    logger.log('Generating content', { topic: payload.topic });\n\n    \u002F\u002F Uses Trigger.dev's OpenAI integration - handles retries automatically\n    const completion = await openaiClient.chat.completions.create({\n      model: 'gpt-4-turbo-preview',\n      messages: [\n        {\n          role: 'system',\n          content: `You are a ${payload.style} writer.`,\n        },\n        {\n          role: 'user',\n          content: `Write about: ${payload.topic}`,\n        },\n      ],\n    });\n\n    const content = completion.choices[0].message.content;\n    logger.log('Generated content', { length: content?.length });\n\n    return { content, tokens: completion.usage?.total_tokens };\n  },\n});\n\n### Scheduled Task with Cron\n\nTasks that run on a schedule\n\n**When to use**: Periodic jobs like reports, cleanup, or syncs\n\nimport { schedules, task, logger } from '@trigger.dev\u002Fsdk\u002Fv3';\n\nexport const dailyCleanup = schedules.task({\n  id: 'daily-cleanup',\n  cron: '0 2 * * *',  \u002F\u002F 2 AM daily\n  run: async () => {\n    logger.log('Starting daily cleanup');\n\n    \u002F\u002F Clean up old records\n    const deleted = await db.logs.deleteMany({\n      where: {\n        createdAt: { lt: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000) },\n      },\n    });\n\n    logger.log('Cleanup complete', { deletedCount: deleted.count });\n\n    return { deleted: deleted.count };\n  },\n});\n\n\u002F\u002F Weekly report\nexport const weeklyReport = schedules.task({\n  id: 'weekly-report',\n  cron: '0 9 * * 1',  \u002F\u002F Monday 9 AM\n  run: async () => {\n    const stats = await generateWeeklyStats();\n    await sendReportEmail(stats);\n    return stats;\n  },\n});\n\n### Batch Processing\n\nProcessing large datasets in batches\n\n**When to use**: Need to process many items with rate limiting\n\nimport { task, logger, wait } from '@trigger.dev\u002Fsdk\u002Fv3';\n\nexport const processBatch = task({\n  id: 'process-batch',\n  queue: {\n    concurrencyLimit: 5,  \u002F\u002F Only 5 running at once\n  },\n  run: async (payload: { items: string[] }) => {\n    const results = [];\n\n    for (const item of payload.items) {\n      logger.log('Processing item', { item });\n\n      const result = await processItem(item);\n      results.push(result);\n\n      \u002F\u002F Respect rate limits\n      await wait.for({ seconds: 1 });\n    }\n\n    return { processed: results.length, results };\n  },\n});\n\n\u002F\u002F Trigger batch processing\nexport const startBatchJob = task({\n  id: 'start-batch',\n  run: async (payload: { datasetId: string }) => {\n    const items = await fetchDataset(payload.datasetId);\n\n    \u002F\u002F Split into chunks of 100\n    const chunks = chunkArray(items, 100);\n\n    \u002F\u002F Trigger parallel batch tasks\n    const handles = await Promise.all(\n      chunks.map(chunk => processBatch.trigger({ items: chunk }))\n    );\n\n    logger.log('Started batch processing', {\n      totalItems: items.length,\n      batches: chunks.length,\n    });\n\n    return { batches: handles.length };\n  },\n});\n\n### Webhook Handler\n\nProcessing webhooks reliably with deduplication\n\n**When to use**: Handling webhooks from Stripe, GitHub, etc.\n\nimport { task, logger, idempotencyKeys } from '@trigger.dev\u002Fsdk\u002Fv3';\n\nexport const handleStripeEvent = task({\n  id: 'handle-stripe-event',\n  run: async (payload: {\n    eventId: string;\n    type: string;\n    data: any;\n  }) => {\n    \u002F\u002F Idempotency based on Stripe event ID\n    const idempotencyKey = await idempotencyKeys.create(payload.eventId);\n\n    if (idempotencyKey.isNew === false) {\n      logger.log('Duplicate event, skipping', { eventId: payload.eventId });\n      return { skipped: true };\n    }\n\n    logger.log('Processing Stripe event', {\n      type: payload.type,\n      eventId: payload.eventId,\n    });\n\n    switch (payload.type) {\n      case 'checkout.session.completed':\n        await handleCheckoutComplete(payload.data);\n        break;\n      case 'customer.subscription.updated':\n        await handleSubscriptionUpdate(payload.data);\n        break;\n    }\n\n    return { processed: true, type: payload.type };\n  },\n});\n\n## Sharp Edges\n\n### Task timeout kills execution without clear error\n\nSeverity: CRITICAL\n\nSituation: Long-running AI task or batch process suddenly stops. No error in logs.\nTask shows as failed in dashboard but no stack trace. Data partially processed.\n\nSymptoms:\n- Task fails with no error message\n- Partial data processing\n- Works locally, fails in production\n- \"Task timed out\" in dashboard\n\nWhy this breaks:\nTrigger.dev has execution timeouts (defaults vary by plan). When exceeded, the\ntask is killed mid-execution. If you're not logging progress, you won't know\nwhere it stopped. This is especially common with AI tasks that can take minutes.\n\nRecommended fix:\n\n# Configure explicit timeouts:\n```typescript\nexport const processDocument = task({\n  id: 'process-document',\n  machine: {\n    preset: 'large-2x',  \u002F\u002F More resources = longer allowed time\n  },\n  run: async (payload) => {\n    logger.log('Starting document processing', { docId: payload.id });\n\n    \u002F\u002F Log progress at each step\n    logger.log('Step 1: Extracting text');\n    const text = await extractText(payload.fileUrl);\n\n    logger.log('Step 2: Generating embeddings', { textLength: text.length });\n    const embeddings = await generateEmbeddings(text);\n\n    logger.log('Step 3: Storing vectors', { count: embeddings.length });\n    await storeVectors(embeddings);\n\n    logger.log('Completed successfully');\n    return { processed: true };\n  },\n});\n```\n\n# For very long tasks, break into subtasks:\n- Use triggerAndWait for sequential steps\n- Each subtask has its own timeout\n- Progress is visible in dashboard\n\n### Non-serializable payload causes silent task failure\n\nSeverity: CRITICAL\n\nSituation: Passing Date objects, class instances, or circular references in payload.\nTask queued but never runs. Or runs with undefined\u002Fnull values.\n\nSymptoms:\n- Payload values are undefined in task\n- Date objects become strings\n- Class methods not available\n- \"Converting circular structure to JSON\"\n\nWhy this breaks:\nTrigger.dev serializes payloads to JSON. Dates become strings, class instances\nlose methods, functions disappear, circular refs throw. Your task sees different\ndata than you sent.\n\nRecommended fix:\n\n# Always use plain objects:\n```typescript\n\u002F\u002F WRONG - Date becomes string\nawait myTask.trigger({ createdAt: new Date() });\n\n\u002F\u002F RIGHT - ISO string\nawait myTask.trigger({ createdAt: new Date().toISOString() });\n\n\u002F\u002F WRONG - Class instance\nawait myTask.trigger({ user: new User(data) });\n\n\u002F\u002F RIGHT - Plain object\nawait myTask.trigger({ user: { id: data.id, email: data.email } });\n\n\u002F\u002F WRONG - Circular reference\nconst obj = { parent: null };\nobj.parent = obj;\nawait myTask.trigger(obj);  \u002F\u002F Throws!\n```\n\n# In task, reconstitute as needed:\n```typescript\nrun: async (payload: { createdAt: string }) => {\n  const date = new Date(payload.createdAt);\n  \u002F\u002F ...\n}\n```\n\n### Environment variables not synced to Trigger.dev cloud\n\nSeverity: CRITICAL\n\nSituation: Task works locally but fails in production. Env var that exists in Vercel\nis undefined in Trigger.dev. API calls fail, database connections fail.\n\nSymptoms:\n- \"Environment variable not found\"\n- API calls return 401 in production tasks\n- Works in dev, fails in production\n- Database connection errors in tasks\n\nWhy this breaks:\nTrigger.dev runs tasks in its own cloud, separate from your Vercel\u002FRailway\ndeployment. Environment variables must be configured in BOTH places. They\ndon't automatically sync.\n\nRecommended fix:\n\n# Sync env vars to Trigger.dev:\n1. Go to Trigger.dev dashboard\n2. Project Settings > Environment Variables\n3. Add ALL required env vars\n\n# Or use CLI:\n```bash\n# Create .env.trigger file\nDATABASE_URL=postgres:\u002F\u002F...\nOPENAI_API_KEY=sk-...\nSTRIPE_SECRET_KEY=sk_live_...\n\n# Push to Trigger.dev\nnpx trigger.dev@latest env push\n```\n\n# Common missing vars:\n- DATABASE_URL\n- OPENAI_API_KEY \u002F ANTHROPIC_API_KEY\n- STRIPE_SECRET_KEY\n- Service API keys\n- Internal service URLs\n\n# Test in staging:\nTrigger.dev has separate envs - configure staging too\n\n### SDK version mismatch between CLI and package\n\nSeverity: HIGH\n\nSituation: Updated @trigger.dev\u002Fsdk but forgot to update CLI. Or vice versa.\nTasks fail to register. Weird type errors. Dev server crashes.\n\nSymptoms:\n- Tasks not appearing in dashboard\n- Type errors in trigger.config.ts\n- \"Failed to register task\"\n- Dev server crashes on start\n\nWhy this breaks:\nThe Trigger.dev SDK and CLI must be on compatible versions. Breaking changes\nbetween versions cause registration failures. The CLI generates types that\nmust match the SDK.\n\nRecommended fix:\n\n# Always update together:\n```bash\n# Update both SDK and CLI\nnpm install @trigger.dev\u002Fsdk@latest\nnpx trigger.dev@latest dev\n\n# Or pin to same version\nnpm install @trigger.dev\u002Fsdk@3.3.0\nnpx trigger.dev@3.3.0 dev\n```\n\n# Check versions:\n```bash\nnpx trigger.dev@latest --version\nnpm list @trigger.dev\u002Fsdk\n```\n\n# In CI\u002FCD:\n```yaml\n- run: npm install @trigger.dev\u002Fsdk@${{ env.TRIGGER_VERSION }}\n- run: npx trigger.dev@${{ env.TRIGGER_VERSION }} deploy\n```\n\n### Task retries cause duplicate side effects\n\nSeverity: HIGH\n\nSituation: Task sends email, then fails on next step. Retry sends email again.\nCustomer gets 3 identical emails. Or 3 Stripe charges. Or 3 Slack messages.\n\nSymptoms:\n- Duplicate emails on retry\n- Multiple charges for same order\n- Duplicate webhook deliveries\n- Data inserted multiple times\n\nWhy this breaks:\nTrigger.dev retries failed tasks from the beginning. If your task has side\neffects before the failure point, those execute again. Without idempotency,\nyou create duplicates.\n\nRecommended fix:\n\n# Use idempotency keys:\n```typescript\nimport { task, idempotencyKeys } from '@trigger.dev\u002Fsdk\u002Fv3';\n\nexport const sendOrderEmail = task({\n  id: 'send-order-email',\n  run: async (payload: { orderId: string }) => {\n    \u002F\u002F Check if already sent\n    const key = await idempotencyKeys.create(`email-${payload.orderId}`);\n\n    if (!key.isNew) {\n      logger.log('Email already sent, skipping');\n      return { skipped: true };\n    }\n\n    await sendEmail(payload.orderId);\n    return { sent: true };\n  },\n});\n```\n\n# Alternative: Track in database\n```typescript\nconst existing = await db.emailLogs.findUnique({\n  where: { orderId_type: { orderId, type: 'order_confirmation' } }\n});\n\nif (existing) {\n  logger.log('Already sent');\n  return;\n}\n\nawait sendEmail(orderId);\nawait db.emailLogs.create({ data: { orderId, type: 'order_confirmation' } });\n```\n\n### High concurrency overwhelms downstream services\n\nSeverity: HIGH\n\nSituation: Burst of 1000 tasks triggered. All hit OpenAI API simultaneously.\nRate limited. All fail. Retry. Rate limited again. Vicious cycle.\n\nSymptoms:\n- Rate limit errors (429)\n- Database connection pool exhausted\n- API returns \"too many requests\"\n- Mass task failures\n\nWhy this breaks:\nTrigger.dev scales to handle many concurrent tasks. But your downstream\nAPIs (OpenAI, databases, external services) have rate limits. Without\nconcurrency control, you overwhelm them.\n\nRecommended fix:\n\n# Set queue concurrency limits:\n```typescript\nexport const callOpenAI = task({\n  id: 'call-openai',\n  queue: {\n    concurrencyLimit: 10,  \u002F\u002F Only 10 running at once\n  },\n  run: async (payload) => {\n    \u002F\u002F Protected by concurrency limit\n    return await openai.chat.completions.create(payload);\n  },\n});\n```\n\n# For rate-limited APIs:\n```typescript\nexport const callRateLimitedAPI = task({\n  id: 'call-api',\n  queue: {\n    concurrencyLimit: 5,\n  },\n  retry: {\n    maxAttempts: 5,\n    minTimeoutInMs: 5000,  \u002F\u002F Wait before retry\n    factor: 2,  \u002F\u002F Exponential backoff\n  },\n  run: async (payload) => {\n    \u002F\u002F Add delay between calls\n    await wait.for({ milliseconds: 200 });\n    return await externalAPI.call(payload);\n  },\n});\n```\n\n# Start conservative:\n- 5-10 for external APIs\n- 20-50 for databases\n- Increase based on monitoring\n\n### trigger.config.ts not at project root\n\nSeverity: HIGH\n\nSituation: Running npx trigger.dev dev but CLI can't find config.\nOr config exists but in wrong location (monorepo issue).\n\nSymptoms:\n- \"Could not find trigger.config.ts\"\n- Tasks not discovered\n- Empty task list in dashboard\n- Works for one package, not another\n\nWhy this breaks:\nThe CLI looks for trigger.config.ts at the current working directory.\nIn monorepos, you must run from the package directory, not the root.\nWrong location = tasks not discovered.\n\nRecommended fix:\n\n# Config must be at package root:\n```\nmy-app\u002F\n├── trigger.config.ts  \u003C- Here\n├── package.json\n├── src\u002F\n│   └── trigger\u002F\n│       └── tasks.ts\n```\n\n# In monorepos:\n```\nmonorepo\u002F\n├── apps\u002F\n│   └── web\u002F\n│       ├── trigger.config.ts  \u003C- Here, not at monorepo root\n│       ├── package.json\n│       └── src\u002Ftrigger\u002F\n\n# Run from package directory\ncd apps\u002Fweb && npx trigger.dev dev\n```\n\n# Specify config location:\n```bash\nnpx trigger.dev dev --config .\u002Fapps\u002Fweb\u002Ftrigger.config.ts\n```\n\n### wait.for in loops causes memory issues\n\nSeverity: MEDIUM\n\nSituation: Processing thousands of items with wait.for between each.\nTask memory grows. Eventually killed for memory.\n\nSymptoms:\n- Task killed for memory\n- Slow task execution\n- State blob too large error\n- Works for small batches, fails for large\n\nWhy this breaks:\nEach wait.for creates checkpoint state. In a loop with thousands of\niterations, this accumulates. The task's state blob grows until it\nhits memory limits.\n\nRecommended fix:\n\n# Batch instead of individual waits:\n```typescript\n\u002F\u002F WRONG - Wait per item\nfor (const item of items) {\n  await processItem(item);\n  await wait.for({ milliseconds: 100 });  \u002F\u002F 1000 waits = bloated state\n}\n\n\u002F\u002F RIGHT - Batch processing\nconst chunks = chunkArray(items, 50);\nfor (const chunk of chunks) {\n  await Promise.all(chunk.map(processItem));\n  await wait.for({ milliseconds: 500 });  \u002F\u002F Only 20 waits\n}\n```\n\n# For very large datasets, use subtasks:\n```typescript\nexport const processAll = task({\n  id: 'process-all',\n  run: async (payload: { items: string[] }) => {\n    const chunks = chunkArray(payload.items, 100);\n\n    \u002F\u002F Each chunk is a separate task\n    await Promise.all(\n      chunks.map(chunk =>\n        processChunk.triggerAndWait({ items: chunk })\n      )\n    );\n  },\n});\n```\n\n### Using raw SDK instead of Trigger.dev integrations\n\nSeverity: MEDIUM\n\nSituation: Using OpenAI SDK directly. API call fails. No automatic retry.\nRate limits not handled. Have to implement all resilience manually.\n\nSymptoms:\n- Manual retry logic in tasks\n- Rate limit errors not handled\n- No automatic logging of API calls\n- Inconsistent error handling\n\nWhy this breaks:\nTrigger.dev integrations wrap SDKs with automatic retries, rate limit\nhandling, and proper logging. Using raw SDKs means you lose these\nfeatures and have to implement them yourself.\n\nRecommended fix:\n\n# Use integrations when available:\n```typescript\n\u002F\u002F WRONG - Raw SDK\nimport OpenAI from 'openai';\nconst openai = new OpenAI();\n\n\u002F\u002F RIGHT - Trigger.dev integration\nimport { openai } from '@trigger.dev\u002Fopenai';\n\nconst openaiClient = openai.configure({\n  id: 'openai',\n  apiKey: process.env.OPENAI_API_KEY,\n});\n\n\u002F\u002F Now has automatic retries and rate limiting\nexport const generateContent = task({\n  id: 'generate-content',\n  run: async (payload) => {\n    const response = await openaiClient.chat.completions.create({\n      model: 'gpt-4-turbo-preview',\n      messages: [{ role: 'user', content: payload.prompt }],\n    });\n    return response;\n  },\n});\n```\n\n# Available integrations:\n- @trigger.dev\u002Fopenai\n- @trigger.dev\u002Fanthropic\n- @trigger.dev\u002Fresend\n- @trigger.dev\u002Fslack\n- @trigger.dev\u002Fstripe\n\n### Triggering tasks without dev server running\n\nSeverity: MEDIUM\n\nSituation: Called task.trigger() but nothing happens. No errors either.\nTask just disappears into void. Dev server wasn't running.\n\nSymptoms:\n- Triggers don't run\n- No task in dashboard\n- No errors, just silence\n- Works in production, not dev\n\nWhy this breaks:\nIn development, tasks run through the local dev server (npx trigger.dev dev).\nIf it's not running, triggers queue up or fail silently depending on\nconfiguration. Production works differently.\n\nRecommended fix:\n\n# Always run dev server during development:\n```bash\n# Terminal 1: Your app\nnpm run dev\n\n# Terminal 2: Trigger.dev dev server\nnpx trigger.dev dev\n```\n\n# Check dev server is connected:\n- Should show \"Connected to Trigger.dev\"\n- Tasks should appear in console\n- Dashboard shows task registrations\n\n# In package.json:\n```json\n{\n  \"scripts\": {\n    \"dev\": \"next dev\",\n    \"trigger:dev\": \"trigger.dev dev\",\n    \"dev:all\": \"concurrently \\\"npm run dev\\\" \\\"npm run trigger:dev\\\"\"\n  }\n}\n```\n\n## Validation Checks\n\n### Task without logging\n\nSeverity: WARNING\n\nMessage: Task has no logging. Add logger.log() calls for debugging in production.\n\nFix action: Import { logger } from '@trigger.dev\u002Fsdk\u002Fv3' and add log statements\n\n### Task without error handling\n\nSeverity: ERROR\n\nMessage: Task lacks explicit error handling. Unhandled errors may cause unclear failures.\n\nFix action: Wrap task logic in try\u002Fcatch and log errors with context\n\n### Task without concurrency limit\n\nSeverity: WARNING\n\nMessage: Task has no concurrency limit. High load may overwhelm downstream services.\n\nFix action: Add queue: { concurrencyLimit: 10 } to protect APIs and databases\n\n### Date object in trigger payload\n\nSeverity: ERROR\n\nMessage: Date objects are serialized to strings. Use ISO string format instead.\n\nFix action: Use date.toISOString() instead of new Date()\n\n### Class instance in trigger payload\n\nSeverity: ERROR\n\nMessage: Class instances lose methods when serialized. Use plain objects.\n\nFix action: Convert class instance to plain object before triggering\n\n### Task without explicit ID\n\nSeverity: ERROR\n\nMessage: Task must have an explicit id property for registration.\n\nFix action: Add id: 'my-task-name' to task definition\n\n### Trigger.dev API key hardcoded\n\nSeverity: CRITICAL\n\nMessage: Trigger.dev API key should not be hardcoded - use TRIGGER_SECRET_KEY env var\n\nFix action: Remove hardcoded key and use process.env.TRIGGER_SECRET_KEY\n\n### Using raw OpenAI SDK instead of integration\n\nSeverity: WARNING\n\nMessage: Consider using @trigger.dev\u002Fopenai for automatic retries and rate limiting\n\nFix action: Replace with: import { openai } from '@trigger.dev\u002Fopenai'\n\n### Using raw Anthropic SDK instead of integration\n\nSeverity: WARNING\n\nMessage: Consider using @trigger.dev\u002Fanthropic for automatic retries and rate limiting\n\nFix action: Replace with: import { anthropic } from '@trigger.dev\u002Fanthropic'\n\n### wait.for inside loop\n\nSeverity: WARNING\n\nMessage: wait.for in loops creates many checkpoints. Consider batching instead.\n\nFix action: Batch items and use fewer waits, or split into subtasks\n\n## Collaboration\n\n### Delegation Triggers\n\n- redis|bullmq|traditional queue -> bullmq-specialist (Need Redis-backed queues instead of managed service)\n- vercel|deployment|serverless -> vercel-deployment (Trigger.dev needs deployment config)\n- database|postgres|supabase -> supabase-backend (Tasks need database access)\n- openai|anthropic|ai model|llm -> llm-architect (Tasks need AI model integration)\n- event-driven|event sourcing|fan out -> inngest (Need pure event-driven model)\n\n### AI Background Processing\n\nSkills: trigger-dev, llm-architect, nextjs-app-router, supabase-backend\n\nWorkflow:\n\n```\n1. User triggers via UI (nextjs-app-router)\n2. Task queued (trigger-dev)\n3. AI processing (llm-architect)\n4. Results stored (supabase-backend)\n```\n\n### Webhook Processing Pipeline\n\nSkills: trigger-dev, stripe-integration, email-systems, supabase-backend\n\nWorkflow:\n\n```\n1. Webhook received (stripe-integration)\n2. Task triggered (trigger-dev)\n3. Database updated (supabase-backend)\n4. Notification sent (email-systems)\n```\n\n### Batch Data Processing\n\nSkills: trigger-dev, supabase-backend, backend\n\nWorkflow:\n\n```\n1. Batch job triggered (backend)\n2. Data chunked and processed (trigger-dev)\n3. Results aggregated (supabase-backend)\n```\n\n### Scheduled Reports\n\nSkills: trigger-dev, supabase-backend, email-systems\n\nWorkflow:\n\n```\n1. Cron triggers task (trigger-dev)\n2. Data aggregated (supabase-backend)\n3. Report generated and sent (email-systems)\n```\n\n## Related Skills\n\nWorks well with: `nextjs-app-router`, `vercel-deployment`, `ai-agents-architect`, `llm-architect`, `email-systems`, `stripe-integration`\n\n## When to Use\n- User mentions or implies: trigger.dev\n- User mentions or implies: trigger dev\n- User mentions or implies: background task\n- User mentions or implies: ai background job\n- User mentions or implies: long running task\n- User mentions or implies: integration task\n- User mentions or implies: scheduled task\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.\n","","imported","https:\u002F\u002Fgithub.com\u002Fsickn33\u002Fantigravity-awesome-skills","user_system_seed","SkillOPIC",true,68,591,"2026-05-16 13:44:49",{"id":8,"name":21,"slug":22,"icon":23,"description":24,"sort":25,"createdAt":26},"其他","other","mdi-page-next-outline","其他类型Skill",5,"2026-05-16 12:53:40",{"id":7,"name":28,"slug":29,"icon":30,"description":31,"moduleId":8,"sort":32,"skillCount":33,"createdAt":26},"职场发展","career","mdi-briefcase-outline","面试准备、简历优化、职业规划",4,575,[35],{"id":36,"skillId":4,"version":37,"fileName":38,"fileSize":39,"filePath":40,"fileHash":41,"manifest":42,"createdAt":19},"ddf15ee5-a894-458e-bbd5-0fd3e7dcac8d","1.0.0","trigger-dev.zip",8145,"uploads\u002Fskills\u002F8f235abe-412e-4506-8323-3d3715f477b1\u002Ftrigger-dev.zip","483175d084b3bb5aa60d0a6b65127be2b8a5e6936311a26dfdfc4e9f1e1aff9d","[{\"path\":\"SKILL.md\",\"isDirectory\":false,\"size\":24000}]",{"code":44,"message":45,"data":46},200,"success",{"items":47,"stats":48,"page":51},[],{"averageRating":49,"totalRatings":49,"ratingCounts":50},0,[49,49,49,49,49],{"limit":52,"offset":49,"hasMore":53,"nextOffset":52,"ratedOnly":16},15,false]