Swarm v0.7.0
The orchestrate release: Swarm runs a task end to end on its own and you stay in control. New worktrees start warm, gates execute instead of being vouched for, swarm dispatch hands ready tasks to autonomous runs whose outcome is derived from the ledger, an agent that needs a human decision can ask for one, and a budget keeps the bill in bounds.
Added
- Budgets —
[budget] daily = 25/weekly = 100in.swarm.tomlputs a spend ceiling on a repo, judged from the same transcript-priced numbers as the Spend view. Atwarn_at(80%) abudgetincident opens; past 100%on_exceeddecides:"warn","ask"(every Bash / Edit / Write in the repo asks first), or"stop"(spawned runs stopped, dispatch queue cleared). One incident per level per day; a budget tile on the Spend view. - Run profiles —
swarm run --profile no-edits|read-only(and the Run / Dispatch drawers,[dispatch] profile) narrow what a spawned agent may do:no-editskeeps the shell but not the file tools,read-onlykeeps only read and search. swarm_context— an agent can re-read what Swarm told it at session start, current as of now (holds, lease left, handoff, gates, resources, rule modes), plus answers to its questions.GET /v1/context. Andswarm installnow registers the same MCP server with Codex CLI and Gemini CLI when they're installed, so they get theswarm_*tools too (M7.10).- Ask the human — an agent that hits a decision only a person can make calls
swarm_ask(with optional suggested answers). The question shows on the session page under waiting on you with the options as buttons, the session gets an Asking badge on Fleet, and a desktop notification fires. Answer there, orswarm answer <id> <text>;swarm questionslists what's open. The answer reaches the agent by itself — stdin for a spawned run,[swarm]context on the next tool call for an interactive session,swarm_inboxon demand — and a session starting later in the same task's worktree is told about open questions and answers that never arrived (M7.7). - Dispatch —
swarm dispatch --ready(or pick tasks; the Dispatch chip on the Board's Tasks;swarm_dispatchfrom a lead agent) hands ready tasks to autonomous runs: each gets its own claim and worktree and aclaude -prun told to work there, run the gates, hand off and open the PR;[dispatch] max_parallel(default 2) run at once per repo, the rest queue. When a run ends Swarm derives the outcome from the ledger — executable gates re-run by the daemon, PR looked up on the forge — and reports done, gates-failed, no-pr, crashed or stopped; anything short of done opens adispatch_failedincident and keeps the claim for you to resume or release. A dispatched run never edits the task list.swarm dispatch status | clear,GET/POST/DELETE /v1/dispatch, a Dispatch section on the Board (M7.5). - Diff and Open PR — every worktree row on the Board (and a session page whose cwd is a worktree) gets Diff: the commits and files it carries beyond the main checkout's branch, uncommitted and untracked changes included, with a coloured unified diff per file. PR pushes the branch and opens a pull request (
gh) or merge request (glab) prefilled from the task's title, the latest handoff, the required gates as a checklist and the file list — editable before it goes; refuses uncommitted changes, reuses an open PR for the branch.swarm wt diff,swarm pr open [--dry-run], MCPswarm_pr_open; apr.openedevent on the Timeline (M7.3). - Gates that run themselves — a gate with a command in
.swarm.toml([gates.tests] cmd = "bun test", optionaltimeout/cwd) is executed rather than vouched for:swarm gate run <task>(orswarm_gate_runfrom the agent, or Gates on a held task row on the Board) runs every required gate that has a command inside the task's worktree and records the verdict — exit 0 passes, the rubric is the command and how it ended, the evidence is the output tail, the log lives in~/.swarm/logs. Runs go through the process registry and are killed attimeout. When a session in a held worktree ends, the daemon runs them on its own and writes the verdicts into that session's auto-handoff ([gates] auto = "session-end" | "stop" | "off") (M7.4). - Worktrees without a task —
swarm wt create <name>makes a worktree for a spike or a review checkout (under~/.swarm/worktrees/<project>/, branchwt/<name>, bootstrapped like a claim);swarm wtlists every worktree with drift against the main checkout's branch (N behind, merged);swarm wt openopens it with[worktree] open = "code {path}"or the file manager;swarm wt rmremoves it with the same refusals asrelease(dirty, unpushed, never the main checkout, never a held claim);swarm wt gc [--apply]finds worktrees whose branch was merged or whose claim was released and the folder left behind. The Board's Worktrees section gets the drift column, Open / Remove per row, New worktree and Collect stale (M7.2). - Warm worktrees —
.swarm.toml [worktree] copy = [".env.local"]andsetup = "bun install"bootstrap every new worktree: the files are copied from the main checkout as the claim is made andsetupruns inside the worktree in the background (log in~/.swarm/logs/<project>/bootstrap-<task>.log, aworktree.bootstrappedevent on the Timeline).swarm runwaits for it before starting the agent; an interactiveswarm claimprints the log path and returns at once. A failing setup opens abootstrap_failedincident but never takes the claim away. Paths are repo-relative only (M7.1).
Fixed
- The Fleet agent badge no longer renders a stray "…" after the pill: badge-only cells clip instead of ellipsizing, and the column got a few more pixels.
Install: bunx @ra3orblade/swarm setup · Docs: https://getswarm.vercel.app/docs/ · Changelog: https://getswarm.vercel.app/changelog