baro
Type a goal in your repo. Walk away. Come back to a pull request.
You write one sentence. baro does the rest.
No babysitting. No copy-paste. No "now do the next file." baro plans the work, builds it in parallel across isolated branches, reviews itself, and opens the PR — from a single prompt.

- 01
You describe the goal
One sentence, plain English, in your repo.
- 02
An Architect pins the design
File paths, schemas, API shapes, library choices — so dozens of agents don't each invent their own.
- 03
A Planner splits it into a DAG
Stories with dependencies, so independent work runs at the same time.
- 04
A fleet of agents builds it in parallel
Not one chat agent typing for an hour — dozens, each in its own isolated git branch.
- 05
It reviews and repairs itself
A Critic checks every turn and corrects on failure; a Surgeon replans stories that get stuck.
- 06
You get a pull request
Build-verified, on a feature branch, with a stories table and run stats.
Everything between your sentence and the PR.
- ◆
Parallel by default
Your goal becomes a DAG — topological sort, level grouping, cycle detection. Independent stories run simultaneously, dependents wait their turn.
- ◆
Four LLM backends, one flag
`--llm claude` shells out to Claude Code on Anthropic Max. `--llm codex` shells out to OpenAI Codex CLI on ChatGPT Pro/Plus. `--llm openai` calls any OpenAI-compatible API through Mozaik. `--llm opencode` delegates to the OpenCode CLI (any provider). `--llm hybrid` mixes them — Claude on Architect/Planner/Surgeon, Codex on Story/Critic — the cheapest way to run anything serious.
- ◆
Review agent
After every level, a review agent checks work against acceptance criteria. Spawns fix stories automatically when something is off.
- ◆
Live TUI
Story status, agent logs, DAG view, stats. Nothing happens behind your back — every event lands in the dashboard in real time.
- ◆
Resume incomplete runs
Plans persist as prd.json. If a run is interrupted or you started with --dry-run, pass --resume to continue with the same DAG.
- ◆
PR with full summary
On a feature branch, never on main. PR body includes the story table, build stats, time saved vs sequential, and review notes.
Install. Point. Ship.
- Basic — give it a goal, walk away (Claude Code under the hood)
$ baro "Add JWT authentication with role-based access control"
- Codex CLI on your ChatGPT Pro/Plus subscription instead
$ baro --llm codex "Refactor the database layer"
- Hybrid — Claude upstream, Codex downstream (cheapest serious mix)
$ baro --llm hybrid "Add WebSocket support across api and frontend"
- OpenCode CLI — any provider, any model
$ baro --llm opencode -m anthropic/claude-sonnet-4 "Refactor the database layer"
- Mozaik-native OpenAI (per-call API billing)
$ OPENAI_API_KEY=sk-... baro --llm openai "Refactor the database layer"
- Any OpenAI-compatible endpoint (OpenRouter, vLLM, Ollama, MiMo…)
$ OPENAI_API_KEY=key OPENAI_BASE_URL=https://openrouter.ai/api/v1 baro --llm openai --story-model anthropic/claude-3.5-sonnet "..."
- Mix it yourself — any phase, any backend
$ baro --architect-llm claude --story-llm codex --critic-llm codex "..."
- Limit parallelism on big plans
$ baro --parallel 3 "Refactor the database layer"
- Dry-run first, run later
$ baro --dry-run "Add WebSocket support" baro --resume
Not a pipeline. A bus.
baro is built on the Mozaik agentic environment. The Conductor has no run() method. Every participant subscribes to event types and emits others — spawning a story, evaluating a turn, replanning the DAG are all reactions, not steps in a loop.
// the usual orchestrator async function run(prd) { for (const level of prd.levels) { const results = await Promise.all( level.stories.map(s => runStory(s)) ) if (anyFailed(results)) { const fixes = await reviewer(results) await Promise.all(fixes.map(runStory)) } } await commitAndPush() await openPR() }
// baro on the Mozaik bus class Conductor extends Participant { onContextItem(item: ContextItem) { if (item.type === "RunStartRequest") this.emit(LevelComputeRequest()) if (item.type === "StoryResult") this.checkLevel(item) if (item.type === "LevelCompleted") this.emit(this.nextLevelOrFinish()) // no run(), no while, no Promise.all } }
- ArchitectDesigns the DAG up front — runs once before any story spawns (0.25)
- ConductorOrchestration state machine — drives the run by reacting
- StoryFactorySpawns Story Agents on each StorySpawnRequest
- StoryAgentRuns one story via Claude CLI, with retries and timeout
- LibrarianCross-agent memory — indexes outputs of exploration tools
- SentryFlags overlapping file writes across concurrent stories
- CriticPer-turn acceptance-criteria evaluator (opt-in)
- SurgeonEmits DAG replans when a story fails terminally (opt-in)
- FinalizerCommits the run, pushes the branch, opens the PR
- OperatorBridges external commands (TUI, web UI) into bus events
- AuditorJSONL log of every event on the bus
- CartographerTranslates bus events into UI frames for the Rust TUI
We wrote up the full engineering story — Getting the maximum out of my Claude Code subscription→
Untranslatable. Approximated by cool, sharp, the real thing — but if any of those were enough, the word would not exist. Its negation carries the weight: when something is not baro, it isn't merely uncool, it is actively, irredeemably wrong.
npm i -g baro-ai
Type a goal. Get a PR.