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.ts launches the full‑screen UI.
  • Internal call graph:
  • main.ts imports draw.ts, term.ts, views/*.ts, history.ts, and model.ts.
  • draw.ts renders the Mission Control layout and subscribes to the shared history file (console/src/data.ts reads console/src/history.ts).
  • term.ts exposes a read‑only terminal view that connects to the seat’s tmux session via the agent‑* scripts in bin/.
  • model.ts pulls the current state from the rig/template and config/*.json, and feeds it to the view layer.
  • What this code touches outside itself:
  • File system: writes to console/src/history.ts and reads the seat logs under each seat's worktree.
  • Network: each seat runs @openrig/cli which talks to the OpenRig daemon (bin/openrig-daemon-cycle) and to the LLM endpoints defined in config/*.json.
  • External processes: the bin scripts invoke openrig and playwright to 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

  1. Setup ``bash git clone https://github.com/moses-y/agent-stack cd agent-stack npm install ``
  2. Configuration - Edit config/claude-proxy-settings.json to point to your OpenAI credentials. - Set OPENRIG_WORKSPACE to a directory where seat worktrees will live.
  3. Running ``bash npm run start:console ` (This runs console/src/main.ts via 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.