Skip to content

Swarm v0.7.0

Choose a tag to compare

@github-actions github-actions released this 23 Aug 13:19

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 = 100 in .swarm.toml puts a spend ceiling on a repo, judged from the same transcript-priced numbers as the Spend view. At warn_at (80%) a budget incident opens; past 100% on_exceed decides: "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 profilesswarm run --profile no-edits|read-only (and the Run / Dispatch drawers, [dispatch] profile) narrow what a spawned agent may do: no-edits keeps the shell but not the file tools, read-only keeps 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. And swarm install now registers the same MCP server with Codex CLI and Gemini CLI when they're installed, so they get the swarm_* 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, or swarm answer <id> <text>; swarm questions lists 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_inbox on demand — and a session starting later in the same task's worktree is told about open questions and answers that never arrived (M7.7).
  • Dispatchswarm dispatch --ready (or pick tasks; the Dispatch chip on the Board's Tasks; swarm_dispatch from a lead agent) hands ready tasks to autonomous runs: each gets its own claim and worktree and a claude -p run 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 a dispatch_failed incident 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], MCP swarm_pr_open; a pr.opened event on the Timeline (M7.3).
  • Gates that run themselves — a gate with a command in .swarm.toml ([gates.tests] cmd = "bun test", optional timeout / cwd) is executed rather than vouched for: swarm gate run <task> (or swarm_gate_run from 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 at timeout. 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 taskswarm wt create <name> makes a worktree for a spike or a review checkout (under ~/.swarm/worktrees/<project>/, branch wt/<name>, bootstrapped like a claim); swarm wt lists every worktree with drift against the main checkout's branch (N behind, merged); swarm wt open opens it with [worktree] open = "code {path}" or the file manager; swarm wt rm removes it with the same refusals as release (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"] and setup = "bun install" bootstrap every new worktree: the files are copied from the main checkout as the claim is made and setup runs inside the worktree in the background (log in ~/.swarm/logs/<project>/bootstrap-<task>.log, a worktree.bootstrapped event on the Timeline). swarm run waits for it before starting the agent; an interactive swarm claim prints the log path and returns at once. A failing setup opens a bootstrap_failed incident 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