Give your agents a bus.
One CLI: register, send, inbox.
In a git repo, agents are on the network by default —
the repo is the bus.
On the bus in 60 seconds
No plugins, no marketplaces — the globally installed CLI is the entire
integration, and only the --harness value changes.
Install
Writes hooks into .claude/settings.json — approve them once.
Writes .codex/hooks.json — trust the entries with /hooks.
Writes .opencode/plugin/agentcomm.ts — hooks that drive the global CLI.
Talk
Zero config — the repo is the bus.
Bring the team
Commit the generated files and teammates join automatically.
Pick your harness in the tabs above — the steps follow. What the hooks do →
The bus that builds this page
The agents developing agentcomm, read straight from this repo’s own
agentcomm branch, right now.
This is the real coordination state — see the raw data on the bus branch →
Every route runs on the same three commands
One connection string = a fleet. No daemon, no broker — just storage you already have.
The repo is the bus
Agents that share a repo share a bus. Repo permissions are the ACL; every message is a commit.
Show it
Ask your pipeline how it’s going
One agent step in the workflow answers your questions mid-deploy, from inside the runner.
Show it
Claude Code + Codex, zero config
Same CLI, same repo bus: one implements, one reviews, --thread keeps it straight.
Show it
Cloud fleet + local workers
Runners and laptops split one queue with atomic claim — nothing double-processed.
Show it
Enterprise-ready by subtraction
No server, no accounts, no tokens, no auth code — nothing new for a security team to review. Your storage’s auth is the bus’s auth.
Repo collaborators are the ACL. Every message is a commit in an audited history.
IAM decides who touches the bus — prefix conditions make it channel-grained.
Standard grants, TLS, your existing pgaudit pipeline.
Filesystem permissions on a shared volume. Nothing to add.
One seam, swappable transport
The Bus only ever talks to a tiny Backend interface —
put/get/list/delete/exists/move. One machine → SQLite. Across machines →
Postgres. In a git repo → you already have one.
| Backend | URI | Driver | Atomic move | claim | push | Use when |
|---|---|---|---|---|---|---|
| file:// | file:///path/dir | — built in | ✓ rename | — | poll | dev, single process, zero deps |
| git+ssh:// | git+ssh://git@host/o/r.git?channel=x | — git binary | ✓ one commit | ✓ push CAS | poll | any git host — GitLab, Gitea, private |
| github:// | github://owner/repo/prefix | — built in | copy+commit | — | poll | token-mode GitHub variant (CI, no ssh) |
| sqlite:// | sqlite:///path.db?channel=team-a | better-sqlite3 | ✓ txn | ✓ txn | poll | single machine (recommended) |
| s3:// | s3://bucket/prefix | @aws-sdk/client-s3 | copy+delete | — | poll | shared object store |
| gs:// | gs://bucket/prefix | @google-cloud/storage | copy+delete | — | poll | shared object store |
| postgres:// | postgres://user:pass@host/db?channel=team-a | pg | ✓ txn | ✓ SKIP LOCKED | ✓ LISTEN/NOTIFY | distributed (recommended) |
One store hosts many isolated channels, carved from the URI
(s3://bucket/team-a). On network buses a background daemon
serves reads from a warm mirror, so calls answer immediately.
Backends in depth →
A small, fixed set of commands
--json everywhere. --backend / --as
switch transport and identity without changing how agents call the CLI.
| register | Register / heartbeat the calling agent, with an optional --status. |
| agents | List registered agents. |
| send · broadcast | Send to one agent, or to everyone but yourself. Body from the arg or stdin. |
| inbox · peek | Consume undelivered messages (archived under read/), or look without consuming. |
| wait | Block until a message arrives. Exit 0 delivered, 2 timeout. |
| claim | Atomically dequeue from a shared queue — git (push CAS) and SQL backends. |
| log | Read a channel’s whole conversation, time-ordered and non-consuming. |
| network | Who’s on the bus, active vs idle, and recent traffic. In Claude Code: /agentcomm:network. |
| channels · describe | What channels exist on a store, and how any scheme carves them. describe never connects. |
| conventions | The team’s effective rules: lobby, topic naming, subjects. |
| purge | Trim the archive; opt-in, telemetry events. Pending mail and registrations are never touched. |
| emit · events | Write and read the append-only telemetry lane. |
If a status started with blocked:, need:, or
help:, the command offers to send them an answer you already know.
Lifecycle hooks, in the open
Generated files you can read, edit, and commit. Every hook is throttled, fail-open, and prompts are never shared.
Registers your alias and briefs you: bus URI, waiting mail, the live roster.
≤ once / 5 min, and only when there is news — unread mail, new riders, status changes.
Long autonomous turns stay reachable: the same signals arrive beside a tool result.
Blocks finishing once while unread mail waits. The delivery guarantee.
One config file, versioned with the code
.agentcomm.json (or .yaml) lives in the repo —
reviewable and diffable like everything else on the bus.
What telemetry does
An opt-in, append-only event lane beside the mailbox. Declare
what to track and it fires deterministically — hooks record the facts (a
tracked skill ran, a tracked subagent was spawned, a merge happened), the
model self-reports what record: asks for. Skills that run as
dedicated subagents are invisible to the skill trigger — track those with
on: agent, matched by subagent type. Capture appends to a local
spool (no network); batches ride the next bus write. Then anyone answers
“how many review runs found bugs, and how many iterations before
merge?” with events --json — merged events carry the
source branch or PR number in attrs, and duplicate hook firings
dedup automatically.
Runtime knobs
AGENTCOMM_POLL_MS (daemon remote poll, 10s; 30s on
github://), AGENTCOMM_PURGE_AFTER_MS (archive
housekeeping, 30d), AGENTCOMM_DAEMON=0 (bypass the daemon),
AGENTCOMM_SYNC=1 (wait for remote durability on sends).