The Problem
Co‑ordinating multiple AI agents to build, test, and merge code is error‑prone when each agent is a separate process with its own tooling. Existing approaches require manual queue management, duplicated configuration, and fragile hand‑offs. The result is slow feedback and a high risk of merge conflicts.
What This Does
agent‑stack turns a single Linux box into a fully‑automated software team. The operator agent, visible in console/src/main.ts, talks to the user, creates a project template in rig/template/, and hands out git worktrees (“seats”) that run the appropriate LLM (Claude, Codex, or GPT‑6) through @openrig/cli. Each seat writes its own activity to a shared history file, while the console in console/ shows a read‑only overview of the fleet: Mission Control, Seat Matrix, River, and Focus.
The merge gate is enforced by Jev (jev/lib/engine.js) which evaluates a set of typed decisions: CI status, cross‑family review, QA verdict, and a live Jev decision. A PR is merged only when all verdicts agree.
How It Is Wired
- Entry point:
console/src/main.tslaunches the full‑screen UI. - Internal call graph:
main.tsimportsdraw.ts,term.ts,views/*.ts,history.ts, andmodel.ts.draw.tsrenders the Mission Control layout and subscribes to the shared history file (console/src/data.tsreadsconsole/src/history.ts).term.tsexposes a read‑only terminal view that connects to the seat’s tmux session via theagent‑*scripts inbin/.model.tspulls the current state from therig/templateandconfig/*.json, and feeds it to the view layer.
- What this code touches outside itself:
- File system: writes to
console/src/history.tsand reads the seat logs under each seat's worktree. - Network: each seat runs
@openrig/cliwhich talks to the OpenRig daemon (bin/openrig-daemon-cycle) and to the LLM endpoints defined inconfig/*.json. - External processes: the bin scripts invoke
openrigandplaywrightto run tests or open a browser.
- File responsibility:
console/– UI rendering and history aggregation.bin/– command wrappers that launch OpenRig or Playwright.rig/template/– YAML/JSON templates for seat roles and defaults.jev/– typed decision engine.config/– LLM and proxy configuration.
The system has a single data source: the shared history file. All state changes propagate through that file, providing a narrow blast radius for modifications.
How To Use It
- Setup ``
bash git clone https://github.com/moses-y/agent-stack cd agent-stack npm install`` - Configuration - Edit
config/claude-proxy-settings.jsonto point to your OpenAI credentials. - SetOPENRIG_WORKSPACEto a directory where seat worktrees will live. - Running ``
bash npm run start:console`(This runsconsole/src/main.tsvia ts-node.) To onboard a repo:`bash bin/agent-project-new shop``
Real‑World Use
A dev in a product team runs agent-claude-trust to verify that an operator seat can safely use the trusted Claude model. Then they run rig-console --fixture docs/fixtures/demo-fleet.json to observe a demo fleet. The operator writes a feature request, the team plans, writes tests first, builds, and the merge gate automatically approves the PR. After merge, agent-waves-sync deploys to staging, and the witness seat runs the fresh agent on the deployed app.
Code Health & Issues
- Low – Secret‑shaped paths present (
docs/incidents/2026-09-30-playwright-secrets.md). - Med – No license file found; CI is only a single test workflow (
.github/workflows/test.yml). - Low – Tests cover only 23 % of JavaScript functions (
test/contains 79 files).
These counts come from the static audit reported in the repo. No additional critical issues were found.
The Bottom Line
agent‑stack offers a pragmatic, low‑friction way to orchestrate AI‑driven development on a single host. Its strengths lie in the tight coupling between the console UI, seat templates, and Jev decision engine. The main trade‑offs are the lack of a formal license and limited test coverage, which may concern security‑critical teams. It is best suited for internal tooling where a single Linux machine can run multiple LLMs and where the devs are comfortable with the existing configuration files.