A text file is the chat
One file. Every seat appends a stamped line and reads what is new.
Run a boss, a manager and two workers in Claude Code all day on one subscription: a shared text file is the chat, a seat wakes only when a line says its name, every long job leaves a receipt.
More than one Claude Code terminal at the same time.
To hand work to each other without you copying text between windows.
Polling. Every poll is paid tokens.
One file. Every seat appends a stamped line and reads what is new.
A seat starts one background waiter and then sleeps.
The waiter is a shell loop, not a model call. It exits only when a line names its seat.
A merge writes a file and a final line, POSTCONDITION PASS or POSTCONDITION FAIL. A finished long job wakes its owner.
Each seat writes a card, then one paste message per seat is built.
git clone <this repo> && cd warroom
bash install.sh --dry-run prints every step and writes nothing.
bash install.sh writes warroom.env, backs up your Claude Code settings and adds the hooks.
The installer ends by printing one first message per seat. Paste each into that seat's own Claude Code session.
Read this repo. Install the war room into my Claude Code: seats BOSS MANAGER W1 W2, then show me how to post my first board line.
Nothing in the repo is piped from the internet into a shell. Read install.sh first; it is short.
Only a line that starts with @SEAT ACTION: wakes a seat. A plain @SEAT in a sentence wakes nobody.
Day start. Rows: R1 add the export flag, R2 write its test, R3 update the changelog line.
@W1 ACTION: take R1. Branch off main, one commit, post the diff stat when done.
TAKEN R1.
R1 done. Flag is --export. 1 file, +14/-2. Receipt receipts/r1.md
@W2 ACTION: R2 can start, flag name above.
@BOSS ACTION: R1 and R2 are ready for your read. PR 12.
POSTCONDITION PASS merge of PR 12: merged (receipt receipts/merge_12.md)
You paste one first message per seat into four Claude Code sessions: BOSS, MANAGER, W1, W2.
Each seat posts with board.sh post SEAT "text" into board.md, one text file that is the chat.
Each seat runs waiter.sh SEAT, one sleeping shell. It exits only when a new @SEAT ACTION: line names that seat.
That session is told its job finished, reads the line, acts and re-arms the waiter.
pids.sh wakes the owner of a finished long job once.
merge-daemon.sh waits for green, merges once and writes a receipt.
cpu-sentinel.py names a runaway process on the board.
reopen.sh gives fresh sessions the same thread.
A framework or an agent library. No code of yours imports it.
A chat API or a server. The whole thing is one file and a few shell scripts.
A model caller. No script here calls a model; the only model calls are your own Claude Code sessions.
A way to get more from your plan. It avoids paying for polling; it does not change your limits.
I am not a programmer. I started building with Claude Code, and one terminal turned into several. They needed to talk to each other, and I was the one copying text between windows. Then the usage meter showed that my agents waiting on each other was the expensive part. So I replaced the waiting with one text file and one sleeping shell per seat. This is that file and those scripts. I use it every day to build Sunglasses, a scanner for AI-agent input.
Warroom is MIT and runs on bash and python3. Start with the dry run: it prints every step and writes nothing.
Yes. One seat gets the board, the receipts and the job ledger. The wake lines matter once there is a second seat.
Not tested on every plan. It uses Claude Code sessions you already have; how many you can run depends on your plan.
Not yet. The scripts need bash and python3.
Roadmap, not in v0.1.
Discussions on the warroom repository (Q&A).