Repository navigation
Releases: genkio/herdlet
Release list
herdlet 0.10.0
Five fixes in the daemon and pane-addressing layers. The coordination protocol is unchanged.
- One daemon per socket. Concurrent auto-starts (parallel hooks) could bind several daemons to one path, because
asyncio.start_unix_serverunlinks an existing socket before binding.servenow holds anflockon<socket>.lockfor its lifetime, binds the socket itself, and unlinks only the inode it bound. - Waits are pinned to the occupant they started on. Records carry an
instancethat bumps when an id moves to another pane, or to the same pane number on another tmux server. A re-registered id can no longer wake a waiter that was waiting on the old one.--prefixwaits stay unpinned. - Hook reports are retried.
hookretries once (1 s, then 2 s) and logs a lost report to~/.herdlet.loginstead of dropping it silently. sendinto a bare shell works again. A shell pane has no TUI input box, so verified send refused it with exit 6. It now types the line unverified and says so on stderr. TUI panes without an input box still exit 6.- Pane ids are per tmux server. Records carry the server socket, and every pane operation (peek, send, approve, resume, kill, the
limitedsweep,list) uses the record's server, so a daemon on server A never reads or kills a same-numbered pane on server B.
Restart the daemon after upgrading: pkill -f 'herdlet.*serve', then any herdlet command. Old persisted records gain the new fields at read time.
herdlet 0.9.0
spawnstarts codex workers (--agent codex), reads rollout transcripts, and knows the codex usage-limit wording. New--allowpre-seeds the worker allowlist, and an approval policy per spawn.sendserializes submissions per pane, waits for the input box to clear, verifies the submit, and--ackreports back. It refuses to type on a menu (exit 6) or over a draft that does not clear (exit 4).--no-enterimplies--no-verify.approve --choice <text>picks the menu option by meaning, not by digit, and marks the workerworkingonly while the record still showsblocked(compare-and-set on state and timestamp).- Right-stack pane layout for spawned workers;
ack --kill-panecloses only stale panes (a live worker behind a shell wrapper survives;--forceoverrides); compact events.
Restart the daemon after upgrading: pkill -f 'herdlet.*serve', then any herdlet command.
herdlet 0.8.0
pair / unpair: a scoped peer channel between two workers. A worker can send only to a paired peer (or to what it spawned); every other target exits 3. Each peer send appends one line under ## Thread in the topic file and emits a peer_send event on watch.
Restart the daemon after upgrading: pkill -f 'herdlet.*serve', then any herdlet command.
herdlet 0.7.0
Six friction points found while orchestrating a 12-hour herd, plus a version
guard. All of it is additive: no subcommand or flag was renamed or reordered.
herdlet spawnlaunches a Claude Code worker in one command: it splits
your own pane, pins--modeland--effort(both required, so a worker can
never inherit your priciest model by accident), mutes per-turn notifications,
keeps the pane readable, and registers the worker asspawningbefore its
first hook fires. That last part closes the pre-registration blind spot: the
worker is addressable by name from t=0, including while it sits on a trust
prompt. With--brief PATHit takes the title from the brief's first heading
and sends the workerRead <brief> and do it.once it is up.- A
limitedstate. An agent parked on a usage-limit banner fires no hook,
so its record used to sayworkingforever and every waiter on it ran to
timeout. The daemon now reads the last 8 non-blank lines of eachworkingor
spawningworker's visible pane every 30 seconds and reportslimitedwhen it
sees a real banner. Add it to your waits:--state done,blocked,limited. The
pattern matches Claude Code's own wording;HERDLET_LIMIT_PATTERNoverrides it
andHERDLET_LIMIT_SWEEP=0turns it off. herdlet peek --transcriptreads the worker's own transcript file instead
of scraping its screen, and prints the last N assistant messages verbatim.
A pane capture wraps, scrolls and hides a full-screen TUI's history; the
transcript is the real text.herdlet send --file PATH(-for stdin) takes a message from a file,
and anything multi-line or over 200 characters is now delivered as one
bracketed paste instead of being typed character by character. A long message
can no longer be cut in half by the Enter that follows it, and tmux's 16 KiB
command-line ceiling is out of the way.wait --timeout-okturns a timeout into a result with exit 0 instead of
an error with exit 2. Use it in harnesses that read a background command's
exit code as a failure, such as Claude Code's background Bash. Default
behaviour is unchanged, so the documented chunked-wait loop still works.
approve --waittakes the flag too, where it only changes the exit code.- PreCompact awareness.
herdlet getnow showscompacts, how many times
an agent has compacted its context. A worker on its second compaction has
already lost detail: that is your signal to end its phase and hand over to a
fresh worker. State and message are untouched by a compaction. - Version guard. Every command except
hookwarns on stderr when it finds a
daemon older than itself, with the command to restart it. Thelimitedsweep
and thecompactscounter live daemon-side, so an old daemon silently serves
the old behaviour.
After upgrading, restart the daemon so the daemon-side features are served:
pkill -f 'herdlet.*serve' and then any herdlet command. Agents re-register on
their next hook event and the registry survives the restart.
herdlet 0.4.2
herdlet 0.4.1
herdlet 0.4.0
herdlet 0.1.1
Initial release: coordination bus for coding agents in tmux panes. Semantic agent state (idle/working/blocked/done), push-based wait/subscribe, hook adapter for Claude Code and Codex, send/peek pane I/O helpers, live monitor TUI for tmux popups.