Skip to main content
Watchfire
Switching from raw CLI

Switch from raw Claude Code or Codex

Keep the agent you trust — add the seatbelts your working tree doesn't have.

Who this is for.

You already drive Claude Code, Codex, or another agent CLI directly. You like it. You're not looking to swap models or rewrite your workflow. You want the same agent, with worktree isolation so it stops trampling your working tree, a sandbox so it stops reading random files, and a task contract so the work has a shape you can review.

The workflow in 4 steps.

  1. Init the project with the agent you already use

    `watchfire init --agent claude-code` (or `codex`, `opencode`, `gemini`, `copilot`, `cursor`) wraps the agent you already have authenticated — Watchfire doesn't replace your login or your model choice. The result is a `project.yaml` and a place to write tasks.

  2. Translate your next prompt into a task

    Instead of typing the same intent into the agent CLI prompt, write it as a task: prompt, acceptance criteria, status `ready`. The four real shifts are: task instead of prompt, worktree instead of working tree, sandbox, and diff-review instead of mid-run intervention.

  3. Run it and stay out of the way

    Watchfire spins the agent up in a fresh worktree with the sandbox on. You don't have to pause it to keep editing on `main` — the worktree is separate. You don't have to babysit — the task either meets its acceptance criteria or it doesn't.

  4. Review the diff, then queue the next one

    When the task lands, you review a tight branch instead of debugging in the same terminal where the agent is still typing. Like the result? Merge. Don't? Re-queue with sharper criteria. Either way, the working tree stays clean and the next task is already pulling from the queue.

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: swap0001
task_number: 1
title: "Your first Watchfire task, translated from a prompt you'd usually type"
prompt: |
  This is the kind of thing you would have typed
  straight into Claude Code or Codex. The only
  difference: write it down once, run it inside a
  worktree, and review a diff at the end.

  Add a `/healthz` route to `app/healthz/` that
  returns `{ "ok": true, "version": <commit-sha> }`
  with HTTP 200. Read the commit sha at build time
  from `GIT_COMMIT_SHA` if it's set, otherwise
  fall back to `process.env.npm_package_version`.

  Do not add a new dependency. Do not touch any
  existing route.
acceptance_criteria: |
  - GET `/healthz` returns 200 with the body
    described above.
  - A test exists under `app/healthz/__tests__/`
    that covers both the `GIT_COMMIT_SHA` path
    and the fallback.
  - `npm run test` and `npm run lint` pass.
  - No changes outside `app/healthz/` and (if
    needed) one tiny helper in `lib/`.
status: ready

More starters in the task template library.

Why Watchfire makes this faster.

  • Same agent, same login, same model — Watchfire wraps the CLI you already trust instead of replacing it.
  • The agent runs in a worktree on its own branch, so you can keep editing and committing on `main` without an 'oops, the agent overwrote my file' moment.
  • Sandboxing blocks `~/.ssh`, credential stores, and `.git/hooks` by default, so a misfired prompt can't reach out and grab something it shouldn't.
  • Acceptance criteria mean the agent has a definition of done — you stop having to interrupt mid-run to nudge it back on track.
  • When a task fails, you re-queue it. You don't restart a long REPL session and reconstruct the context from memory.
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.