{ "site": { "title": "bench", "tagline": "docs", "description": "Run a team of coding agents without losing track of what they are doing.", "base_url": "https://bench.12vectors.com", "repo_url": "https://github.com/12vectors/bench", "issues_url": "https://github.com/12vectors/bench/issues", "releases_url": "https://github.com/12vectors/bench/releases", "blob_base": "https://github.com/12vectors/bench/blob/main/" }, "link_routes": {}, "pages": [ { "path": "/", "title": "bench — run a team of coding agents, stay in control", "layout": "home", "section": null, "description": "Your agents ship faster than you can keep track. Every task is a card, every agent gets its own worktree, every change waits as a PR. Nothing merges without you.", "source": null }, { "path": "/guides/install/", "title": "Install and first run", "layout": "article", "section": "Guides", "description": "Untar bench into .task-manager/, run start.sh, and answer the three questions the first run asks.", "source": "README.md", "from": "## Install into a repo", "to": "## Update" }, { "path": "/concepts/stages/", "title": "The five stages", "layout": "article", "section": "Concepts", "description": "backlog, to-do, in-progress, review, done — the directory a task file sits in is its status, and there is no other source of truth.", "source": "AGENTS.md", "from": "## Stages", "to": "## Claiming a card" }, { "path": "/concepts/task-files/", "title": "Task files", "layout": "article", "section": "Concepts", "description": "A task is a markdown file with a numbered name and a short header. Status is the only field the board enforces.", "source": "AGENTS.md", "from": "## Task file format" }, { "path": "/concepts/claiming-a-card/", "title": "Claiming a card", "layout": "article", "section": "Concepts", "description": "Claiming is moving: taking a card towards work is the commitment, and that is where ownership is recorded.", "source": "AGENTS.md", "from": "## Claiming a card", "to": "## Syncing boards" }, { "path": "/concepts/agents-on-the-board/", "title": "Agents on the board", "layout": "article", "section": "Concepts", "description": "Start work makes a worktree and a branch, runs the agent headless, and moves the card on the way it exits.", "source": "AGENTS.md", "from": "## Agents working the board", "to": "## Pull requests" }, { "path": "/concepts/pull-requests/", "title": "PRs and review", "layout": "article", "section": "Concepts", "description": "A card entering review gets a PR opened for it by the board; then review PR, copilot and act on PR, until it settles.", "source": "AGENTS.md", "from": "## Pull requests", "to": "## Phases" }, { "path": "/concepts/phases/", "title": "Phases", "layout": "article", "section": "Concepts", "description": "A phase is a card that lists its cards: Type: Phase, a ## Cards section in run order, and membership that runs one direction only.", "lede": "The model, before anything runs: what a phase card is made of, how membership is written down, why it runs one direction only, and what the board flags when the list does not resolve.", "source": "AGENTS.md", "from": "## Phases", "to": "### A phase runs itself, on a branch of its own" }, { "path": "/concepts/running-a-phase/", "title": "Running a phase", "layout": "article", "section": "Concepts", "description": "Each member branches from the phase's tip, runs headless, and merges back on green. Halt, never skip — and one PR into main at the end.", "lede": "Everything between starting a phase and the one PR it ends with: where each member's branch is cut, what advances the run and what stops it, how a restarted board picks the phase back up, and what merging it does to the cards it carried.", "source": "AGENTS.md", "from": "### A phase runs itself, on a branch of its own", "to": "### A phase's members leave the Board view" }, { "path": "/concepts/phases-on-the-board/", "title": "Where a phase is drawn", "layout": "article", "section": "Concepts", "description": "The Board stops listing a phase's members and the phase card stands for them; the Phases view gives every phase a swimlane of its own.", "lede": "A phase card stands for cards the kanban no longer lists. What the columns say instead, what the phase card owes in return, and the view that gives every phase a lane of its own.", "source": "AGENTS.md", "from": "### A phase's members leave the Board view", "to": "## Stages" }, { "path": "/concepts/team-mode/", "title": "Team mode", "layout": "article", "section": "Concepts", "description": "BOARD_SYNC makes origin/main the truth and every board a converging replica: moves commit and push themselves, and a beat pulls what the other boards published.", "source": "AGENTS.md", "from": "## Syncing boards", "to": "## Task file format" }, { "path": "/concepts/three-layer-law/", "title": "The three-layer law", "layout": "article", "section": "Concepts", "description": "Core knows tasks, worktrees, PRs and events. Drivers know apps, adapters know agent vendors, local/ knows your project.", "source": "README.md", "from": "## The three-layer law", "to": "## License" }, { "path": "/concepts/adapters/", "title": "Agent adapters", "layout": "article", "section": "Concepts", "description": "Headless jobs run through an adapter, so the board works with coding agents other than Claude Code — and never sees a vendor's payloads.", "lede": "The adapter is the layer that knows a coding agent. It launches one headless job, and translates that vendor's events into the board's own schema — which is what keeps every other line of core free of any particular agent.", "source": "AGENTS.md", "from": "## Agent adapters", "to": "## Drives" }, { "path": "/reference/settings/", "title": "Settings", "layout": "reference", "section": "Reference", "description": "Every BOARD_* setting with its default and what changing it does — generated from manager/core/.env.example, which is where the defaults live.", "lede": "The whole of manager/core/.env.example, read out of the file itself on every build. Precedence runs process environment, then your manager/local/.env, then the defaults below — so a key you never copied is a key at the value shown here.", "source": "manager/core/.env.example", "generate": "settings" }, { "path": "/reference/adapters/", "title": "The adapter contract", "layout": "reference", "section": "Reference", "description": "The two executables an adapter is — run and wire — the three launch intents, the model passthrough, and the normalized event schema.", "lede": "What you implement to put a different coding agent behind the board. Two executables, three launch intents, and one event schema; the shipped claude/ and opencode/ adapters are both of these read side by side.", "source": "manager/core/adapters/README.md", "from": "## The contract", "to": "## Writing one" }, { "path": "/reference/driver/", "title": "The driver contract", "layout": "reference", "section": "Reference", "description": "manager/local/driver/start: the executable that launches your app from a task's worktree, and the four things the board asks of it.", "lede": "How an app starts is project knowledge, so the board does not hold any of it: it runs one executable you write and owns it as a process group. Four env vars in, one line out when the app is up, and SIGTERM to park it.", "source": "AGENTS.md", "from": "## Drives", "to": "## The activity bar and the archive" }, { "path": "/reference/commands/", "title": "The local-command contract", "layout": "reference", "section": "Reference", "description": "manager/local/commands/: project chores run against a task's worktree, surfaced as chips on the cards that have a branch.", "lede": "The driver's contract again, for the chores that belong to one checkout rather than to the app: migrations, reseeds, asset rebuilds. An executable in manager/local/commands/ becomes a chip on every card with a branch.", "source": "AGENTS.md", "from": "## Local commands", "to": "## Updating" }, { "path": "/404.html", "title": "Not found", "layout": "notfound", "section": null, "description": "That path is not a page on this site.", "source": null } ] }