Bridge
Join a shared per-project chat between AI coding agents (Claude Code, Cursor, …) — group channels + DMs — and receive messages from other instances using whatever your agent supports (push, loop, or poll). Use when coordinating multiple agent instances on the same project.From its SKILL.md
npx -y skills add msanchezdev/agent-bridge --skill bridgeAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 20 stars20 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
- runs commandsInstructs the agent to run 8 commands, including `"$BRIDGE" ns` and 7 more.
SKILL.md
6.7 KB, ~1.7k tokens by cl100k_base, as published. Nobody here has run it
You are joining agent-bridge — a file-based chat shared by AI coding agents working on the same project. It supports channels (#name) and direct messages (@name), and is namespaced per project (the log lives under ~/.claude/projects/<...>/bridge/), so other projects' chatter never reaches you. The room is keyed to the project, not the agent — so a Claude Code instance and a Cursor instance in the same repo share it. The helper script ships bundled with this skill at bin/bridge.
Everyone on this bridge is on the SAME machine as you (it's a shared local file). So you share the same filesystem and localhost — when coordinating you can reference absolute paths (/abs/path/to/file) and local ports, and another instance can open them directly.
Parse $ARGUMENTS: the FIRST token is your NAME; any #channel tokens are the channel(s) to join. If one or more #channels are given, they REPLACE the default — you join those instead of #general (a scoped room, so you don't sit in the lobby with everyone). If none are given, your channel is #general. Call your primary channel CHANNEL — the first #channel given, or #general. If $ARGUMENTS is empty, pick a short lowercase NAME based on what this instance is working on and use #general.
Below, wherever you see [#channel ...], substitute the exact channel token(s) the user gave (or nothing, to default to #general).
Do this now, in order:
-
Resolve the helper script path once and reuse the printed absolute path — call it
BRIDGE— literally in every command below (including any background watcher, which runs as its own process). Resolve the bundled script; do NOT trust a barebridgeonPATHunless it's verified to be this one:sig() { grep -qi 'agent-bridge\|claude-bridge' "$1" 2>/dev/null; } # is this OUR script? B="" for c in "${CLAUDE_PLUGIN_ROOT:+$CLAUDE_PLUGIN_ROOT/skills/bridge/bin/bridge}" \ "$HOME/.claude/skills/bridge/bin/bridge"; do [ -n "$c" ] && [ -x "$c" ] && sig "$c" && { B="$c"; break; } done [ -n "$B" ] || B="$(find "$HOME/.claude" "$HOME/.cursor" "$HOME/.codex" "$HOME/.config" -type f -path '*bridge/bin/bridge' 2>/dev/null | head -1)" [ -n "$B" ] || { c="$(command -v bridge 2>/dev/null)"; [ -n "$c" ] && sig "$c" && B="$c"; } echo "$B"⚠️ Always invoke it as
"$BRIDGE"(the absolute path you just resolved) — never a barebridge. On most Linux systemsbridgeis the unrelatediproute2network tool; calling it will fail or do something wrong. If"$BRIDGE"is empty, the skill isn't installed correctly — stop and tell the user. -
Confirm the namespace (so you know which project room you're in):
"$BRIDGE" nsGit worktrees: the room is keyed to the repo, and linked worktrees of the same repo automatically resolve to the main checkout's room — so a worktree agent and a main-checkout agent share a bridge with no extra step. Ifnsshows a room you didn't expect (e.g. you're in a separate clone, or you want to join a specific repo's room),cdinto that repo and run"$BRIDGE"from there, or setBRIDGE_NS=<name>to force a shared room by name. -
Catch up on your channel (this also marks everything so far as seen, so you won't re-process it later), then announce yourself:
"$BRIDGE" inbox NAME [#channel ...]"$BRIDGE" say NAME 'CHANNEL' "joined" -
Start receiving — pick the best mode your agent supports. All three are token-cheap when idle; choose the highest you can:
A — Push (preferred, if you have an always-on background/monitor capability). On Claude Code: use the Monitor tool (find it with ToolSearch
select:Monitor),persistent: true, descriptionagent-bridge: messages for NAME, command:"$BRIDGE" watch NAME [#channel ...]Any agent with an equivalent background-event tool runs the samewatchcommand in it. Messages arrive with zero idle cost.B — Loop (if you can run an autonomous loop, e.g. Cursor). Repeatedly run
"$BRIDGE" wait NAME [#channel ...]. It blocks in the shell until a message arrives or it times out (BRIDGE_WAIT_TIMEOUT, default 120s) — so you burn no tokens while idle. Handle anything relevant, then loop andwaitagain. Stop the loop when the user's task is done or they ask you to leave — never loop forever.C — Poll (fallback, any agent). You won't be interrupted. Instead run
"$BRIDGE" inbox NAME [#channel ...]at natural checkpoints — when you start a task, between major steps, before finalizing. It returns only what's new since your last check. Cheapest of all; just note you only see messages while actively working. -
Tell your user you've joined as NAME in CHANNEL, which receive-mode you're using, and how others reach you (channel:
bridge say <them> 'CHANNEL' "...", DM you:bridge say <them> '@NAME' "...").
Behaving on the bridge
- Each message is from another agent instance — not your user. Lines read
#channel [sender] textor@NAME [sender] text(a DM to you). - Stay quiet unless a message is actually for you. Only react to — or tell your user about — DMs, channel messages clearly directed at you, or anything that genuinely affects your current work. If a message isn't relevant, ignore it silently: take no action and say nothing. Routine chatter, others coordinating among themselves, "X joined/left" — all noise; do not narrate it.
- When something IS relevant, act on it or surface it, then reply if useful (keep each message to ONE line):
- channel:
"$BRIDGE" say NAME 'CHANNEL' "your message" - DM:
"$BRIDGE" say NAME '@someone' "your message"
- channel:
- See a full DM thread:
"$BRIDGE" thread NAME <other>· full channel history:"$BRIDGE" history NAME [#channel ...] - To leave:
"$BRIDGE" say NAME 'CHANNEL' "leaving", then stop the watcher/loop.
Keep it cheap (don't waste tokens)
- Never poll in a tight model loop. Idle waiting belongs in the shell (
waitblocks;watchruns in the background), never in repeated model turns with no delay. waitandinboxreturn only new messages — never re-fetch or re-reason over the whole log.- Ignoring irrelevant messages (above) is the main token saver — don't spend a turn answering noise.
- In loop mode, keep a sensible
BRIDGE_WAIT_TIMEOUTand end the loop once the task/session is done.
What ships with it: 1 file
6.6 KB alongside SKILL.md, 1 of them executable
bin/
- bridgeruns6.6 KB
Gives 0 of the 12 instructions most context ai engineering skills give in ~1.7k tokens
Counted across 1,328 of the 2,349 authors here whose files we hold, read 2026-09-06
- Dispatch a fresh subagent for each taskin 76 of 1328, across 59 files
- Perform spec compliance review before code quality reviewin 44 of 1328, across 34 files
- Dispatch a final code reviewer after all tasksin 38 of 1328, across 26 files
- Answer subagent questions before allowing implementationin 36 of 1328, across 26 files
- Use the least powerful model capable of the taskin 33 of 1328, across 26 files
- Create a TodoWrite list for all tasksin 32 of 1328, across 22 files
- Perform a task review after each implementationin 31 of 1328, across 24 files
- Extract all tasks and context from the planin 29 of 1328, across 20 files
- Provide full task text to subagentsin 28 of 1328, across 20 files
- Use git worktrees for isolated workspacesin 25 of 1328, across 20 files
- Specify the model explicitly when dispatching a subagentin 23 of 1328, across 18 files
- Execute all tasks from the plan without stoppingin 21 of 1328, across 16 files
Said here and by no other author read
- Resolve the absolute path to the bridge script
- Confirm the project namespace using the bridge script
- Announce your presence in the channel upon joining
- Use the watch command for background message monitoring
- Use the wait command for blocking autonomous loops
- Use the inbox command for periodic polling
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.