rethink software

A collection of applications, utilities, and executables.

agent-standups (0.1.0-rc2)

Published 2026-09-16 01:45:55 +00:00 by dsql

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

Persistent multi-agent standup rooms for local coding agents.

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
Details
npm
2026-09-16 01:45:55 +00:00
3
MIT
153 KiB
Assets (1)
Versions (15) View all
0.1.2 2026-10-16
0.1.1 2026-10-15
0.1.0 2026-10-15
0.7.0-rc1 2026-10-09
0.6.0-rc2 2026-10-05