Repository navigation
Releases
capcomd 0.12.0
Fixes capcomd restarting after every Mac sleep, and gives the desktop window a sidebar, ⌘K Search, a Needs you reel,
and pane splits.
- capcomd no longer restarts after your Mac sleeps. Since 0.11.0 (Rivet 3.1.1) the engine stopped itself on every wake
after a sleep longer than about 30 seconds, andcapcomd serveexited with it ("engine on :6420 stopped answering")
until launchd started it again. Now serve starts the engine again in place, on the same data, and logs one line
("the engine on :6420 exited …; starting it again on the same data"). The harness API stays open, and agents that
were running when the Mac went to sleep carry on and finish. - The capcomd window has a sidebar. Open it with ⌃⌘S (or ⌘, View › Toggle Sidebar, or the sidebar button next to the
traffic lights): your agents are listed by what needs you (Needs you, Running, Finished), each project as a label with
where it runs, and the window shows one agent at a time beside it. Click an agent (or use ↑ ↓ and Return) to show it;
its ••• menu messages, pauses or resumes it, or copies its ID. The Needs you hand and the Needs you heading open
the Needs you reel in the agent's place. The window remembers whether the sidebar is open. - Folded (the default), a rail on the window's left holds Home, the Needs you hand with how many agents need you, and
Settings; Home moved there from the title bar, where the sidebar button now sits. - Desktop: ⌘K is now Search, a native palette in the style of Spotlight (system vibrancy, accent selection). One list finds what needs you (asks
and usage limits), agents by their own titles, projects and commands, ranked in that order, as you type. Matching is
forgiving: word starts, anywhere in a name, or letters in order (mkmfinds "matchkey migration"). Before you type,
it shows what needs you, what you looked at recently and the common commands. ↩ opens the result (an agent opens
its project at its column); ⌘↩ opens it in a split.
Commands carry their shortcuts, and Stop… is shown in red. The menu item is now Project › Search… (⌘K). - The desktop window has a Needs you reel: every agent waiting on you, across all projects, one column per ask,
oldest first, each with its thread and its ask (a merge with its files, a question, a usage limit to resume). Open it
with the Needs you hand (on the window's rail, or in the sidebar's header; its amber count says how many) or View › Needs You. Answering an ask slides its
column out and the next takes its place; a new ask joins at the end; with none left it says "Nothing needs you.".
Esc or Back returns to where you were. - ⌘J (View › Next Ask) steps through the asks one at a time, oldest first, from anywhere: it opens each asking agent
in its project, or in the Needs you reel focuses the next column. - A merge's decision in the desktop window says how many files it changes and its line counts ("3 files, +73 −5").
- Desktop: with the sidebar open you can split the pane. ⌘D splits right and ⇧⌘D splits down, opening the next agent in
the tree beside the one you're looking at. ⌘-click a row in the sidebar, or press ⌘↩ on an agent or project in Search
⌘K, to open it in a split. ⌃← and ⌃→ move between panes, and a click in a pane focuses it. ⌘W or a pane's × closes a
split (with one pane left, ⌘W folds the project as before). Each project keeps its own splits. Rows shown in other
panes are tinted in the sidebar. A split won't make a pane narrower than 340 pt: at 1440 pt three fit side by side. - Desktop: expand a pane to the whole window with its arrows-out button or ⇧⌘↩. The sidebar hides, prose reads in a
centred 800 pt column, code, tables, diffs and tool results get 1060 pt, and an ask sits at the foot at column width
with its amber ring. Esc or arrows-in brings back exactly the panes you had, each where you left it. Picking another
agent from ⌘K or ⌘J keeps the pane expanded. Search ⌘K lists Split right, Split down, Close this split, Expand / Collapse
the pane and Show / Fold the sidebar, with their shortcuts. - Desktop: project labels in the sidebar show their place icon (This Mac or boxd) for runs that didn't name a place too,
using the daemon's default place. - The app now finds the daemon the way the CLI does:
CAPCOMD_HARNESS_SOCKET, then$CAPCOMD_HOME/harness.sock, then
the app'scapcomd.socketPathsetting, then~/.capcomd/harness.sock.
Install
Needs Bun ≥ 1.4.0.
bun add -g capcomd@0.12.0
# or from this release's package:
gh release download v0.12.0 --repo MarvinAmador7/capcomd --pattern 'capcomd-0.12.0.tgz' && bun add -g ./capcomd-0.12.0.tgz
capcomd setupcapcomd-0.12.0.tgz.sha256 holds the package's SHA-256. The npm package is published from this workflow run with provenance.
capcomd 0.11.0
Moves capcomd to Rivet 3.1.1. Breaking: runs from before the upgrade are set aside, so finish or cancel them first.
- capcomd now runs on Rivet 3.1.1 (rivetkit 3.1.1, with
@rivet-dev/services0.2.5). - Breaking: a Rivet 3 engine can't read what the Rivet 2 engine kept, and capcomd doesn't carry it over. On the
firstcapcomd serveafter upgrading, the old engine data is moved aside to~/.capcomd/engine/<port>/rivet-v2/
(nothing is deleted), serve prints one line saying so, and the engine starts empty: runs and agents from before the
upgrade can't be shown, resumed or cancelled any more, and they leave the run list (kept in
~/.capcomd/state/runs-rivet-v2.jsonl; their traces stay). Finish or cancel your runs before you upgrade. - When you stop
capcomd serve(Ctrl+C, SIGTERM,capcomd servicestop), it now exits only once its engine and the
rivet-services it started have stopped.
Install
Needs Bun ≥ 1.4.0.
bun add -g capcomd@0.11.0
# or from this release's package:
gh release download v0.11.0 --repo MarvinAmador7/capcomd --pattern 'capcomd-0.11.0.tgz' && bun add -g ./capcomd-0.11.0.tgz
capcomd setupcapcomd-0.11.0.tgz.sha256 holds the package's SHA-256. The npm package is published from this workflow run with provenance.
capcomd 0.10.1
Fixes capcomd auth login fx on environments built before fx and on Vercel Token Pass teams, and installs from
Homebrew 7.
capcomd auth login fxworks on an environment image built before fx was added: the login installs the pinned fx in
its VM instead of failing with "fx is not installed in the env snapshot".capcomd env buildnow builds a new image when fx's pinned version changes, instead of keeping the existing image
that has no fx. The firstcapcomd env buildafter updating builds one new image; until then agents keep using the
current one and install fx as they start.- A failed
capcomd auth loginnow suggestscapcomd doctorinstead of pointing atcapcomd events <runId>. - The check after
capcomd auth loginruns on the agent's configured model (CAPCOMD_AGENT_MODELor the profile's
model) instead of the CLI's default. For fx on a Vercel Token Pass, log in with a featured model, for example
CAPCOMD_AGENT_MODEL=zai/glm-5.3 capcomd auth login fx. When the account won't pay for the model (no AI Gateway
credit, or a Token Pass that doesn't cover it), the error says the login itself worked and what to change. - Homebrew 7 and later can refuse to load capcomd "from untrusted tap". Trust the tap once with
brew trust MarvinAmador7/tapand run the install again (README → Install). The cask now states its macOS
requirement in the current form (depends_on macos: :sonoma), so Homebrew no longer warns about it.
Install
Needs Bun ≥ 1.4.0.
bun add -g capcomd@0.10.1
# or from this release's package:
gh release download v0.10.1 --repo MarvinAmador7/capcomd --pattern 'capcomd-0.10.1.tgz' && bun add -g ./capcomd-0.10.1.tgz
capcomd setupcapcomd-0.10.1.tgz.sha256 holds the package's SHA-256. The npm package is published from this workflow run with provenance.
capcomd 0.10.0
Everything is a plugin: capcomd now runs on a plugin kernel (sandboxes, agent providers, forges, gates, triggers,
jobs, a watchdog and your own plugins, in process or as separate programs), agent profiles become YAML files you can
share and trust, projects get memory and business knowledge (a reviewed context layer), every working agent gets
background jobs, and fx joins Claude Code and Codex as an agent provider. Several Breaking: changes below. Also
fixes fresh installs of 0.9.0, which could not start runs (an unpinned dependency).
- Fixed: the watchdog no longer flags an agent that started a background job and then waits for it in a command
(asleep, a wait on its inbox). The time that command ran alongside the job used up the command time the watchdog
allows between two signs of progress (plugins.watchdog.stalledAfterMs), so with a short limit the agent was flagged
stalledsoon after the job ended, while it was still waiting. Now the job's time is taken off once, and a command
still running after the job ends holds the clock like any other. - A project with no memory yet no longer pays for it in every prompt: when the run's branch has nothing under
.capcomd/context/(no lesson, fact or index file; an empty folder or a.gitkeepcounts as nothing), agents start
without the context brief and without the context skills, exactly as if their profile had nocontextblock, and the
run recordsplugin.context.skippedwith reasonempty. Agents can still propose lessons (capcomd result --data '{"context": […]}'); once the first one is approved and lands, the agents after it get the brief and the skills.
capcomd context brief <profile>says when a profile's agents start with nothing. capcomd setup projectgives every project the context consolidator. When your project already has a planner that
can't spawn it (set up before the consolidator existed, or moved from agents.json), setup leaves your planner alone
and prints the command that lets it (capcomd profiles set planner --set children.allowedChildProfiles=…);
capcomd profiles migrateprints the same note. Memory changes still wait for your approval before they land.- Breaking:
capcomd runwithout a planner agent (the built-in placeholder recipe:capcomd run <goal>on a place
without real machines,--recipe,--legacy,CAPCOMD_RUN_PATH) is off by default. It plans the same generic
tasks for any goal and judges nothing, so it's kept for comparisons and tests only. Such a run is now refused before
it starts, with a config error that says so. Use a planner agent instead (--planner <profile>;capcomd setup
writes one namedplanner), or turn the placeholder back on withcapcomd plugins enable recipe-hierarchical(or
CAPCOMD_PLUGIN_RECIPE_HIERARCHICAL_ENABLED=true). The same goes forPOST /v1/runswithout a driver on such a
place: it answers 422 with that reason.capcomd plugins listshows it asrecipe-hierarchical. - The run list (
state/runs.jsonl, or the fileCAPCOMD_RUNS_INDEXnames forcapcomd run new) and each run's
trace directory are now recorded by capcomd's daemon, as two built-in plugins you can see incapcomd plugins list
(observe-runs-index,observe-traces). The rows are the same as before, in the same file, except that
CAPCOMD_RUNS_INDEXmust now name a.jsonlfile that is a runs index (or doesn't exist yet) and isn't a link:
for anything else the run is listed in capcomd's own run list instead. Arun newthat failed partway and is then
retried with the same--keyis now listed once the retry finishes it. - Plugins that listen to
run.changedare now toldcreatedoncecapcomd run newhas finished setting the run up,
not when its record is first made. A run whoserun newfailed partway is told as created only when a retry
finishes it. - The settings and info rows of a place's details screen (
GET /v1/sandboxes/{name}) now come from that place's
sandbox plugin. They read exactly as before. - Fixed: a docker CLI that hangs no longer hangs capcomd with it.
capcomd setup, the run options the apps show and
starting a run on Docker now say "Docker isn't running" after 3 seconds, even when the CLI (or something it started)
never lets go. - New: an agent can start a background job that keeps running after it finishes, such as a server kept up for
review:capcomd job start --run -- <command>(MCPcapcomd_job_startwithrun: true). It runs in a machine of
the run's own, made from the run's agent environment the way the checks machine is (no checkout, no credentials,
package registries only), until the run ends or its--timeout-ms; then it is stopped and the machine deleted.
The Machines list shows that machine as the run's background jobs. Plugins can start one with
ctx.jobs.start({kind: "exec", owner: {run: true}, …}), which used to be refused as unsupported. - Changed: an agent's background job is now stopped once it has run
afterTurnMs(30 minutes by default) past the
agent's last step, not 30 minutes after the job started, so a long build keeps running while its agent is still
working. A job started with--timeout-msstill stops at that timeout (at most the profile'safterTurnMs). - For contributors: the context eval has an
index-noskillsarm (--arms index,index-noskills): agents get the
same context brief as theindexarm, in the same place, without thecapcomd-context-doctrineand
capcomd-context-routingskills, so a run shows what those skills change (success, work, cost, the planted-instruction
probe, citations). CI runs it on the fake sandbox, where--expectnow also checks each agent's delivered prompt:
the brief in every index arm, the skills in each but this one, and this one's brief the same asindex's. - Breaking: a run you start on a sandbox stays there.
capcomd run --sandbox docker(andrun new --sandbox, the
API'ssandbox,capcomd_run_new's) now keeps every agent of the run on Docker, even when a profile's
sandbox.providernames boxd, so a profile can no longer spend your boxd credit on a run you put on Docker. A
profile'ssandbox.providerstill wins over a sandbox the run took from your settings (CAPCOMD_SANDBOX, the
project's or your config). To use a profile's sandbox, start the run without--sandbox. - Breaking: a project's profile that moves its agents to another sandbox needs your trust first. A file in the
project's.capcomd/profiles/that setssandbox.provider(or theenvironmentorsizeof a profile that names
one) is honoured only aftercapcomd profiles trust <name>, which shows the file and asks, as for the project's
skills; until then, and again after the file changes, a spawn of it on a run without its own sandbox is refused
(untrusted).capcomd profiles showsays where the profile's agents go and whether the file is trusted,
validatewarns, and the profile lists (capcomd profiles list --json,capcomd_profiles,GET /v1/profiles)
name the untrusted files inuntrustedSandbox. Your own profiles (~/.capcomd/profiles/) need no trust. If you
use such a project profile, runcapcomd profiles trust <name>once, or start the run with--sandbox. - New:
capcomd plugins validate --strictalso warns when a plugin could take more of your attention than it needs:
a notifier (one that listens to every run and agent change) whose config has noquietoption, so people can't turn
it down short of disabling it. Warnings never fail the check. capcomd plugins show <name>now names the commands and MCP tools a plugin adds (by the namescapcomd mcpserves
them, e.g.capcomd_spawn),capcomd plugins listcounts them, and both--jsonoutputs (andGET /v1/plugins)
carry atoolslist.- Faster:
capcomd env build(andenv build --project) now puts the brains your project maps (capcomd context brain add) into the environment image, each at the commit it is pinned to, so agents start with them instead of
copying the brain in at every start. Map a brain at a newer commit and the nextcapcomd env buildbuilds a new image.
The build says which brains it baked in, and leaves out one that is restricted, can't be read, or has
credential-shaped text in it (agents then get it at start as before). - Fixed: only a brain's knowledge folder (
knowledge/, or the one you named with--bundle) reaches an agent's
sandbox now. Before, the whole brain repository was copied in, while only the folder's Markdown files were checked
forsensitivity: restricted, so a restricted file elsewhere in the repository reached agents. Every file in the
folder is now checked, Markdown or not (a YAML, JSON, TOML or text file markedsensitivity: restrictedor
sensitivity = restrictedrefuses the brain, as does any file over 4 MiB or a folder of more than 2000 files: keep
big attachments outside the knowledge folder). An agent's sandbox also keeps only the brains its own brief cites:
brains another project's image carries are removed before the agent starts (an agent whose sandbox can't be cleaned
doesn't start), and checks thatcapcomd verifyruns in a VM never see any brain. - New: once you open a pull request from a goal branch (
capcomd pr open, the app, orcapcomd_pr_open), the run
follows its conversation on GitHub. When someone you allow (triggers.sources.github.allowedin
~/.capcomd/config.json) writes there with/capcomd …(or, inmode: "auto", without it), the run's planner starts
again with their comment in its inbox and pushes more work onto the goal branch, which updates the pull request. In
the default observe mode a comment without/capcomdis only recorded (capcomd triggers logsays the planner would
have started again); anyone else's comment reaches only the planner's inbox. This works for any trigger source: a
person's requ...
capcomd 0.9.0
Drivers get much further on their own. A project's runs use its own sandbox, setup registers the project and offers
the Docker env build, and a merge of a verified commit lands in about 2 seconds when the target hasn't moved. Verifies
run side by side, capcomd_await waits on verifies and merges, the orchestration skill opens with team shapes, and a
lead profile lets parts of the work have helpers. Breaking: a goal-branch run you drive yourself becomes ready
only when you mark it done (capcomd goal done, or capcomd_goal with done: true). Checked with a live run before
the release: an Opus driver built a small project with 16 Claude agents on Docker, with no workarounds.
-
Fix: verify's reviewer now judges the same code the checks test: your agent's change merged onto the target
branch. Before, an agent branch cut before the target got code its tests need could fail review even though its
checks passed. If the target moves during a verify, the review runs again on what the checks tested. -
Fix:
capcomd run new --key(andcapcomd_run_new) scopes the key to the project, so two projects whose drivers
pick the same key get separate runs. Runs created before this keep working for their own project. -
Fix:
capcomd_setupno longer reports "not ready" because a Codex login is missing when no profile in the project
uses Codex, or because the plugin is missing when your agent already reaches capcomd's tools. Before a project is
set up,capacitydescribes the sandbox your config names. -
Fix: agents' commit subjects, and the pull requests made from them, read like commit messages ("Add X" instead of
"I added X…"). The title you give an agent with--titleis used before the task text, and names likeprintExpr
keep their case. -
Fix:
capcomd setup's env-image check respectsCAPCOMD_WORKDIR. WhenCAPCOMD_HOMEis set, clones default to
$CAPCOMD_HOME/work. -
Fix:
capcomd status <runId>for a run you drive yourself (no planner) shows its agents' state, its budget and
spend, and its total number of events. With--json,scopeincludes them, andeventscounts every event of the
run. -
capcomd <command> --help(for examplecapcomd setup project --help) shows that command's usage. -
capcomd run's planner can now hand a part of the goal that splits further to a lead, which splits it among
helpers and verifies and merges their work itself. New projects get this fromcapcomd setup. In an existing
project, add"lead"to the planner'schildren.allowedChildProfilesin.capcomd/agents.json. -
The orchestration skill now starts with "Choose a team shape": a single loop, a wide fan-out, contract first then
wide, or leads with helpers. It says which shape fits what you asked for, and has the driver check its plan before
the first agent starts (the tree, the longest chain of steps, and how many agents can run at once). -
capcomd setupnow writes aleadprofile, which can spawn up to 3 worker helpers one level down and verifies and
merges their work itself. Give a part of the work that splits into pieces to a lead, spawned with
children: {maxChildren: N, maxDepth: 1}. Existing profiles are kept; re-running setup only adds missing ones. -
The
reviewerprofile that setup writes can now run your project's test runner (bun test,npm test,
pnpm test,cargo test, …) as well as the check's own commands. -
capcomd_setupandcapcomd_run_newsay how many agents can run at once in that sandbox (capacity).
capcomd_profilesandcapcomd agents listsay what each profile can do and whether it can lead (canLead). -
The capcomd MCP server now gives your agent short instructions as soon as it connects: the team shapes, the skill
to load, and to start withcapcomd_setup. -
Asking a profile that can't spawn (such as
worker) to fan out is refused with a message that names the profile
and what to spawn instead (reason: "cannot_spawn"). -
Merging a verified commit is much faster. When the target hasn't moved since the verify, capcomd pushes the verified
commit as it is, in one round trip, with no second run of the checks. When the target has moved, the checks still
run again first. Merge results showtimings.path(fastorfull). -
Verifies of the same target run side by side instead of one at a time, and the reviewer starts alongside the checks
instead of after them. SetCAPCOMD_REVIEW_PARALLEL=0to review only after the checks. -
capcomd_awaitwaits on verifies and merges as well as agents (ops: ["vfy-…", "mrg-…"]). Withmode: "any", it
returns as soon as the first one finishes. -
Checking on a verify or merge no longer fails with a conflict. Poll it with
capcomd_verify {runId, id}or
capcomd_merge {runId, id}, or with the same key without resendingacceptance; only a parameter you give that
differs is a conflict. Both tools always answer with the id, andtimeoutMs: 0starts one without waiting. -
Verify and merge results and events include
timings(checks, review, queue, fetch, push), so you can see where
the time went. -
Breaking: if you drive a goal-branch run yourself (no planner agent), it is now ready only when you mark it done,
withcapcomd goal done <runId> --summary "…"orcapcomd_goal {runId, done: true, summary}. Before, it became
ready as soon as its first agent finished, so the apps showed it ready while most of the work was still running. -
A run uses its project's sandbox (from
.capcomd/config.json), then the one in your user config, instead of the
sandbox the engine was started with. You can choose one per run withcapcomd run new --sandbox docker|boxdor
sandboxoncapcomd_run_new, and the result says which sandbox the run uses and why. Set a project's sandbox with
capcomd setup project --sandbox docker|boxd. -
capcomd setup projectadds the project to capcomd's project list right away, so your agent'scapcomd_projects
andcapcomd_setupsee it without a restart.capcomd setup agent --default-projectnow works without Hermes. -
capcomd setup checkandcapcomd_setupreport the sandbox the project's runs will use and where that setting
comes from. They also run that sandbox's checks: whether Docker is running or a boxd key is set, the logins, and the
env image. -
On Docker, setup tells you when the env image has no warm checkout of your repository, or an outdated one, and
offers to runcapcomd env build --sandbox docker(--env-buildbuilds without asking). -
Creating a run with a goal branch no longer clones the repository, so it takes a few seconds instead of about a
minute. A new run can reuse a goal branch left empty by a cancelled run with the same name; a goal branch with
commits is never reused or deleted. -
When the checks can't run, for example because the image has no bun, verify says so and tells you how to fix it,
instead of reporting "tests failed". Verify also installs the project's pinned bun when the image lacks it. -
When capcomd commits an agent's work, the commit message uses the agent's own words (its commit, summary or title),
not the first line of its task. -
capcomd_runsreturns within seconds even when a run is slow to answer, and lists each run's state. -
A cancelled run and its agents show as cancelled everywhere (status, TUI, run list), never as "failed" or "error".
Install
Needs Bun ≥ 1.4.0.
bun add -g capcomd@0.9.0
# or from this release's package:
gh release download v0.9.0 --repo MarvinAmador7/capcomd --pattern 'capcomd-0.9.0.tgz' && bun add -g ./capcomd-0.9.0.tgz
capcomd setupcapcomd-0.9.0.tgz.sha256 holds the package's SHA-256. The npm package is published from this workflow run with provenance.
capcomd 0.8.0
Local mode on Docker is now fast enough to use day to day. Each agent starts from a warm checkout baked into the agent
image instead of cloning, and only as many agents run at once as fit in Docker's memory. Desktop threads also open on
their newest messages. Checked with a live run before the release: three Claude Code agents ran on OrbStack with a Claude
plan login, two at a time, each starting from the warm checkout, and all three pushed their work.
- Desktop app: opening an agent's column shows its newest messages right away, even on very long threads (about
50 ms instead of up to 20 s on a thread of 6,000 items). Earlier messages load as you scroll up. - Desktop and menu bar apps: a column stuck on "Couldn't load the thread" while capcomd was unreachable now reloads by
itself as soon as capcomd is back. - API: a new route,
GET /v1/runs/{runId}/agents/{agentId}/thread/tail(capabilityagents.thread_tail), returns an
agent's newest thread items. It also returns cursors to page further back and to continue with live updates. - Local (Docker):
capcomd env build --sandbox dockernow keeps a warm checkout of your project in the agent image:
its full history with the dependencies installed. Each agent starts from it in place instead of cloning and copying
node_modules. On a repository the size of capcomd, 16 agents get their workspace in about 3 s instead of 18 s,
and each uses about 1.5 MB of disk instead of about 590 MB. Rebuild it when your target branch moves on or the
lockfile changes; until then, agents clone as before. - Local (Docker):
capcomd env statusandcapcomd doctorshow how many commits the warm checkout is behind your
target branch, and whether the lockfile has changed (agents then clone and install their own dependencies). They
also give the command that rebuilds it. - Local (Docker): capcomd only runs as many agents at once as fit in Docker's memory. Choose how much memory each
agent gets with Memory per agent in Local's details: 512 MB, 1 GB (the default), 2 GB or 4 GB. A change applies to
the next agent that starts, and Agents at once shows the new limit right away.CAPCOMD_DOCKER_AGENT_MEMORY_MB
still overrides the setting. Agents over the limit wait as pending and start as earlier ones finish. API: the Docker
sandbox has a newagentMemorysetting (appliesTo: new_agents) next to itsagentSlotsinfo row. - Local (Docker):
capcomd env build --sandbox dockernow moves your Claude Code and Codex plan logins onto the new
agent image, so their agents get the new CLIs and warm checkout without logging in again. Only the login's own files
are copied, and the agent image itself never holds a login. If a login can't be moved, it keeps working from its old
image, and the build says to runcapcomd auth login … --sandbox docker. - Fix: an agent's checkpoints no longer rewrite every unchanged file into git.
- Fix (Local): an agent that was paused, cancelled or failed before its container started no longer holds an
agents-at-once slot for 10 minutes.
Install
Needs Bun ≥ 1.4.0.
bun add -g capcomd@0.8.0
# or from this release's package:
gh release download v0.8.0 --repo MarvinAmador7/capcomd --pattern 'capcomd-0.8.0.tgz' && bun add -g ./capcomd-0.8.0.tgz
capcomd setupcapcomd-0.8.0.tgz.sha256 holds the package's SHA-256. The npm package is published from this workflow run with provenance.
capcomd 0.7.0
The desktop app (build it with apps/menubar/scripts/build-app.sh --desktop), goal branches (a run's reviewed work
lands on a branch of its own, and you choose at the end whether to open one pull request), and agents that name their
own tabs; also everything in 0.7.0-rc.1. Breaking: capcomd run <goal> now works on a goal branch
(--no-goal-branch for the old behaviour). Checked with a live run on boxd before the release: a planner, two workers
and a reviewer landed a goal on its branch from dev with no approvals, and the pull request into dev opened from it.
-
A goal branch's result lists each piece of work by its agent's title, in
capcomd goal, the apps' ready card and the
pull request's description. Work an agent continued from another (say, to fix a merge conflict) is listed once,
under the agent that carried it on, instead of also showing the first try as "merge failed". API: each landed and
not-landed entry ofGET /v1/runs/{runId}/goalcarriestitleandcontinues. -
Start a project from the desktop app: + (⇧⌘N) opens a new project column with the folder, the branch the work starts
from and the goal branch it lands on, the goal, Local or Cloud, the model and its effort, and Start. A folder that
isn't set up shows its setup steps in place. On Start the column becomes the planner's, and the crew's columns
appear as it spawns them. -
The desktop app's project menu: click the open project's name for its goal, repos and place, then Message the
planner (⌘L), Changes, Pause or Resume (⌥⌘P), Stop (asks first), Fold into the title bar (⌘W; a finished project
offers Remove from the title bar, which lasts until it has news, also across relaunches) and Copy run ID. ⌘K opens a palette of these actions, the other projects, New
project, Follow and the open project's agents by title. ⌘W folds the open project instead of closing the window. -
Agents name their own tabs. Each agent has a short title (1–4 lowercase words, e.g. "login redirect") that the
desktop app's crew tabs and column headers, the menu bar's rows, approvals and notifications show instead of id
fragments. Inside its VM an agent runscapcomd title "<words>"; a planner names its children withspawn --title
and the run withcapcomd title --run. An agent nobody named shows the first words of its task. Naming a tab
doesn't show up in the agent's thread or activity, and an agent that can't spawn names itself with a small local
capcomdthat makes no extra calls (capcomd reads the name from the agent's own commands). -
Rename an agent yourself by double-clicking its tab or its column header in the desktop app, or with Rename… on
its row in the menu bar. Your name stays until you clear it (empty the field); the agent's own name shows again
after that. From your own harness,capcomd title <runId> <agt> <words>and the MCP toolcapcomd_titlename an
agent, andcapcomd_spawntakestitle. -
The desktop app's column header reads "lead · login redirect · waiting on you" (no bot name), and a merge on the
menu bar's Active card reads "Merge work from into ?". -
API (capability
agents.title): agents carrytitleandtitleSource;PUTandDELETE /v1/runs/{runId}/agents/{agentId}/title; new eventsagent.titledandrun.titled;Run.titleSourcecan be
agent. -
The desktop app is called capcomd: in the menu bar, its About/Hide/Quit items and the Dock.
apps/menubar/scripts/build-app.sh --desktoppackages it ascapcomd.app(a regular Dock app). Its title bar shows each project by name only, without
the clock or status line under it. -
A desktop app (
CapcomdDesktop, a regular Dock app you can install without the menu bar one): the open project's
agents as full-height columns that stream their threads live, each with its own message box, and an agent's ask
docked at its column's foot (Approve ↩ / Deny; Return approves only the focused column's ask, Esc never denies).
Other projects fold into decks in the title bar (⌘1–9); ⌃1–9 and ⌃←/→ move between agents, and a sideways swipe
anywhere over the columns moves between them (scrolling up and down stays with the thread under the pointer). A
merge waits on the agent that asked for it (the lead or planner merging its child's work), so its Approve/Deny
docks on that agent's column. Follow (on by default,
⇧⌘F) scrolls to an agent that asks or fails, and scrolling yourself turns it off. A steer you send settles into the
thread, and one that failed offers Retry or Discard. The window says when capcomd can't be reached (and reconnects
by itself), when nothing is running, and when your token was refused. -
Fix: in the menu bar app, a long thread no longer opens on its oldest items and catches up over several seconds; it
shows once it has been read. -
API: agents have
createdAt, when they were spawned (null when unknown; older daemons omit it). -
API: a merge approval's
subject.askedBynames the agent that asked for the merge and waits on the decision
(requestedBy.agentIdstays the agent whose work merges); absent for an operator's merge. -
Breaking:
capcomd run <goal>with a planner (and every run the apps start) now works on a goal branch of its
own,capcomd/<goal-slug>, cut from--base(default: the project's target, else the repository's default branch;
never a guessedmain). Its agents' reviewed work lands there with no approval and no pull request per child, even
when the project merges by pull request. Pass--no-goal-branchto merge into the target as before. -
When the planner is done,
capcomd goal <runId>shows the goal branch against its base, what landed (with its
checks and review), what didn't and why, and the planner's summary.capcomd pr open <runId>opens one pull request
from it into the base with yourghlogin (capcomd never merges it);capcomd goal keep <runId>keeps the branch
without one.capcomd run new --goal-branch G --base Bstarts a scope on a goal branch; MCPcapcomd_run_newtakes
goalBranchandbase, and the new MCP toolscapcomd_goalandcapcomd_pr_opendo the same (your agent asks you
before opening a pull request). -
API (capability
runs.goal_branch):POST /v1/runstakesbaseandgoalBranch(a bad one is a 422 naming the
field); runs carrygoalBranch(its branch, base, state and pull request);GET /v1/projects/brancheslists a
checkout's branches for a base menu with a suggested base and goal branch;GET /v1/runs/{runId}/goalis the
finished branch;POST /v1/runs/{runId}/pull-requestand/keep-branchrecord the choice; new events
run.goal_completed,run.pr_openedandrun.branch_kept. -
As soon as you choose a project folder, the menu bar's composer shows the branch your run's work lands on and the
branch it starts from: the starting branch is preselected from the project, and when the project doesn't say you
pick it (nevermainby default). The branch name follows your goal as you type until you edit it, and a problem
with either name shows under its field. -
When the planner is done, the desktop app docks a card on the planner's column with its summary, what landed and
what didn't, and View diff · Keep branch · Open PR; the menu bar shows "Ready: " with the same actions, and
older runs in its Recent list show a "Ready" or "Stopped" flag while their branch waits on you. Afterwards you see
the pull request's link, or "Kept on ". -
capcomd notifies you once when a goal-branch run is ready ("Ready: → : 2 of 3 tasks landed") or
stopped with some work landed ("Stopped: …"); clicking it opens the run. It follows the same Settings switch as
finished-run notifications. -
When the planner failed or was cancelled, opening a pull request with what landed asks you first: in the apps, in
capcomd pr open(y/N on a terminal,--yesotherwise) and for agents (capcomd_pr_openwithstopped: true).
The pull request's description then says the run stopped. API:POST /v1/runs/{runId}/pull-requestanswers 409
stoppeduntil the body is{"stopped": true}, andGET /v1/runs/{runId}/goalcarries the question as
openPullRequest.confirm. -
Fix: capcomd no longer guesses
mainas a project's target.GET /v1/projects/inspectsendsdefaultBranch: null
when the checkout doesn't say,capcomd setup projectsuggests origin's real default branch, and running it again
keeps the target you set instead of resetting it tomain. -
Desktop window bench for coding agents (
apps/menubar/app/DESKBENCH.md):swift run -c release CapcomdDeskBench
hosts the desktop window on generated runs (1 to 64 agents, no daemon), drives it (open, project switch, reel steps,
jumps, swipes, thread bursts, typing, resize, Follow), measures frames, main-thread stretches and which views
re-rendered, judges the result against the SPEC §1 budgets, and compares builds within the machine's noise (run,
suite,ab,compare,profileunder Instruments,snapshot,explain;--jsoneverywhere, stable exit codes). -
The desktop bench shows where a slow stretch went and what changed between builds:
runsamples the main thread's
stack inside long stretches andexplainprints each one's top frames (--sampler offto disable;selftest samplerchecks it without a window);diff A Bcompares two time profiles as a call tree in ms per step. Results
record the exact build (commit, dirty flag) even for a copied binary.ab,compareandrun --baselinedecide on
main-thread CPU per step (--objective instructions|frames|latencyto change it), with frame metrics as guards and
late frames measured as ms of lateness per second.profilerecords the whole scenario, marks its results as
profiled (never compared: exit 6), and warns that.tracefiles hold private data and must never be committed.
The desktop app's views now live in the `Ca...
capcomd 0.7.0-rc.1
Release candidate: agents driven by a durable workflow inside the engine (no process per agent) that ride out a
sandbox provider outage, Rivet 2.3.31 with the engine's data under capcomd's home, and in the menu bar app: bots, run
titles, threads, Settings and the sandbox surface (place details, idle lifetime, Delete for machines left behind).
- The menu bar's Recent list shows each run by its title instead of "Done", with how it ended as an icon by its time
(merged, done, merge denied, merge failed, failed, stopped; hover it, or ask VoiceOver, for the words). The title is
the run's label when you (or the agent that started it, throughcapcomd_run_new) gave it one, else the title of
the pull request its work merged as, else a short form of the goal ("Add a multiply(a, b) function to
src/math.ts"), and it changes to the pull request's title once that lands. The goal shows under the title only when
the title doesn't already say it; hover a cut title for all of it. Active cards and the run view use the same titles.
The harness API's runs carry it astitleandtitleSource. - Fix: a sandbox provider outage of up to 10 minutes (boxd's API not answering, Docker's daemon restarting) no longer
fails running agents. They wait for their machine and carry on: an agent working in its VM keeps working, and the
agent shows a "sandbox_outage" notice while it waits, cleared once the provider answers. Calls that are safe to
repeat (looking up or creating a machine, uploads, renewals, deletes) are tried again with backoff; a command is never
run twice. An outage longer than that fails the agent witherrorKind: "sandbox_unreachable"andretryable: true
in its result ("the sandbox provider (boxd) didn't answer for 10 min …"), so you can run it again once the provider
is back. SetCAPCOMD_SANDBOX_OUTAGE_MSwherecapcomd serveruns to wait longer or shorter. Permanent errors (a
rejected key, a machine that doesn't exist, a quota) still fail at once. - Fix: an agent that fails no longer leaves its machine running until its idle lifetime runs out: it is deleted when
the agent fails. A delete the provider doesn't answer is tried again, with backoff, until the machine is gone. - Docker not answering ("Cannot connect to the Docker daemon") is now treated as an outage capcomd waits out, as
above, instead of failing the agent at once. - Fix: listing runs no longer creates empty runs in the engine. When your run list (
state/runs.jsonl) names a run
this engine doesn't have, for example one a test engine on another port recorded, the menu bar, the harness API and
capcomd_runsshow it as "unknown" with no agents. Before, every listing (twice a second while the menu bar is open)
quietly created an empty run in the engine for it. Reading such a run's agents, events, thread or approvals no
longer stalls for seconds either. - The live end-to-end scripts (
scripts/mac-subagents-e2e.sh,scripts/mac-agent-ops-e2e.sh) keep their runs out of
your run list, so the menu bar no longer shows them. They write their own index in the run's work folder and still
use your logins, environments, boxd key and settings. To do the same, setCAPCOMD_RUNS_INDEXto a file of your own. capcomd servenow opens the harness API only once its actors can answer, waiting at most 30 s. Before, the menu
bar's first requests after a restart could arrive before the actors were up and fail with warnings in the engine log.- Fix: a project's settings are looked for from the current folder up to your home folder and no further, even when
HOMEpoints somewhere else (a test or an agent's scratch home); capcomd's own~/.capcomd/config.jsonwas read as
a project's.capcomd/config.jsonthen, so its sandbox and repository settings applied where they shouldn't. - Agents are now driven by the engine itself: each agent runs as a durable workflow inside
capcomd serveinstead of a
separatecapcomd agent-driveprocess per agent. An agent carries on by itself when the engine restarts (nothing has
toawaitit to get it going again), a usage-limit pause wakes at its reset from the engine,capcomd awaitwaits
for change events instead of polling, and a dozen running agents no longer cost a dozen extra processes. The settings
that change how an agent runs (CAPCOMD_SPAWN_EXEC, scripted agents'CAPCOMD_SCRIPT_*, the agents file) are taken
from the shell that spawned it, as before. If something goes wrong, start the engine with
CAPCOMD_AGENT_WORKFLOW=0to get the old per-agent processes back (this escape hatch is kept for one release);
set it wherecapcomd serve(or the background service) runs: every command follows the engine's mode and says so
if its own setting differs. Design and limits: docs/adr-022-agent-lifecycle-workflow.md. - capcomd's engine data now lives in capcomd's own folder:
~/.capcomd/engine/<port>/db(or$CAPCOMD_HOME/engine/<port>/db)
for every port, the default 6420 included, instead of rivetkit's shared~/.rivetkit, which any other project
using Rivet on your Mac also writes (a newer one could stamp the database so capcomd's engine refused to start).
capcomd no longer reads or writes~/.rivetkitat all; rivetkit's own engine logs go to
~/.capcomd/engine/<port>/.rivetkit/. The first time the new version starts on 6420 it copies your existing data
from~/.rivetkit/var/engine/dbonce (it never moves or deletes it: you can remove the old folder yourself once
you're happy), checks the copy and prints one line saying so; if an engine is still running on the old folder it
refuses with a sentence saying to stop it first. capcomd also records which engine version last opened its data
(engine-version.json): before a different version opens it, it copies the database to
~/.capcomd/engine/<port>/backups/<old version>-<UTC time>/(the newest three are kept; restore by putting its
db/andengine-version.jsonback), it refuses to start on data a newer engine already opened, naming both
versions and the newest backup, and when the engine doesn't come up it prints the engine's own last log lines.
The engine is Rivet 2.3.31 (from 2.3.27), which keeps scheduled wake-ups (lease expiry, machine reaping, quota
resets) across engine restarts. - Menu bar app: Active cards are redesigned. While nothing needs you a card is one line: the agents' faces, who is
doing what ("worker is editing 2 files") and how long the run has been going. When an approval waits, the card
opens to the question ("Merge worker's work into main?"), who asked and who is waiting on it, the files it lands with
lines added and removed, and View diff, Deny and Approve ↩ (Return approves while the card has focus; Esc
never denies). A failed agent opens the card to the lines that say why, with Open thread and Hide; agents
stopped at a usage limit say when they pick up again, with Resume now. The chevron shows the agent tree. The
newest finished run tops the Recent list with how it ended: "Merged into main" (or "Merge denied" when you denied
it), files and lines, whether its checks passed, and what it cost when API spend was billed. The cards also read in
light mode. - Harness API: a merge waiting for approval now says what it would land.
approval.requestedandsnapshot.approvals
carrysubject.files(path, status, lines added and removed; the 20 biggest changes),subject.filesTotal,
subject.addedandsubject.removed, read when the merge was parked; snapshot approvals also carryrequestedAt.
An agent'sresultrecords how its merge ended (merge: target and merged, failed or denied) and, when its checks
failed, how (verification.checks.reason) and the lines of the check output that name the failure
(verification.checks.excerpt).capcomd merge --jsonof a parked merge includes the samediff. - Menu bar app: the folder picker (+ › Choose Project Folder…, and Choose… in Settings › Runs) opens in front of
other apps' windows and keeps the folder you pick; it could open behind the app you were using, and the first click
in it closed it with no folder. After you pick a folder the menu bar panel opens again on what the folder needs. - Menu bar app: set a project up right in the composer. Pick a folder with + › Choose Project Folder…: a capcomd
project is used at once as before; any other folder gets an orange dot on its chip and, in place of the tool row, what
it needs next. A GitHub checkout shows its repository, the target branch, how changes land (pull requests, or pushes
when the GitHub CLI isn't logged in, with Log In…), the agents that can work on it, and a spend cap when one of
them would bill an API key where your runs go; edit any of them in place and press Set Up, or Set Up and Start
when you've already typed a goal. A folder that isn't a git checkout offers Initialize Git; a checkout with no
remote offers Publish to GitHub (pick the account or organization, the name and Private / Public; it says first if
the first commit would include files that look like secrets), then goes straight into the setup. A checkout on
another host offers Open in Terminal forcapcomd setup project, and any folder Choose Another Folder….
Cancel, the chip's × or Esc go back to the project you had; new runs never move until the folder is set up.
Needs a capcomd withprojects.setup(andprojects.gitfor Initialize Git and publishing); with an older one, a
picked folder is used as before. Settings › General has a new Keep .capcomd/ out of git switch (off by default):
projects you set up from the app from then on get.capcomd/added to their .gitignore. - Harness API: take a plain folder all the way to a GitHub project from the menu bar app (capability
projects.git).
POST /v1/projects/git-initstarts a git repository (git init -b main, no commit...
capcomd 0.6.0
Stable release of 0.6.0-rc.2, with no code changes since it: agents in Docker containers, capcomd tui in the CLI,
and capcomd setup fixes (boxd key, project checkout). See 0.6.0-rc.2 below for the details. The live Mac e2e
(scripts/mac-subagents-e2e.sh) was skipped for this release by owner decision.
Install
Needs Bun ≥ 1.4.0.
bun add -g capcomd@0.6.0
# or from this release's package:
gh release download v0.6.0 --repo MarvinAmador7/capcomd --pattern 'capcomd-0.6.0.tgz' && bun add -g ./capcomd-0.6.0.tgz
capcomd setupcapcomd-0.6.0.tgz.sha256 holds the package's SHA-256. The npm package is published from this workflow run with provenance.
capcomd 0.6.0-rc.2
Release candidate: agents in Docker containers, capcomd tui in the CLI, and capcomd setup fixes (boxd key, project checkout).
capcomd setuprun outside a git checkout (your home directory, say) now asks for the path to your project's
checkout and offers that repository'soriginas the repository, as it does when run inside one. Before, it asked
for a repository URL with no default and saved the project's settings in the current directory, which from your
home directory meant capcomd's own config. Without a terminal, it says to runcapcomd setup projectin the
repository; it never writes project settings into capcomd's own config.capcomd tui [runId]opens the terminal debugger: the run's agents live, a waterfall of what each did, a timeline,
cost rollups and events (--viewpicks the first tab). With no runId it opens the latest run. Before, it ran only
from a git checkout (apps/tui); it now ships with the CLI and the single executable.capcomd setupcan create its boxd key again: it failed with "org not found" because the boxd CLI rejects
keys create --orgfor your active org. Setup now leaves--orgout there (the key is fenced to that org anyway);
for another org it says toboxd auth switchfirst.- Running capcomd from inside a boxd machine (an agent like Hermes on boxd) no longer needs a
BOXD_API_KEY: when
the machine has credentials of its own,capcomd setupand preflight say so and use them. An explicit key still
wins. Agent VMs never get such credentials: capcomd only ever runs agents in isolated VMs, which boxd refuses them
to, and now refuses to use a VM that isn't isolated. - capcomd can now run agents in Docker containers on your machine instead of boxd VMs:
CAPCOMD_SANDBOX=docker
(Docker Desktop, OrbStack, Colima or Podman's docker).capcomd env buildbakes the agent CLIs into a local image
and the engine removes expired containers. Differences from boxd: a container instead of a VM, an API key reaches
the agent in its environment (plan logins are unaffected), and no egress allowlist (a profile that setsegressis
refused). See docs/providers.md.
Install
Needs Bun ≥ 1.4.0.
bun add -g capcomd@0.6.0-rc.2
# or from this release's package:
gh release download v0.6.0-rc.2 --repo MarvinAmador7/capcomd --pattern 'capcomd-0.6.0-rc.2.tgz' && bun add -g ./capcomd-0.6.0-rc.2.tgz
capcomd setupcapcomd-0.6.0-rc.2.tgz.sha256 holds the package's SHA-256. The npm package is published from this workflow run with provenance.