Skip to main content
Watchfire
Migration

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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.
Ready to go

Get started with Watchfire

Install in seconds. Define tasks. Let agents ship code for you.

Download for macOS

Available for macOS, Linux, and Windows

install
# Install via Homebrew (macOS)
$brew tap watchfire-io/tap
$brew install --cask watchfire-io/tap/watchfire
# Set up your project and go
$watchfire init
$watchfire task add "Build the login page"
$watchfire start --all

Includes GUI, CLI, and daemon. Also available via Homebrew.