Repository navigation
Releases: amterp/muster
Release list
Muster 0.14.0
Behaves differently
- A zoom fills the whole tab, whatever machines its panes are on. Zooming a laptop pane in a
tab beside devenv panes used to fill only the laptop's part. Unzooming brings every machine's
part back at its width. One gap remains: move the keyboard to another machine's pane while
zoomed, from the agent list or withmuster pane focus, and that machine's part comes back, with
the zoom covering only its own part again. - A right-click selects the word under the pointer and opens the pane's menu, as in Ghostty.
Over a program that reports the mouse, a right-click still goes to the program, and a
shift-right-click opens the menu. muster pane send --confirmchecks that the send changed the pane. Text already on screen
no longer passes for text delivered: a send confirms once its text shows more times than
before, or once the pane changes and still shows it. A send of only keys or Return must change
the pane. A spinner changes the pane too, so this proves the pane changed, not that the send
changed it.- A window that takes a command and does not answer within 2 seconds is passed over. Before
sending,musterasks each window it could use what it is showing; a window that stays silent
is sent nothing, and the machine's daemon answers instead, saying so on stderr. While a laptop
sleeps, a command run from a devenv pane costs 2 seconds rather than hanging for two minutes.
pane newand other verbs only a window can carry out give a window 10 seconds, then exit 3
with nothing sent. - Agents are told that waiting for a message or a person is just ending the turn. The hook
line Claude Code's and Codex's adapters give each session used to read as covering a message,
so agents declared themselveswaitingand amuster pane wait --until idleon them never
ended. Only work the agent started, such as a build or a sub-agent, is a wait to report. An
installed adapter keeps the old line until updated: for Claude Code,claude plugin marketplace update muster, thenclaude plugin update muster@muster; for Codex,codex plugin marketplace remove muster, thenmuster harness install codex. - An agent that names itself in a group keeps its place, across restarts. A pane added to a
group by its pane id can nowmuster msg join --name X, andXtakes over its membership in
every group, here and on linked machines. The change is written to each group's log as the pane
leaving and the name joining, so it survives a daemon restart, where it used to revert.
New
muster pane send --key KEYpresses keys a dialog reads, so an agent can answer a dialog
with something other than its highlighted option:--key down --key down --entergets past
Claude Code's folder-trust dialog. Codex's dialogs have not been tried yet. Keys are
spelled as in[keymap]:--key esc,--key 2,--key ctrl+c. A send's text goes first,
then each key, then Return.muster pane send --enterwith
no text presses Return alone.- Right-click a group in the agent list's Messages to leave or delete it. Leave Group takes it
off your list; Delete Group asks first, then deletes the group and its log for every member. - The human on the laptop can delete, pause and resume a group kept on a devenv, from the
agent list or the laptop'smuster msg, while the devenv is attached. Changing its members or
policy still runs on the devenv. - A
muster msgverb starts this install's daemon when none is running, as the app does,
and says so on stderr. A window opened later uses that daemon. A sandbox that refuses the
daemon's socket, or a$MUSTER_DAEMON_SOCKETnaming another daemon, starts nothing. - A member removed from a group can still read what was posted before its removal, once, so a
dismissal reaches it. Its wake used to point at amsg readthat refused it. muster msg joinsays which groups the name is in. Taking over the name of a session that
had gone lists the groups that came with it, and the command to leave one.
Fixed
- Right-click opened no menu over a pane, in any window, so the pane menu and Split on
Machine were unreachable from the mouse. - A window opened after its daemons connected said
disconnectedin its title, though both
were connected. muster msg post --to <pane>reaches a pane on another machine whose agent joined under a
name. It was refused as nobody by that name, and so wasgroup addby pane.- The daemon no longer takes Codex's Linux sandbox helper for a nested Codex, which refused a
Codex agent's ownreport --waitingon a devenv. The helper's name comes from Codex's binary;
the fix has not yet been run against a Codex on a devenv. - A pane whose
$MUSTER_SOCKETis stale or unset reaches the window that holds it. With
several windows answering,pane send,pane waitandpane closewere refused, and a pane on
a devenv with no$MUSTER_SOCKETfound no window at all. - A sandbox refusing Muster's socket is reported as that, naming Codex's
network_access
setting, where it used to say the window had quit. - A refused
msg jointo a group kept on this machine leaves your name as it was. It used to
rename you before the group's policy refused the join. A join to a group kept on another machine
still renames you first.
Under the hood
- The daemon protocol is 1.4, and agent detection engine 13: an agent's manifest can name the
helper processes its harness runs under other names (helpers), which are not taken for nested
agents. Muster hands the 0.13.0 daemon's panes to the new one on the first launch after
updating, on the laptop and on a devenv, so running agents keep running.
Apple Silicon, macOS 14 or newer. Notarized and stapled.
brew install amterp/tap/muster
sha256 f024502cc099bbbb74965138c2dd20f7fd664bc86560698b5ff0901aa7339b5d
Full Changelog: v0.13.0...v0.14.0
Muster 0.13.0
Behaves differently
- Every window is a window of one app. Each window used to be its own process. Now
cmd+q
quits them all, and the next launch reopens every window that was open, with the one you last
used in front. On the first launch after updating, window processes left from an older Muster
are asked to quit, and their windows open in the new app. - Closing a window keeps its tabs. Close it with its close button or the new
cmd+shift+w,
and Window > Reopen lists it by name to bring back. Launching Muster again while it runs opens a
window in the running app rather than a second copy. - Naming a pane names its agent's session. Muster types
/rename <name>at the agent's prompt
once it is idle and its prompt is empty, which Claude Code and Codex take. In the other
direction, a session renamed in its harness renames the pane.name_sessions = falsein
config.tomlstops Muster typing into your agents. - An agent comes back after its daemon restarts. After a crash, a reboot or an upgrade that
could not hand panes over, a pane whose agent had reported its session comes back running that
session. It keeps the flags it was started with:claude --model opuscomes back asclaude --model opus --resume <id>. So far that is Claude Code, with its plugin's hooks up to date
(see the next item).resume_agents = falsebrings such panes back as shells, as before. The
window now says when a daemon restarted, which agents it resumed and which it could not, and the
warning stays until each of those panes has an agent again or is closed. - Update the Claude Code plugin if you installed it before this release. Its hooks now report
the session's id, which resuming after a restart needs. An installed plugin keeps its old hooks
until updated:claude plugin marketplace update muster, thenclaude plugin update muster@muster. If you installed it from a checkout of this repository, runclaude plugin marketplace remove muster, thenmuster harness install claude-code, to install it from the
adapters bundled with the app instead. - The numbered chords' actions are
numbered_chord_1tonumbered_chord_9. A[keymap]
namingfocus_pane_N, or the olderfocus_tab_N, is refused, and the whole file with it,
saying the new name; rename them. The menu items are "Tab or Pane 1" to "Tab or Pane 9". muster tab newno longer switches to the tab it makes, and the keyboard stays in the pane
it was in, as the command's help always said.--focusswitches to it.- The context ring's color moves with the fill, from grey when empty to red when full, where
it used to turn orange at 80%. Orange is theblockedstate's color, so a full ring no longer
looks like an agent waiting on you. - The pointer is an I-beam over a pane's text and a hand over a link. The link under it shows
its address at the pane's bottom left, so an OSC 8 hyperlink can be read before opening it.
New
- Right-click menus on a pane, a tab's caption and an agent's row. A pane can be split any
way, or onto any attached machine, zoomed, moved to a tab of its own, renamed, compacted or
closed. A tab can be renamed, moved to another window, closed, or given a new tab beside it on
any machine. Each menu copies the pane or tab id thatmustertakes. - Drag a pane by the handle at its top onto another pane's edge to put it on that side, half
and half, as in Ghostty.muster pane move --onto PANE --downdoes the same. - Go back and forward through the panes the keyboard has been on, across tabs and machines,
withcmd+opt+[andcmd+opt+], the mouse's back and forward buttons, ormuster focus --back
and--forward. - Two new chords.
cmd+shift+rrenames a tab, andcmd+ctrl+=makes every pane in a tab the
same size. - The Help menu searches every action, and Select Pane Asking is greyed out while no pane is
asking. - Compact an agent's context with Compact Agent in the Pane menu and the right-click menus,
thecompact_paneaction, ormuster pane compact.compact_at = 80inconfig.tomlhas
Muster compact an agent once it reports its context 80% full; it is off unless set, and acts
only on agents whose adapter reports context. Either way the compact command is typed once the
agent is idle and its prompt is empty, never mid-turn.muster pane wait --context 80ends when
an agent gets that full. muster pane read --turnreads what an agent printed in its last turn, and nothing from the
turn before.muster msg post --urgentreaches an agent while it works. The message is typed into the
agent's prompt box, and Claude Code and Codex take what is typed there into the running turn
after the current tool call. It still waits out a dialog, a draft or a blocked agent.- Codex and OpenCode can report their own state, through adapters in
extras/codexand
extras/opencode, as Claude Code's hooks do: working, blocked and idle, with context and model.
muster harness install codexoropencodeinstalls one. Messages now wake both at their
prompts, adapter or not, and an idle Codex holding a draft is woken withcodex queue, which
leaves the draft alone. muster harness install claude-code(orcodex,opencode) installs a harness's adapter
through the harness's own plugin command, from the adapters now bundled with the app;
--dry-runprints the commands. A devenv gets the adapters when Muster installs its daemon
there.muster windowand the agent list say when a pane's agent has an adapter that is not
reporting.- The agent list shows your message groups under a Messages caption, with how many messages
are unread in each and an @ while any are addressed to you. Choosing a group opens its
transcript, asmuster msg open --group Gdoes. muster msg group deletedeletes a group and its log.human_nameinconfig.tomlsets the name messages show beside@human, which is your
login name unless set.muster window --layoutdraws every tab as boxes, including tabs not on screen and tabs in
closed windows, each pane with its state and its size in cells. With--watchit redraws
whenever the arrangement changes.muster window --watchlines now end with each pane's label,
andmuster windowsays each machine's swatch color.- Windows from the CLI:
muster window close,muster window list --closed, andmuster window reopen NAME.muster window new --daemon IDstarts the new window on that machine, and
--tab TABmoves that tab into it. A global--window NAMEsays which window any command is
about. - A problem at the foot of the agent list can offer a button that fixes it, such as Reattach
for a pane left blank. - A
[[daemon]]block added to the config attaches when you save it, with no relaunch, and so
does a corrected block whose machine never attached. A removed block, or one changed after its
machine attached, waits for a relaunch, and the agent list says so. - An agent-detection override in
~/.muster/agent-detection/applies when you save it, rather
than at the next launch. hide_pointer_while_typing = truehides the pointer while you type in a pane, as in
Ghostty. It is off unless set.
Fixed
- Claude Code's plan approval dialog reads as blocked. The agent could read idle, then done,
while the dialog waited on you. - An agent that starts several seconds after its command is recognized. One that started
about eight seconds in, just as Muster stopped looking, never was. - A message posted to Codex as it starts is no longer lost.
- An idle agent whose screen never stops moving is now woken by messages, such as one with an
animated statusline. - Claude Code's statusline reports context, model and cost on a devenv without
jq, where it
used to report nothing. - A
claude -prun from inside an agent's pane can no longer report that pane idle mid-turn,
nor clear its agent's context and model. - A row's number in
muster pane readno longer changes as old rows are trimmed from the
scrollback. - Starting the laptop's daemon can no longer hang Muster, which a rare race could make it do.
- A daemon that can never start is reported once, rather than retried forever under a warning
promising its panes were on their way. - A first window opens on the machine the config names first, rather than whichever local
daemon answered first. - A pane that stays untypeable is reported once, rather than again, reopening the problem box
you had put away, each time Muster reconnected it.
Under the hood
- The daemon protocol is 1.3. Muster hands the 0.12.0 daemon's panes to the new one on the first
launch after updating, on the laptop and on a devenv, so running agents keep running. - A pane in a tab nobody is looking at no longer draws, and the agent list redraws a changed row
in place rather than rebuilding it, which matters most in a window holding many tabs.
Apple Silicon, macOS 14 or newer. Notarized and stapled.
brew install amterp/tap/muster
sha256 c458665a5722bc742d63806b359dcf8dfffad98788430fe12797bf39850bace1
Full Changelog: v0.12.0...v0.13.0
Muster 0.12.0
Behaves differently
cmd+1tocmd+9go to a tab, and the next press goes to a pane inside it. Keepcmddown
aftercmd+2and press3to land on that tab's third pane; let go to stop at the tab. A window
holding one tab still numbers its panes, one press each. This wasnumbered_chords = "tab_then_pane", and it is now the only scheme: the old one, wherecmd+3was the third pane
down the whole agent list, is gone. A config namingnumbered_chords = "panes"is refused, and
the whole file with it, saying what replaced it; delete the line. One naming"tab_then_pane"
still loads. Every row in the agent list shows the chord that reaches it.muster focus --place Ngoes to the panemuster windowprints at place N, counted down the
whole window. Withtab_then_paneset it used to act ascmd+Nand reach the Nth tab.
New
cmd-click a link in a pane to open it, an address on the screen or an OSC 8 hyperlink. Web
and mail links open on this Mac, from a devenv pane too. A path opens only from a pane on this
Mac, since from a devenv it names a file over there. A file that would run code when opened, or
a link hiding invisible characters, is refused with a beep, and a hyperlink to another app's
scheme asks first.- Drag the agent list's edge to make it wider or narrower, from 140 to 480 points. Each window
remembers its own width across a relaunch. - A color swatch on each row says which machine a pane is on, while a window is attached to
more than one. A machine's color is drawn from itsid, so it is the same in every window; a
colorin its[[daemon]]block picks another when two machines land on the same one. muster msg post --toreaches an agent or a pane on another machine with no group shared
first, making the group of exactly those members as it does on one machine.name@machinenames
one on a particular machine, andgroup addfinds members the same way.- A group's policy can name a member on another machine as
name@machine, in its ring, allow
and membership, so a devenv agent can direct a council kept on the laptop, or join a group whose
membership is not*. muster msgin your own shell on a devenv does what it does on the laptop. While the devenv
is linked to the laptop, reading, waiting, joining and posting there are carried to the laptop
and done as you, instead of being refused with a pointer to the laptop.
Fixed
- A slow ssh check no longer drops every devenv pane. A check that times out is asked again
before Muster ends the connection; only a second timeout in a row ends it. - Devenv panes come back as soon as a reconnect lands, rather than about 15 seconds later.
- Quitting ends Muster's ssh connections, and a starting Muster ends ones an earlier Muster
left running. A left-over connection kept the old window answering on the devenv, somuster windowin a pane there could reach a window that had quit. - A
ControlMaster autoin your~/.ssh/configcan no longer take over Muster's connection to
a devenv. - A devenv daemon Muster adopts gets its
musterCLI when the machine has none, somuster msg
works in its panes. - The agent list's chord digits are readable at a glance, in light and dark appearance.
Under the hood
- The daemon protocol is 1.2. Muster hands the 0.11.0 daemon's panes to the new one on the first
launch after updating, on the laptop and on a devenv, so running agents keep running.
Apple Silicon, macOS 14 or newer. Notarized and stapled.
brew install amterp/tap/muster
sha256 3951ac857d061bf9787d4a683ef7a7df912726159e930105c8e7875573220094
Full Changelog: v0.11.0...v0.12.0
Muster 0.11.0
New
- A message for you raises a notification. An agent's post to
@human, or an unaddressed post
in a group whose policy rings you, raises a banner naming the group and who wrote; chatter
between agents raises nothing. Choosing it, orcmd+shift+awhen it is the most urgent thing
asking, opens the group's transcript: a tab runningmuster msg log --group G --follow, or the
one already running it. Going there counts as reading the group, and the banner comes down.
Messages posted while Muster is closed wait, and notify when a window opens.[notifications] messages = falsetakes the banner away. muster msg log --followkeeps printing a group's messages as they arrive, until
interrupted, and with--jsonprints one line per message.- Groups can have a policy.
muster msg group new G --policy Fmakes a group whose policy, a
TOML file, says whom an unaddressed post wakes, whom each author may address, and who may change
the group.group setreplaces it but leaves a pause alone,group addandgroup remove
change the members,groups --jsonshows each group's, and a refusal says what the policy
allows. Every change is a line in the group's log. A group with no policy lets anyone do
anything, as every group did before. muster msg pause Gholds a group's wakes without losing a message: its posts wake nobody
but you untilmuster msg resume G, which wakes each member once for what it has unread.- A Claude Code session can fetch its own messages with hooks instead of having the wake typed
into its pane.extras/claude-code/messaging-hooks.jsonreads any new message after each tool
call and, when a turn ends, waits for the next wake that is due. Merge it into the session's
settings, or pass it with--settings. A session whose turn ends without its Stop hook, at an
API error or Esc, is rung for what it has unread, as any agent in a pane is. - A council skill,
extras/skill/council/, for several agents and you working one question
together overmuster msg, withdirected.tomlandroundtable.tomlto convene one with from
your own shell. - Agents on your laptop and on a devenv share groups of messages. While a window is attached to
both machines,muster msg join --group reviewon the devenv joins thereviewmade on the
laptop, a post on either wakes whoever it is for on the other, and the guard against posting
unread holds across the two. Each machine names the other's agents with that machine's name, as
critic@devenv. The devenv's name for the laptop is chosen when they first link and kept from
then on: on a Mac, the computer's name from Sharing settings, which a new network does not
change. A group's policy holds for posts from either machine, andgroup remove review critic@devenvremoves a member on the other machine.muster docs msghas the rest. - A group kept on the other machine says when it cannot be sure. With no window attached to
both, a post, join or leave for the other machine's group fails at once, naming the machine, and
groups kept on each machine work as ever. A post, join or leave the other machine took but never
answered exits 4,unanswered, and says it may have landed:muster msg logshows whether.
After a daemon restarts,readandloganswer for a group kept elsewhere, saying they may be
behind, until the link returns, andlog --followwaits for it. A post here for a member on a
machine that cannot be reached is delivered when the link returns, and exits 0. While a machine
linked to earlier is down,joinwith a bare name is refused,unchecked, rather than making a
group here that hides the one there. - There is one of you, on the laptop. A devenv post meant for you notifies through the
laptop's window, and an agent on the devenv that posts to@humanreaches you in a group you
have joined. Your own shell on the devenv is you as well: from it you can post in and change a
group kept there that you are in, and anything else is refused, naming the laptop to run it
on.
Behaves differently
- The new verbs need the new daemon. Between updating Muster and the app's next start, the
0.10.1 daemon is still running.muster msgrefuseslog --follow,wait --due,join --pull
and the group verbs against it and says to update Muster, rather than sending requests that
daemon would misread. - The guard never holds your own post. An agent is refused a post while it has unread
messages in the group; you are not, since you read the transcript as it arrives.
Fixed
- Panes made before Muster was quit and opened again drive the new window. Their
muster
said the window had quit; it now reaches whichever window holds the pane, on the laptop and on
a devenv. On a devenv where you run two installs of Muster, a pane made by 0.10.1 may reach the
other install's window.
Not there yet
- A post
--tosomeone on another machine, you included, needs a group you have both joined. - A group whose policy names who may join it cannot yet be joined from another machine.
- Messages name you
@human; a display name of your own is not built.
Apple Silicon, macOS 14 or newer. Notarized and stapled.
brew install amterp/tap/muster
sha256 604eedee5c0554ce85fb252bbdd0fb879acfdc4899e048e071e50bbc5af64514
Full Changelog: v0.10.1...v0.11.0
Muster 0.10.1
Muster now runs its own session daemon, muster-daemon, in place of herdr. Read this before updating: the
panes you have open now do not carry over.
- Your open panes stay with the old daemon. The herdr daemon an earlier Muster started keeps running after you
update, and so does everything in its panes, but no window of this Muster can show them. Finish that work before
you update. - Your windows come back without their tabs. Each window's size and place, whether its agent list was open, and
the SSH machines it was attached to are read from the old arrangement. The tabs are not, since they lived in
herdr. muster daemonslists each old daemon asherdr, with the command that ends it:
kill $(lsof -t <socket>). Ending one ends every pane it holds.- On an SSH machine, the old herdr under
~/.muster/herdr/keeps running too. Muster installs its new daemon
beside it the first time you attach, with nothing for you to install.pkill -f "$HOME/.muster/herdr/"on that
machine ends the old one and its panes, and leaves alone any herdr you run yourself. - What the old daemon left behind is read by nothing once it has ended:
~/.muster/cache/herdr/and
~/.muster/state/herdr.tomlhere, and~/.muster/herdr/and~/.muster/bin/herdron an SSH machine. - An agent is recognized by
$MUSTER_AGENT, where it was$HERDR_AGENT. Detection rules are built into Muster
rather than fetched, and~/.muster/agent-detection/still overrides them. - A pane on an SSH machine no longer inherits
SSH_AUTH_SOCK. It named the agent forwarding of the connection
that started the daemon, which ends when that connection does.
New
- Sessions survive a daemon restart as far as they can be written down: tabs, pane names, directories, sizes
and settings come back, each pane with a fresh shell. A process cannot be written down, so a pane's program and
its scrollback do not. - Updating Muster keeps your agents running from now on. A new Muster that finds an older muster-daemon asks it
to hand its panes to the new one, processes and all. Since 0.9.0 had no muster-daemon, the first update this
helps with is the one after this. - A pane can be
waiting: an agent that ended its turn to wait on its own work, a build or a gate, rather than
on you."$MUSTER_DAEMON" report --waiting "<what>"declares it, and the agent list shows it in its own color
([colors] agent_waiting). - Agents can report on themselves.
"$MUSTER_DAEMON" reportgives a pane its agent's own state and facts:
context used, sub-agents, model, cost. A fresh report outranks what the screen suggests.extras/claude-codeis a
Claude Code plugin that reports this way, installed from a checkout of this repository. - The agent list shows more: a ring for context used, a count of sub-agents, a bell, a progress bar, and a mark
on an agent whose screen Muster cannot read.muster windowshows the same, and--jsonaddsreported,
unreadable,facts,progressandrang. cmd+shift+agoes to the pane most urgently asking for you, in this window's tabs or a closed window's:
blocked first, then a program's notification, then done, the longest waiting first within each. It walks every
pane the agent list shows as asking, including one whose banner[notifications]mutes, since a mute silences
the banner and nothing else.
muster focus --askingdoes the same from a pane.- Programs' own notifications (OSC 9 and OSC 777) raise a banner in the program's words.
[notifications] programssilences the banner. - Programs that ask for the mouse get it: vim with
mouse=a, htop and the like see clicks, drags and motion.
Shift-drag still selects. - Programs can set the clipboard with OSC 52.
clipboard_write = "deny"stops them. Reading the clipboard is
never offered. - Pasting several lines into a program that cannot tell a paste from typing asks first, since each line would
run as you pasted it. - Panes are Ghostty terminals:
TERM=xterm-ghostty, with the terminfo entry Muster carries, and Ghostty's
shell integration for bash, zsh and fish.[shell] ssh_terminfoandssh_envcarry the terminal to machines you
sshto from a pane. - Keymap actions for scrolling to the top, the bottom and by page, jumping between prompts, selecting all,
clearing the screen and resetting the terminal. A Ghostty action name in[keymap]is refused with the name of
Muster's own. muster pane wait --until waitingwaits for an agent to settle into waiting.
Behaves differently
- Eight chords are Muster's now, as they are in Ghostty.
cmd+kclears the screen,cmd+aselects the
pane's text,cmd+homeandcmd+endscroll to the top and bottom,cmd+pageupandcmd+pagedownscroll a
page, andcmd+shift+upandcmd+shift+downjump between prompts. If your config's[text]or[keymap]
already puts something on one of them, yours keeps it, and that action goes without a shortcut. muster pane wait --until idleno longer returns for an agent that is waiting on its own work. Addwaiting
to the list to hear of that too.- A window opens even when none of its daemons answer. It waits a second for them, then opens and says which it
is still connecting to and why, and keeps trying. A daemon that arrives later puts its tabs back where they were
without taking the keyboard. An SSH machine that does not answer is given 15 seconds a try, rather than the
minute or more a connection otherwise waits. - A recognized agent's own notifications raise no banner, since its done and blocked states already say the
same thing. A bell raises none either: it marks the pane's row until you look. muster pane read --rows Ncounts back from the last row with anything on it, so a quiet pane at a prompt
answers with text rather than blank rows, and asks the daemon for only those rows. A whole read reaches up to
4 MiB of a pane's newest text, where herdr handed back a thousand rows.- Find is Ghostty's own, over everything the pane's surface holds, rather than the last thousand rows.
- Muster keeps working while nobody looks. macOS no longer naps it when its windows are hidden or the screen is
locked, which is when agents drive it hardest; under a heavy build a pane read took 13 seconds. muster pane sendexits 1 when nothing could be queued, such as while its daemon is disconnected, where it
exited 0. The text arrives as a paste, fenced when the program asked for that.muster pane new --runhands the command to the new shell as it starts, rather than typing it after the
prompt, and the pane stays open in a shell when the command exits.- Exit 4 means a daemon gave no answer for ten seconds, where the window gave it half a second.
- Right and middle click no longer select a word or paste. They reach a program that asked for the mouse, and
otherwise do nothing. scroll_multiplieralso scales what a program such aslessis sent for the wheel.
Fixed
- A config written in place, as
printf > config.tomlor some editors do, is picked up. MUSTER_HOMEmoves the run log too.- The agent list's marks follow a switch between light and dark.
- A
muster pane readof more than a mebibyte of text works.
Agents messaging each other
muster msglets agents on one machine post to each other and be woken when a message arrives, in place of
typing into another agent's pane. A message of any length arrives whole, and nobody waits in a loop for it.
muster msg post --to <pane>reaches the agent in a pane thatmuster pane newjust made, whether or not it
has started;join,read,who,log,leaveandwaitdo the rest, andmuster docs msgcovers them.
It talks to the daemon rather than a window, so it works with no window open.- An agent is woken with one line, never the message, and ten messages arriving while it works cost it one
wake. A post is refused while its author has unread messages in that group, so nobody answers what they have
not read.postsays who was woken, and exits 6 when nobody who could hear it was there. - The doorbell wakes an agent in a pane by typing that line into its prompt, and only into a Claude Code prompt
the daemon has just read as empty, with nothing typed into the pane for three seconds. A dialog, a menu or a
prompt holding a draft is never rung; the wake waits until the pane allows it. An agent of any other harness in
a pane is not woken, and the post says its prompt cannot be read. - A Claude Code session outside any pane is woken through its inbox instead. One started with
--dangerously-skip-permissionsholds each wake for approval unless it was also started with
--settings '{"crossSessionInbound":"accept"}'. - An SSH machine gets a
musterof its own, at~/.muster/bin/muster, installed beside its daemon so that
agents there can message each other. Every pane there finds it on itsPATH, even where a login profile such as
Debian's/etc/profileresetsPATH, and a daemon that was already running gets the command at its next
install. - A pane on an SSH machine drives the window it is drawn in.
musterrun there makes, types into, reads,
waits on and closes panes on either machine, focuses tabs and posts messages, as it does in a laptop pane. The
window forwards its socket back over the ssh connection it already holds, so nothing needs setting up. - Not there yet: an agent on an SSH machine and one on your laptop cannot share a group, Muster does not notify
you of messages, and groups have no policy but the permissive default, where every member reads every message.
Apple Silicon, macOS 14 or newer. Notarized and stapled.
brew install amterp/tap/muster
sha256 7bfd34ccfbfad8c6acfd586ef185a43dcf59f4416605d393a5381f3492d09c17
*...
Muster 0.9.0
Apple Silicon, macOS 14 or newer. Notarized and stapled.
brew install amterp/tap/muster
sha256 011f6615a5d0a040c6397970caf8ea07f1f807271d7444a859a7b15af445364c
Full Changelog: v0.8.1...v0.9.0
Muster 0.8.1
Apple Silicon, macOS 14 or newer. Notarized and stapled.
brew install amterp/tap/muster
sha256 b3e4cf7a6ac834d9e6cdbccec09b2f114ec5578feb36813f1baebd34e95cb86c
Full Changelog: v0.8.0...v0.8.1
Muster 0.8.0
Apple Silicon, macOS 14 or newer. Notarized and stapled.
brew install amterp/tap/muster
sha256 b3934e9cbd5126d57f48dddcfca552280d292ed2abb67b6a681e63968e63fd78
Full Changelog: v0.7.0...v0.8.0
Muster 0.7.0
Apple Silicon, macOS 14 or newer. Notarized and stapled.
brew install amterp/tap/muster
sha256 467db38c528d73ae88f4634704da78fabc32038ff51287c3a40dbf3f8da8209f
Full Changelog: v0.6.0...v0.7.0
Muster 0.6.0
Apple Silicon, macOS 14 or newer. Notarized and stapled.
brew install amterp/tap/muster
sha256 9eb79d42128b6189d431474e16a916f5079ff377db57edd1f7bc37587d36331f
Full Changelog: v0.5.0...v0.6.0