v0.1.5
Added
- swe-mux now ships an agent skill, embedded in every install.
swemux --skillprints
the copy matching the running release, andswemux install-skillwrites it into the skill
directories agent CLIs actually read - two writes inside a checkout cover every registered
harness, with no third-party tool and no registry. The skill teaches an agent the
in-session environment check and where the current contract lives (the mux MCP tools, or
swemux --help); it deliberately enumerates no commands, so it cannot go stale between
releases. Installing into the per-user skill roots, which reach every agent you run
anywhere, prints the exact paths first and proceeds only under--yes;--removetakes
back only files the installer can recognize as its own. - A PyPI install can now gain the tray, the native window, and shortcuts without
reinstalling. Settings → General → Desktop integration installs or removes the Start
Menu and Desktop shortcuts, and acquires the desktop shell's dependencies on one press -
about 2.4 MB, verified against pinned hashes on the same path that fetches the speech
libraries, never anything without an explicit press. One of those dependencies publishes
no wheel at all, so the acquirer gained a pinned-sdist case with a strict rule: the
archive is extracted, never built - nothing from it is ever executed, and an sdist that
would need a build step is refused. The tray starts inside the desktop app, so after
acquiring you launch (or restart)swe-muxonce; every surface says so. On platforms
with no desktop app the whole group is simply absent. - First run now asks how much swe-mux should do. Three experience tiers, phrased as
three genuine products: pure terminal (real terminals, nothing watching - no hooks, no
status detection, no fleet plumbing), deterministic (transcripts, live status, managed
harnesses, the agent fleet surface; model-free), and automations (adds the scan timeline
and the model-backed observers, under your budgets). A tier is a batch of defaults,
never a lock: everything it turns off stays one switch away, the choice is re-applyable
and reversible from Settings → General, and existing installs are never stamped with a
choice they did not make. - The empty workspace now offers three first steps instead of nothing. A quest log on
the empty stage points at the three setups that cannot finish in one screen: voice
(opens the guided setup), isolated worktrees, and connecting a phone. It is capped at
three by design - it will never become a todo list - the voice entry completes itself
when voice is set up, and dismissing an entry is permanent, on every device. - Voice setup is now a guided walk. Settings → Voice gains "Guided setup" (also in the
command palette and by voice: "set up voice"): pick the engine, watch the one-press
download's three progress lines, test the microphone where a permission prompt is
visible and explained, and hear one spoken sentence at the end. Every step drives the
same controls Settings already has, so nothing new can drift. - The side panel's default density follows the chosen tier. A pure-terminal install
opens with five panel tabs (Actions, Files, Notes, Git, Alerts) instead of ten; the
agent-layer tabs stay one right-click away, exactly as before. Only a device that has
never touched the panel visibility menu follows the tier default - any choice you have
made, including showing everything, is never overwritten. - Agents can be handed the skill automatically, per harness. A new "Fleet access"
control in Settings → Harnesses phrases the choice as capability - may agents in this
harness's sessions see the fleet, and how do they learn they can - with MCP tools, the
skill file, both, or neither. The two routes are deliberately not symmetric and the
control says so: for Claude the skill travels as a session-scoped plugin from the mux
data directory and nothing is written into your Projects, while for codex, pi, omp, and
opencode it is written into the Project's.agents/skills/at session start, because
those CLIs read skills from nowhere else. Automatic delivery is off by default -
swe-mux does not write into your checkout unasked - and turning it off later stops the
writes without deleting anything.
Changed
- A session row now reports the whole time that session has worked, not just the length of
its current turn - the sum of every completed turn the record was willing to report, so a
measurement it refused as "the last turn" is not quietly admitted into the total either.
Context is also coloured on a finer ramp: the old one's first step arrived at 70%, by which
point the decision it exists to inform - carry on in this thread or start a fresh one - has
already been made for you. - The account switcher's quota figures line up. Each provider's rows now sit under one set
of headed columns rather than being printed as a sentence per account, so several accounts can
actually be compared against each other. The Git drawer's refresh also shows that it is
reading rather than appearing to have finished.
Fixed
-
A transcript's Copy and Select controls no longer sit on top of the timestamp they were
meant to clear. They were drawn at rest on every reply, sized against a gutter that predated
the read-aloud markers. They now appear when asked for: on hover or keyboard focus with a
pointer, and one at a time by tapping with a finger, which has no hover. -
The daemon starts tens of seconds faster when its database has grown large.
Every start used to re-verify the whole ofmux.dbbefore serving anything - a full-file
read whose cost is the size of the file, measured at 60-84 seconds of every cold start
against a 3.36 GB database, more than the entire rest of the startup sequence. The full
verification now runs only when it can tell you something new: after the previous daemon
died uncleanly (a crash or an external kill - the one signal that says the file's history
is suspect), or when the last passing check is more than 24 hours old. Every other start
runs a milliseconds header-and-schema probe instead, which still catches the
gross-corruption class that used to stop the daemon coming up at all, and still quarantines
a bad file before anything opens it. The trade, stated plainly: a corrupted page deep
inside a cleanly-managed file can now go unnoticed for up to a day rather than until the
next restart. Each start logs which check it ran and why, and deleting
mux.db.last-verified.jsonbeside the database forces a full check on the next start.
Full changelog: https://github.com/jatoran/swe-mux/blob/v0.1.5/CHANGELOG.md