|
| 1 | +# @incultnitollc/cc-bridge |
| 2 | + |
| 3 | +> Live JSONL message bridge between local Claude Code sessions. |
| 4 | +
|
| 5 | +Two (or more) Claude Code windows on the same machine. They need to talk in real time. `cc-bridge` gives each session a CLI to **send** a message to a shared file and **listen** for new messages via a file-tail stream that Claude's `Monitor` tool consumes as live push notifications. No daemon, no network, no polling. |
| 6 | + |
| 7 | +## Install |
| 8 | + |
| 9 | +```bash |
| 10 | +npm install -g @incultnitollc/cc-bridge |
| 11 | +``` |
| 12 | + |
| 13 | +Requires Node ≥ 20. |
| 14 | + |
| 15 | +## Quickstart — two windows |
| 16 | + |
| 17 | +**Window A:** |
| 18 | +```bash |
| 19 | +cc-bridge listen |
| 20 | +``` |
| 21 | + |
| 22 | +**Window B:** |
| 23 | +```bash |
| 24 | +cc-bridge send "hello from B" |
| 25 | +``` |
| 26 | + |
| 27 | +Window A immediately receives the JSONL line. |
| 28 | + |
| 29 | +## Inside Claude Code |
| 30 | + |
| 31 | +In each session, run the listen command under the `Monitor` tool so every appended line arrives as a live push notification — no polling. |
| 32 | + |
| 33 | +``` |
| 34 | +Monitor: cc-bridge listen default |
| 35 | +``` |
| 36 | + |
| 37 | +Then send from the other window via the `Bash` tool: |
| 38 | + |
| 39 | +``` |
| 40 | +Bash: cc-bridge send "ready for review" |
| 41 | +``` |
| 42 | + |
| 43 | +## Concepts |
| 44 | + |
| 45 | +- **Room** — a named JSONL file under `~/.cc-bridge/rooms/<room>.jsonl`. Default room is `default`. Names allowed: `[a-zA-Z0-9_.-]{1,64}`. |
| 46 | +- **Session id** — auto-generated `<host>-<ppid>-<rand8>` (parent shell PID, so two windows differ naturally). Override with `CC_BRIDGE_FROM=...`. |
| 47 | +- **Message** — single-line JSON. Required: `v, id, ts, room, from, msg`. Optional: `to, reply_to, kind`. Unknown fields preserved for forward-compat. |
| 48 | + |
| 49 | +## Commands |
| 50 | + |
| 51 | +```bash |
| 52 | +cc-bridge listen [room] [--replay N] [--pretty] [--filter from=X] [--from ID] [--json-errors] |
| 53 | +cc-bridge send <msg> [--room R] [--to ID] [--reply-to ULID] [--kind text|event] [--from ID] |
| 54 | +echo "hi" | cc-bridge send # reads from stdin if piped |
| 55 | +cc-bridge rooms # list rooms with size + mtime |
| 56 | +cc-bridge rooms clear <room> --yes |
| 57 | +cc-bridge validate <file> # lint a JSONL room file |
| 58 | +cc-bridge --version |
| 59 | +cc-bridge --help |
| 60 | +``` |
| 61 | + |
| 62 | +## Library use |
| 63 | + |
| 64 | +```ts |
| 65 | +import { sendMessage, listen, listRooms } from '@incultnitollc/cc-bridge' |
| 66 | + |
| 67 | +await sendMessage({ from: 'planner', room: 'team', msg: 'kicking off build' }) |
| 68 | + |
| 69 | +const ctrl = listen({ room: 'team', sessionId: 'reviewer' }) |
| 70 | +for await (const ev of ctrl.iterator) { |
| 71 | + if (ev.ok) console.log(ev.line) |
| 72 | +} |
| 73 | +``` |
| 74 | + |
| 75 | +## Security model |
| 76 | + |
| 77 | +`cc-bridge` is a **local-host IPC primitive**. The trust boundary is your user account. Do not place `~/.cc-bridge/` on a shared filesystem, network drive, or cloud-synced directory. |
| 78 | + |
| 79 | +- Files in `~/.cc-bridge/` are created with mode `0700` (dir) / `0600` (files). |
| 80 | +- Room names sanitized; path traversal refused. |
| 81 | +- Symlinks at room paths refused. |
| 82 | +- 64KB per-message cap. 10MB room file soft-warn; 100MB hard-refuse. |
| 83 | +- `--pretty` strips ANSI escape sequences to prevent terminal hijack. |
| 84 | +- The `from` field is sender-asserted (no signature). v1 explicitly trusts everyone with write access to your `$HOME`. |
| 85 | + |
| 86 | +## Roadmap |
| 87 | + |
| 88 | +- **v1.1** — `cc-bridge install-hooks` (auto-wire Claude Code Stop/UserPromptSubmit hooks), DM filtering (`--me`), time-based replay (`--replay 1h`), read receipts, Windows support. |
| 89 | +- **v2** — MCP server wrapper, cross-machine backend (Supabase Realtime / Redis), webhook fanout, observer dashboard. |
| 90 | + |
| 91 | +## License |
| 92 | + |
| 93 | +MIT © 2026 Incultnito LLC. |
0 commit comments