Skip to content

Releases: amterp/muster

Muster 0.14.0

Choose a tag to compare

@github-actions github-actions released this 06 Oct 03:29

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 with muster 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 --confirm checks 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, muster asks 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 new and 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 themselves waiting and a muster pane wait --until idle on 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, then claude plugin update muster@muster; for Codex, codex plugin marketplace remove muster, then muster 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 now muster msg join --name X, and X takes 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 KEY presses keys a dialog reads, so an agent can answer a dialog
    with something other than its highlighted option: --key down --key down --enter gets 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 --enter with
    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's muster msg, while the devenv is attached. Changing its members or
    policy still runs on the devenv.
  • A muster msg verb 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_SOCKET naming 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 a msg read that refused it.
  • muster msg join says 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 disconnected in 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 was group add by pane.
  • The daemon no longer takes Codex's Linux sandbox helper for a nested Codex, which refused a
    Codex agent's own report --waiting on 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_SOCKET is stale or unset reaches the window that holds it. With
    several windows answering, pane send, pane wait and pane close were refused, and a pane on
    a devenv with no $MUSTER_SOCKET found 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 join to 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

Choose a tag to compare

@github-actions github-actions released this 04 Oct 18:34

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 = false in
    config.toml stops 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 opus comes back as claude --model opus --resume <id>. So far that is Claude Code, with its plugin's hooks up to date
    (see the next item). resume_agents = false brings 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, then claude plugin update muster@muster. If you installed it from a checkout of this repository, run claude plugin marketplace remove muster, then muster harness install claude-code, to install it from the
    adapters bundled with the app instead.
  • The numbered chords' actions are numbered_chord_1 to numbered_chord_9. A [keymap]
    naming focus_pane_N, or the older focus_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 new no longer switches to the tab it makes, and the keyboard stays in the pane
    it was in, as the command's help always said. --focus switches 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 the blocked state'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 that muster takes.
  • 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 --down does the same.
  • Go back and forward through the panes the keyboard has been on, across tabs and machines,
    with cmd+opt+[ and cmd+opt+], the mouse's back and forward buttons, or muster focus --back
    and --forward.
  • Two new chords. cmd+shift+r renames a tab, and cmd+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,
    the compact_pane action, or muster pane compact. compact_at = 80 in config.toml has
    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 80 ends when
    an agent gets that full.
  • muster pane read --turn reads what an agent printed in its last turn, and nothing from the
    turn before.
  • muster msg post --urgent reaches 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/codex and
    extras/opencode, as Claude Code's hooks do: working, blocked and idle, with context and model.
    muster harness install codex or opencode installs one. Messages now wake both at their
    prompts, adapter or not, and an idle Codex holding a draft is woken with codex queue, which
    leaves the draft alone.
  • muster harness install claude-code (or codex, opencode) installs a harness's adapter
    through the harness's own plugin command, from the adapters now bundled with the app;
    --dry-run prints the commands. A devenv gets the adapters when Muster installs its daemon
    there. muster window and 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, as muster msg open --group G does.
  • muster msg group delete deletes a group and its log.
  • human_name in config.toml sets the name messages show beside @human, which is your
    login name unless set.
  • muster window --layout draws 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 --watch it redraws
    whenever the arrangement changes. muster window --watch lines now end with each pane's label,
    and muster window says each machine's swatch color.
  • Windows from the CLI: muster window close, muster window list --closed, and muster window reopen NAME. muster window new --daemon ID starts the new window on that machine, and
    --tab TAB moves that tab into it. A global --window NAME says 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 = true hides 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 -p run 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 read no 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

Choose a tag to compare

@github-actions github-actions released this 29 Sep 04:56

Behaves differently

  • cmd+1 to cmd+9 go to a tab, and the next press goes to a pane inside it. Keep cmd down
    after cmd+2 and press 3 to 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 was numbered_chords = "tab_then_pane", and it is now the only scheme: the old one, where cmd+3 was the third pane
    down the whole agent list, is gone. A config naming numbered_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 N goes to the pane muster window prints at place N, counted down the
    whole window. With tab_then_pane set it used to act as cmd+N and 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 its id, so it is the same in every window; a
    color in its [[daemon]] block picks another when two machines land on the same one.
  • muster msg post --to reaches 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@machine names
    one on a particular machine, and group add finds 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 msg in 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, so muster window in a pane there could reach a window that had quit.
  • A ControlMaster auto in your ~/.ssh/config can no longer take over Muster's connection to
    a devenv.
  • A devenv daemon Muster adopts gets its muster CLI when the machine has none, so muster 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

Choose a tag to compare

@github-actions github-actions released this 28 Sep 21:20

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, or cmd+shift+a when it is the most urgent thing
    asking, opens the group's transcript: a tab running muster 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 = false takes the banner away.
  • muster msg log --follow keeps printing a group's messages as they arrive, until
    interrupted, and with --json prints one line per message.
  • Groups can have a policy. muster msg group new G --policy F makes 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 set replaces it but leaves a pause alone, group add and group remove
    change the members, groups --json shows 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 G holds a group's wakes without losing a message: its posts wake nobody
    but you until muster 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.json reads 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 over muster msg, with directed.toml and roundtable.toml to 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 review on the devenv joins the review made 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, and group remove review critic@devenv removes a member on the other machine. muster docs msg has 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 log shows whether.
    After a daemon restarts, read and log answer for a group kept elsewhere, saying they may be
    behind, until the link returns, and log --follow waits 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, join with 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 @human reaches 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 msg refuses log --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 --to someone 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

Choose a tag to compare

@github-actions github-actions released this 28 Sep 14:51

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 daemons lists each old daemon as herdr, 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.toml here, and ~/.muster/herdr/ and ~/.muster/bin/herdr on 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" report gives 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-code is 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 window shows the same, and --json adds reported,
    unreadable, facts, progress and rang.
  • cmd+shift+a goes 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 --asking does the same from a pane.
  • Programs' own notifications (OSC 9 and OSC 777) raise a banner in the program's words.
    [notifications] programs silences 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_terminfo and ssh_env carry the terminal to machines you
    ssh to 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 waiting waits for an agent to settle into waiting.

Behaves differently

  • Eight chords are Muster's now, as they are in Ghostty. cmd+k clears the screen, cmd+a selects the
    pane's text, cmd+home and cmd+end scroll to the top and bottom, cmd+pageup and cmd+pagedown scroll a
    page, and cmd+shift+up and cmd+shift+down jump 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 idle no longer returns for an agent that is waiting on its own work. Add waiting
    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 N counts 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 send exits 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 --run hands 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_multiplier also scales what a program such as less is sent for the wheel.

Fixed

  • A config written in place, as printf > config.toml or some editors do, is picked up.
  • MUSTER_HOME moves the run log too.
  • The agent list's marks follow a switch between light and dark.
  • A muster pane read of more than a mebibyte of text works.

Agents messaging each other

  • muster msg lets 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 that muster pane new just made, whether or not it
    has started; join, read, who, log, leave and wait do the rest, and muster docs msg covers 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. post says 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-permissions holds each wake for approval unless it was also started with
    --settings '{"crossSessionInbound":"accept"}'.
  • An SSH machine gets a muster of its own, at ~/.muster/bin/muster, installed beside its daemon so that
    agents there can message each other. Every pane there finds it on its PATH, even where a login profile such as
    Debian's /etc/profile resets PATH, 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. muster run 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

*...

Read more

Muster 0.9.0

Choose a tag to compare

@github-actions github-actions released this 25 Sep 06:05

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

Choose a tag to compare

@github-actions github-actions released this 13 Sep 23:18

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

Choose a tag to compare

@github-actions github-actions released this 13 Sep 21:47

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

Choose a tag to compare

@github-actions github-actions released this 08 Sep 04:42

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

Choose a tag to compare

@github-actions github-actions released this 04 Sep 12:48

Apple Silicon, macOS 14 or newer. Notarized and stapled.

brew install amterp/tap/muster

sha256 9eb79d42128b6189d431474e16a916f5079ff377db57edd1f7bc37587d36331f

Full Changelog: v0.5.0...v0.6.0