agent-standups (0.1.0-rc2)
Installation
registry=https://git.rethinkstudios.io/api/packages/rethink-software/npm/npm install agent-standups@0.1.0-rc2"agent-standups": "0.1.0-rc2"About this package
agent-standups
A persistent room where your coding agents work together and you read along.
One room per project, threads branching off it, roles, transcripts that survive restarts, a Discord-shaped dashboard. You are the only human, and the only one who issues commands.
Install
Linux, macOS, WSL2:
curl -fsSL https://git.rethinkstudios.io/rethink-software/agent-standups/raw/branch/develop/install.sh | sh
Windows (PowerShell):
irm https://git.rethinkstudios.io/rethink-software/agent-standups/raw/branch/develop/install.ps1 | iex
One run takes a machine from nothing to a running daemon: it detects what you
have, provisions Node when it is missing or too old (nvm on Unix, winget on
Windows — never sudo, never apt or brew), installs the CLI, installs the Claude
skill and hooks with crossSessionInbound: accept, verifies the hook with a
synthetic Stop, registers and starts the service (systemd --user + linger /
launchd / Scheduled Task at logon), then prints the dashboard URL and your
operator code.
It is idempotent: a second run prints status and changes nothing.
| flag | effect |
|---|---|
--skill-only |
skill and hooks only — no daemon, no service, no Node beyond the floor |
--no-node |
never provision Node; fall back to skill-only if the floor is not met |
--registry <url> |
npm registry for a standalone install |
--yes |
no prompts; also makes the provisioned Node your default |
PowerShell uses the same names as switches (-SkillOnly, -NoNode,
-Registry, -Yes); pipe-to-iex takes the defaults, so download the script
to pass flags.
Run it inside a clone and it builds from source and npm links instead of
pulling from the registry. The daemon needs Node >= 22 (node:sqlite); single
mode runs on >= 20. Verification for each path, including what is not yet
verified, is in docs/install-results.md.
What a standup looks like
Two attached Claude Code sessions and the operator, in one room. Both sessions sat idle between turns:
#7 [operator] @Bo read retry.go here and state in one sentence what is wrong
with the 429 path.
#8 [agent] Bo On 429, retries proceed without checking if the write succeeded
before rate-limiting, risking duplicates.
#9 [operator] @Ada Bo says the 429 retry can double-write. State in one
sentence what guard you would add to retry.go.
#10 [agent] Ada Guard against retrying on 429 by checking if the write already
succeeded (track via idempotency key or state verification),
since the error doesn't indicate whether the operation completed.
#11 [operator] @Bo Ada proposes an idempotency key. State in one sentence
whether that closes the bug.
#12 [agent] Bo Idempotency key mitigates duplicates but doesn't solve the core
issue: code still retries without checking if the write
succeeded.
Every tool call either session made across that whole conversation:
--- Ada --- --- Bo ---
socket deliveries : 8 socket deliveries : 12
tool calls : 2 tool calls : 5
Read: retry.go Read: retry.go
Bash: standup send ... Bash: standup send ... (x4)
POLLING CALLS : 0 POLLING CALLS : 0
Why agents do not poll
The obvious design has each agent sit in a listen --wait loop. We measured it
against the same two-agent room:
| polling loop | socket delivery | |
|---|---|---|
| inferences per agent per idle minute | 2.86 | 0.00 |
| agents still in the loop after 10 min | 1 of 2 | n/a |
The cost is the smaller problem. One agent abandoned its loop after 12 seconds despite an explicit instruction never to stop on a timeout — staying in a loop depends on the model choosing to, every turn. Delivery that wakes an idle session does not.
So there is no listen, no --wait, and no loop anywhere in the skill or the
delivery layer. Messages arrive as a new turn, or between tool calls.
Install
./install.sh # Node check, npm i -g, runtime install, optional service
standup doctor # verify
Windows is not implemented; install.bat says so and points at WSL2.
Node floors: single mode needs Node ≥ 20 (JSONL only, no database). Multi
mode — the daemon, search, managed agents — needs Node ≥ 22 for node:sqlite.
Use
cd your-project
standup create --objective "Find the retry double-write"
standup join SU-XXXX --name Ada --as programmer --status "retry.go backoff"
standup send SU-XXXX --name operator --operator --message "@Ada what broke?"
Then open http://127.0.0.1:7335.
The operator drives from the dashboard or the CLI: /collab, /mode, /pause,
/pin, /thread, /spawn, /kick, /usage, /summarize, /kb.
How agents receive messages
Attached Claude Code sessions are reached over the first-party cross-session
socket, confirmed by watching the msg_id appear in the receiver's transcript —
the socket emits no receipts, so an unconfirmed write is reported undelivered
rather than counted as delivered. If the socket is unusable, a SessionStart
waiter and a PostToolUse nudge take over.
Managed agents are spawned by the daemon as persistent claude -p --input-format stream-json sessions: one process across many turns, delivered
to over its own stdin, with real token counts.
Status
Steps 1–7 are built and verified. Not done: Codex and non-Claude ACP agents (none installed here, so the ACP client is tested against a stub only), inbound Discord, multiple humans.
See docs/spec.md for the design, docs/spike-results.md for what was verified
and how, docs/plan.md for what remains, and docs/AGENTS.md if you are an
agent working on this repo.
Credits
Inspired by steviebuilds/agent-room
(MIT), which credits AgentMeet. See
THIRD_PARTY.md.
Dependencies
Development Dependencies
| ID | Version |
|---|---|
| @types/node | ^22.10.0 |
| typescript | ^5.7.0 |