Migrates Temporal, Inngest, Trigger.dev, and AWS Step Functions workflows to the Workflow SDK. Use when porting Activities, Workers, Signals, step.run(), step.waitForEvent(), Trigger.dev tasks / wait.forToken / triggerAndWait, ASL JSON state machines, Task/Choice/Wait/Parallel states, task tokens, or child workflows.
npx skills add https://github.com/vercel/workflow --skill migrating-to-workflow-sdk
Use this skill when converting an existing orchestration system to the Workflow SDK.
start(), getRun(), hooks/webhooks, and route handlers.references/runtime-targets.md and explicitly say the workflow/step code can stay the same, but deployment still needs a World implementation and startup bootstrap."use workflow" functions."use step" functions.sleep() only in workflow context.step.waitForEvent(), and .waitForTaskToken, choose exactly one resume surface:resume/internal -> createHook() + resumeHook() when the app resumes from server-side code with a deterministic business token.resume/url/default -> createWebhook() when the external system needs a generated callback URL and the default 202 Accepted response is fine.resume/url/manual -> createWebhook({ respondWith: 'manual' }) only when the prompt explicitly requires a custom response body, status, or headers.resume/url/default and make the assumption explicit in ## Open Questions.createWebhook() with resumeHook(), and never pass token: to createWebhook().start() and getRun() inside "use step" functions for child runs.getStepMetadata().stepId as the idempotency key for external writes.getWritable() in workflow context to obtain the stream, but interact with it (write, close) only inside "use step" functions.Request / Response even when a framework like Hono is named.Request / Response. Do not default to Next.js-only route signatures unless Next.js is explicitly named.> Fast memory aid:
> - Callback URL + default ack -> createWebhook()
> - Callback URL + custom ack -> createWebhook({ respondWith: 'manual' })
> - Deterministic server-side resume -> createHook() + resumeHook()
Load references/resume-routing.md when the source pauses for Signals, step.waitForEvent(), or .waitForTaskToken.
Fast defaults:
resume/url/defaultresume/url/manualresume/internalruntime/self-hostedboundary/named-frameworkboundary/framework-agnosticBefore drafting ## Migrated Code, write the selected route keys in ## Migration Plan.
references/temporal.mdreferences/inngest.mdreferences/trigger-dev.mdreferences/aws-step-functions.mdreferences/shared-patterns.md — reusable code templates for hooks, child workflows, idempotency, streaming, and rollback.references/runtime-targets.md — Managed vs custom World guidance.references/resume-routing.md — route-key selection, obligations, and exact ## Migration Plan shape.references/retries.md — canonical retry mechanics: stepFn.maxRetries, RetryableError({ retryAfter }), FatalError.Return the migration in this structure:
## Migration Plan
## Source -> Target Mapping
## Migrated Code
## App Boundary / Resume Endpoints
## Verification Checklist
## Open Questions
Fail the draft if any of these are true:
## Migration Plan omits Route keys## Migration Plan omits Why these route keys## Migration Plan lists route keys that do not match the prompt## Migration Plan lists required code obligations that do not match the selected route keyssleep() appears inside a stepgetWriter(), write(), close()) appears inside a workflow functionstart() / getRun() directly from workflow contextcreateHook() + resumeHook() instead of createWebhook()resume/url/default or resume/url/manual migration invents a user-authored callback route or resumeWebhook() wrapper when webhook.url should be the only resume surfacecreateWebhook() is given a custom token or paired with resumeHook()Validation note:
request.respondWith() is step-only.Additional fail conditions:
resume/internal output omits resumeHook() in app-boundary coderesume/internal output omits a deterministic business tokenresume/internal output emits createWebhook() or webhook.urlresume/url/default output does not pass webhook.url to the external systemresume/url/default output emits resumeHook(), respondWith: 'manual', or RequestWithResponse without a custom-response requirement in the promptresume/url/default output invents a user-authored callback route or resumeWebhook() wrapper when webhook.url is the intended resume surfaceresume/url/manual output does not pass webhook.url to the external systemresume/url/manual output omits RequestWithResponse or await request.respondWith(...)resume/url/manual output calls request.respondWith(...) outside a "use step" functionresume/url/manual output invents a user-authored callback route or resumeWebhook() wrapper when webhook.url is the intended resume surfacecreateWebhook() is paired with resumeHook()World extends Queue, Streamer, Storage, startWorkflowWorld(), or the explicit note that the workflow and step code can stay the same while the app still needs a custom WorldRequest / Response app-boundary code without a framework-agnostic overrideFor concrete passing code, load:
references/shared-patterns.md -> ## Generated callback URL (default response)references/shared-patterns.md -> ## Generated callback URL (manual response)references/runtime-targets.md -> ## Self-hosted output blockreferences/aws-step-functions.md -> ## Combined recipe: callback URL on self-hosted HonoMigrate this Inngest workflow to the Workflow SDK.
It uses step.waitForEvent() with a timeout and step.realtime.publish().
Expected response shape:
## Migration Plan
## Source -> Target Mapping
## Migrated Code
## App Boundary / Resume Endpoints
## Verification Checklist
## Open Questions
Load a worked example only when the prompt needs concrete code:
references/shared-patterns.md -> ## Named-framework internal resume example (Hono)references/shared-patterns.md -> ## Generated callback URL (default response)references/shared-patterns.md -> ## Generated callback URL (manual response)references/runtime-targets.md -> ## Self-hosted output blockreferences/aws-step-functions.md -> ## Combined recipe: callback URL on self-hosted HonoReject these counterexamples:
resume/url/default or resume/url/manual + user-authored callback route when webhook.url is the intended resume surfacecreateWebhook() paired with resumeHook()Request / Response without a framework-agnostic overrideGuide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP) or Node/TypeScript (MCP SDK).
Automatically creates user-facing changelogs from git commits by analyzing commit history, categorizing changes, and transforming technical commits into clear, customer-friendly release notes. Turns hours of manual changelog writing into minutes of automated generation.
Use when implementation is complete, all tests pass, and you need to decide how to integrate the work - guides completion of development work by presenting structured options for merge, PR, or cleanup
Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP) or Node/TypeScript (MCP SDK).
React Native and Expo best practices for building performant mobile apps. Use when building React Native components, optimizing list performance, implementing animations, or working with native modules. Triggers on tasks involving React Native, Expo, mobile performance, or native platform APIs.
React and Next.js performance optimization guidelines from Vercel Engineering. This skill should be used when writing, reviewing, or refactoring React/Next.js code to ensure optimal performance patterns. Triggers on tasks involving React components, Next.js pages, data fetching, bundle optimization, or performance improvements.
Next.js best practices - file conventions, RSC boundaries, data patterns, async APIs, metadata, error handling, route handlers, image/font optimization, bundling
Use when starting feature work that needs isolation from current workspace or before executing implementation plans - creates isolated git worktrees with smart directory selection and safety verification
Take vercel/migrating-to-workflow-sdk from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.