Drive a migration or codemod in parallel
Slice a framework upgrade per package and run them concurrently.
Who this is for.
You have a migration the size of a small mountain — a framework bump, a deprecated API removal, a codemod across hundreds of files. Driving the agent one prompt at a time is brittle, and a single mega-branch is unreviewable. You want concurrent per-package tasks that can each fail or succeed independently.
The workflow in 4 steps.
Pin the target in the project definition
Spell out the exact version, codemod, or API you're migrating to in `project.yaml`. Include the canonical 'before/after' snippet — that becomes the worked example every subtask falls back on when the codebase doesn't match what the agent expected.
Slice by package, module, or directory
Create one task per migration unit — a package, a feature folder, a top-level route. Each task's prompt names the exact paths it owns and the acceptance criteria for that slice. Keep the slices small enough to merge independently.
Run the queue concurrently with Wildfire
Mark every task `ready` and turn on Wildfire mode. The daemon dispatches them across isolated worktrees, so a transform that goes sideways on package A never blocks package B — and the sandbox keeps each agent from reaching into its neighbour's files.
Re-run the flaky ones in isolation
When you spot a task that landed in a weird state — codemod ran twice, type imports broken, tests skipped — open the transcript, tighten the acceptance criteria, and rerun just that subtask. Everything that passed stays merged.
A real task you can copy.
Drop this into .watchfire/tasks/<n>.yaml, tweak it to your repo, and start it from the TUI or GUI.
task_id: mig00007
task_number: 7
title: "Migrate packages/billing/* from react-query v4 to v5"
prompt: |
Upgrade every `@tanstack/react-query` usage
under `packages/billing/` from v4 to v5.
Concretely:
- Replace `useQuery({ queryKey, queryFn })`
object-form calls that still use the v4
callback options (`onSuccess`, `onError`,
`onSettled`) with v5-equivalent
`useEffect`-style side effects on the
component.
- Replace any `isLoading` reads that should now
be `isPending`.
- Update `packages/billing/package.json` to
`@tanstack/react-query@^5` and re-run
`pnpm install` inside the worktree.
Do not touch anything outside
`packages/billing/`. Other packages have their
own migration tasks.
acceptance_criteria: |
- No `onSuccess`/`onError`/`onSettled`
options remain on `useQuery` calls in
`packages/billing/`.
- `packages/billing` builds against
`@tanstack/react-query@^5`.
- `pnpm --filter billing test` passes.
- `pnpm --filter billing lint` passes.
- The lockfile in the worktree is committed.
status: ready
More starters in the task template library.
Why Watchfire makes this faster.
- Per-task worktrees mean concurrent migrations don't fight over the working tree — package A and package B run side by side on their own branches.
- The sandbox blocks each agent from reading or writing outside the project, so a runaway codemod on one slice can't accidentally rewrite another team's files.
- Each task's acceptance criteria nail the slice's contract — 'no v4 options remain', 'lockfile committed' — so 'looks done' isn't enough to close the task.
- If one package's transform is dirty, you re-queue just that task. The clean ones merge immediately instead of waiting for the laggard.
- The daemon tracks every transcript, so when a reviewer asks 'why this approach for package C?' the answer is one click away.
Related use cases.
Refactor a tangled module
Carve a sprawling refactor into scoped diffs you can actually review.
Read the playbook
Run several features in flight at once
Queue background work and let Wildfire keep it moving while you ship the main thing.
Read the playbook
Backfill tests on an under-covered module
Pin the coverage bar in acceptance criteria — and make the agent earn it.
Read the playbook
Get started with Watchfire
Install in seconds. Define tasks. Let agents ship code for you.
Download for macOSAvailable for macOS, Linux, and Windows
# Install via Homebrew (macOS)brew tap watchfire-io/tapbrew install --cask watchfire-io/tap/watchfire# Set up your project and gowatchfire initwatchfire task add "Build the login page"watchfire start --allIncludes GUI, CLI, and daemon. Also available via Homebrew.