Getting started
autodev is a planning board and an autonomous delivery fleet. The board keeps executable work contracts in Git. The fleet pipeline gives those contracts to agent harnesses in isolated worktrees, checks the resulting commits, asks a separate judge turn to review them, integrates them, runs the repository gate, and advances attributed stories.
The current 0.1.0 source still has known confinement, recovery, evidence-granularity, and product
boundary gaps. Read Current limitations before operating a fleet.
You can adopt the board without running agents. Start there, then configure the fleet when the repository's contracts pass.
Prerequisites
You need:
- Git and a Git repository;
- a current stable Rust toolchain with Cargo;
- for fleet use, a supported coding-agent CLI installed and authenticated for the user running autodev;
- on Linux,
bwrap(Bubblewrap) for confined validation runs.
autodev is currently installed from source. It is not documented here as a published crate or packaged release.
Build or install from source
Clone the project, then either keep a repository-local binary:
git clone https://github.com/codewandler/autodev.git
cd autodev
cargo build --release
./target/release/autodev --version
Or install the CLI into Cargo's binary directory:
cargo install --path crates/autodev-cli
autodev --version
Run the workspace tests before relying on a source checkout you have changed:
cargo test --workspace
Add a board to an existing repository
From the root of the Git repository you want autodev to manage, create the conventional planning directories, a commented fleet configuration, and runtime-state ignore rules:
autodev init
init is convergent: it keeps existing files rather than rewriting them. Add --no-commit if you
want to inspect and commit the scaffold yourself.
Then create the first story:
autodev board create \
--prefix APP \
--title "Reject expired sessions" \
--kind bugfix \
--goal "Expired sessions cannot access an authenticated endpoint." \
--criterion "A request with an expired session receives an unauthorized response." \
--criterion "The authentication test suite passes." \
--area src/auth \
--priority 80
By default, a board mutation writes and commits its file. Add --no-commit if you want to inspect and commit the change yourself. The working tree is still what board reads observe.
Check the contract and inspect the generated ID:
autodev board check
autodev board list
autodev board get APP-1
autodev board explain APP-1 --to ready
Move the story to ready only after board check reports no blocking defect:
autodev board transition APP-1 ready
autodev board list --status ready
The fleet dispatches ready work. A board-only repository can stop here. See Work with the planning board for epics, decisions, glossary terms, updates, and machine-readable output.
Choose where runtime history lives
You do not need a daemon for a single repository. When a workspace is unregistered, fleet commands
open its local .autodev/fleet.sqlite in process.
To give several repositories one central store owner, register this workspace and start the daemon:
autodev workspace register .
autodev daemon start
autodev daemon status
If this repository already has local fleet history, register and import it in one operation:
autodev workspace register . --import
An unimported legacy store is reported as unimported; it is not rendered as an empty history. The
daemon owns one global runtime store at ~/.local/share/autodev/fleet.sqlite, serves the operator
client on 127.0.0.1:7777, and serves the machine API on 127.0.0.1:7788. A registered workspace
does not fall back to a checkout-local runtime store when the daemon is unavailable. Read Central
daemon and workspaces before moving an existing fleet or replacing
its binary.
Configure a fleet
Fleet configuration lives in .autodev/fleet.toml; workflow overrides live separately in .autodev/workflows.toml. A minimal Codex example is:
[bridges.codex]
kind = "codex"
model = "your-codex-model"
[roles]
worker = "codex"
judge = "codex"
[validation]
argv = ["cargo", "test", "--workspace"]
[fleet]
worktree_root = "../my-project-fleet-worktrees"
max_wave_size = 2
max_open_waves = 2
max_concurrent_turns = 2
attempt_limit = 2
disk_floor_gb = 10
The model value is deliberately a placeholder: choose a model your installed harness supports. The worker and judge may use the same named bridge, but they run as separate turns. For independent model selection, declare another bridge and assign it to roles.judge.
Do not copy resource limits blindly. Size concurrent turns, open waves, the worktree location, and the disk floor for the repository and machine that will actually run them. See Connect coding-agent CLIs for harness installation, authentication, and bridge examples, then Configure the fleet for environment, workflow, and gate details.
Check before the first drive
Verify the board, configuration, disk posture, and persisted fleet state:
autodev board check
autodev fleet disk
autodev fleet doctor
autodev fleet status
Then run one reconciler pass and inspect what it did:
autodev fleet tick
autodev fleet status
When that looks right, let the loop run until it becomes quiet or reaches its tick limit:
autodev daemon start --single-user
autodev applies delivered work to the branch that was current when the wave was dispatched and commits the board transition to done. It does not publish packages, push a remote branch, or deploy your software.
Check the daemon, then open the embedded operator workspace in a browser:
autodev daemon status
# Linux with Brave:
scripts/open-autodev-brave.sh
Starting the daemon starts a drive for every registered workspace, so this is the whole loop. Then
visit http://127.0.0.1:7777/ for the console, /docs for this documentation, and /public for the
summary page. With --single-user every client on the loopback endpoint may act; otherwise the
browser is read-only unless the daemon was started with an act token and the client presents it.
The Brave launcher opens a chrome-less app window with an isolated profile and exposes DevTools on
loopback port 9333; it does not share renderer or extension load with your normal browser. The
client and machine API use separate listeners owned by the same daemon process. See Use the operator
workspace.
Continue with Run and inspect the fleet, or keep Troubleshooting open for the first live run.