The third design layout (1c Logbook) had no page. This lands it, and with it the four routes a reader reaches for when the guides have stopped answering: /reference/settings and the three contracts a project implements against. The settings page is parsed, not transcribed. site/build.py grows a second way to make a body — a page may say "generate": "settings" instead of a "from" heading — and manager/core/.env.example is read on every build: its blank-line blocks become the page's entries, a comment block documents the keys directly under it, and the file's own NAME=value lines are the defaults shown. A key with no comment above it, or one set twice, stops the build naming the route; a settings page that disagrees with the settings file is worse than no settings page. Generated bodies render with raw HTML off. The file writes <git user.name> meaning a placeholder, and a parser honouring HTML swallows it — it was never written to be markdown. The reference layout is the article's three columns with the contents gutter given over to a console: every entry on the page once more in the machine register, keys with their defaults on the settings page and headings on a sliced one. It links the same anchors "On this page" carries, so the 1080px step folds the whole column away and the contents strip hands them back — no third copy of anything, and the responsive rules already in the sheet cover it. The contract pages are slices like every other page: the adapter contract and its event schema out of manager/core/adapters/README.md, the driver and local-command contracts out of AGENTS.md. Renaming any of those headings stops the build naming its route. tests/test_site_reference.py holds the promise: add a key to .env.example with its comment, rebuild, and it is on the page with its default, with nothing in site/ edited. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
167 lines
7.1 KiB
JSON
167 lines
7.1 KiB
JSON
{
|
|
"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": "## 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
|
|
}
|
|
]
|
|
}
|