vago
Builds a goal in your repo while you're away, ticket by ticket, and hands back one pull request.
- status
- In development, private repo
- agents
- Claude Code or Codex
- built with
- TypeScript on Bun, compiled to one binary
- runs on
- macOS and Linux
You grill the plan with an agent, write the goal, split it into tickets and walk away. vago run then takes each ticket through a workflow you wrote yourself: a list of steps, some run by a coding agent (Claude Code or Codex for now, Pi is coming) and some by plain shell commands, with your own checks in between. Each ticket ends as one commit on the goal's branch, and the goal ends as one pull request for you to review and merge.
vago has opinions about how a workflow gets executed and leaves the workflow itself to you. I think the bottleneck now is human attention, and vago is my way of spending less of it. Vago means lazy in Spanish (it also reads as "various agents go", which I'll take).
It built itself that way, running a frozen build of itself: 15 goals, 88 tickets and 575 agent runs. The repo is private for now.
# Decisions
TypeScript on Bun, driving the agent CLIs
ADR 0001- chose
- TypeScript on Bun, shipped as one binary with
bun build --compile. It drivesclaude -pandcodex execheadless, with no agent SDK.
- rejected
- Go, the early favourite for its single binary. I struggle to follow idiomatic concurrent Go, and code that vago writes about itself has to stay readable to me.
- cost
- Bun doesn't type-check, so the checks are strict
tsc --noEmit, Biome andbun test. And vago's changes to itself only land after a rebuild and reinstall.
One worktree and branch per goal
ADR 0004- chose
- The kernel owns a git worktree and one branch per goal. Ticket branches, commits, merges, pushes and PRs all belong to the workflow.
- rejected
- Running steps in my own checkout with a kernel that knows no git (ADR 0002, now superseded). I couldn't touch the checkout while a goal ran, and two goals couldn't run at once.
- cost
- Some git in the kernel: a
git worktree addper goal and a few reads.
The TUI only reads
ADR 0005- chose
- Runs live in their own
vago runprocesses. The TUI reads goals, tickets and logs, and its one action on a goal is starting it.
- rejected
- A TUI that owns the runs. Closing it would kill or orphan goals, and there's no daemon to hand them to.
- cost
- The TUI can't stop or reset a goal yet. Those need their own decision.