beads orchestrator for claude code. processes beads issues as they become ready, waiting for new work when idle. quality gates ensure code quality.
deno install -A -g -f -n ebo jsr:@schpet/easy-bead-ovenor, if you've cloned the repo:
deno install -c ./deno.json -A -g -f -n ebo ./main.tsthis project is experimental and in early development.
current limitations:
- runs claude code in a sequential for loop (no parallelization)
- only supports claude code as the agent (no support for other ai agents/models)
ebo requires --dangerously-skip-permissions since it runs claude code
autonomously in a loop and cannot prompt for permissions.
# basic usage - run in continuous mode (streams output, runs indefinitely)
ebo --dangerously-skip-permissions
# limit to 10 iterations
ebo --dangerously-skip-permissions --max-iterations 10
# use a specific model
ebo --dangerously-skip-permissions --model claude-sonnet-4-20250514
# quiet mode
ebo --dangerously-skip-permissions --quiet- runs quality gates first (if configured) and fixes any failures
- checks for stale
in_progressissues from previous runs - reads ready issues from beads (
bd ready) - claims the first issue (sets status to
in_progress) - builds a prompt from issue details and runs claude code
- runs quality gates
- if gates pass, closes the issue
- repeats for ready issues, polling when idle
create .config/ebo.toml in your project to configure quality gates:
gates = [
"npm test",
"npx tsc --noEmit",
"npx prettier --check .",
"npx eslint .",
]gates are run sequentially and must all pass for an issue to be closed.
deno:
gates = [
"deno fmt --check",
"deno lint",
"deno test -A",
]rust:
gates = [
"cargo test",
"cargo check",
"cargo fmt --check",
"cargo clippy -- -D warnings",
]if no config file exists, no gates are run.
reviews are custom prompts that run after each issue is completed but before it's closed. they receive the diff and can make additional changes. useful for enforcing project-specific standards:
# example .config/ebo.toml
gates = [
"bundle exec standardrb --fix-unsafely",
"bundle exec rspec",
"pnpm run type-check",
]
[vcs]
command = "jj"
[[reviews]]
prompt = "ensure no authorization errors are introduced"
[[reviews]]
prompt = "remove any excessive or unnecessary comments"reviews run sequentially. each review sees the current diff and can fix issues it finds. if a review makes changes, subsequent reviews see the updated diff.
| flag | description | default |
|---|---|---|
-n, --max-iterations <count> |
max loop iterations | infinity |
-m, --model <model> |
claude model to use | claude code default |
--max-turns <turns> |
max turns per claude code session | claude code default |
-q, --quiet |
less output | false |
--dangerously-skip-permissions |
skip permission prompts (required) | - |
-h, --help |
show help | - |
- deno
- claude code cli (
claudecommand) - beads (
bdcommand)
a pre-built container image is available with all ebo dependencies:
docker pull ghcr.io/schpet/ebo-agent:latestthe image includes everything needed to run ebo: deno, claude code, beads (bd), jj, and ripgrep. compatible with Docker, Podman, and Apple's container tool.
to build locally (or extend the base image with project-specific tooling):
container build --tag ebo-agent .# interactive shell
container run -it --rm -v $(pwd):/workspace ebo-agent bash
# run ebo directly
container run -it --rm \
-v $(pwd):/workspace \
ebo-agent ebo --dangerously-skip-permissionsbefore running ebo, you need to authenticate claude code inside the container:
# start interactive shell
container run -it --rm -v $(pwd):/workspace ebo-agent bash
# inside the container, run claude to start auth flow
claudethis will prompt you to authenticate via browser (for Max subscription) or enter an API key.
the container authentication approach is based on
nezhar/claude-container, which
uses persistent credential storage via CLAUDE_CONFIG_DIR.
the container ships with a specific version of claude code. to update to the latest version:
container run -it --rm -v $(pwd):/workspace ebo-agent claude update-v $(pwd):/workspacemounts your current directory into the container at/workspace- the container includes: deno, claude code, beads (bd), jj, ripgrep