kdo

Workspace runtime for coding agents. A budgeted view of the repo, instead of a filesystem walk.

~/my-monorepo
$ kdo init
  4 projects rust, typescript, python, anchor
  wrote kdo.toml and .kdo/context/

$ kdo context vault-program --budget 2048
  vault-program.md under budget

$ kdo apply -f specs/hello.yaml
  created spec hello
$ kdo factory tick
  plan, implement, test, review
  merge waits if the checkout is dirty

commands

Find the projects. Cap the context. Serve it.

An agent that opens a monorepo by walking the tree reads files the task never needed. kdo already knows the projects and the dependency edges, and it will not return more context than the budget you set.

One graph

Reads Cargo.toml, package.json, pyproject.toml, Anchor.toml, and go.mod. kdo graph prints the edges. kdo affected --base main lists projects a change touches.

A token cap

kdo context <project> --budget 2048 returns the summary and public signatures that fit. Tree-sitter extracts signatures. File bodies stay on disk until a tool asks for one symbol.

MCP, with a loop limit

kdo serve --transport stdio. Tools: list, context, symbol, graph, affected, search, run. The same call 3 times (OpenClaw) or 5 times (other profiles) returns a loop error instead of another model turn.

Specs in a worktree

kdo apply -f spec.yaml, then kdo factory daemon. Plan, implement, and review use your key. The tester runs the test task from kdo.toml. Writes stay in .kdo/worktrees/<run>/. A pass merges only if git status is clean outside .kdo/.

kdo.toml workspace · committed
[workspace]
name = "my-monorepo"
projects = ["apps/*", "crates/*"]

[aliases]
b = "build"
t = "test"

[env]
RUST_BACKTRACE = "1"

[tasks.build]
command    = "cargo build"
depends_on = ["^build"]
inputs     = ["src/**", "Cargo.toml"]
outputs    = ["target/debug/"]

[tasks.dev]
command    = "cargo watch -x run"
persistent = true

[projects.api.tasks]
build = "cargo build --release"

kdo.toml

A task is a command.

test = "cargo test" is enough. Add depends_on only when order matters.

  • ^build runs build in upstream projects before this one.
  • //lint runs lint in every project first.
  • kdo run test --dry-run prints the commands. It does not run them.
  • [projects.api.tasks] replaces one task for one project. The rest of the file stays shared.

scope

It does not replace your build tool.

Turbo, Nx, Bun, and pnpm install and build. kdo reads those manifests so an agent can ask what depends on a project without opening every file. Keep the package manager.

Feature kdo turbo nx bun pnpm
Polyglot graph ● ○ ◐ ○ ○
MCP server built-in ● ○ ○ ○ ○
Token-budgeted context ● ○ ○ ○ ○
Task pipelines (^task / //task) ● ◐ ● ○ ○
Per-project task overrides ● ● ● ○ ○
Single static binary ● ○ ○ ● ○
Package install / lockfile ○ ○ ○ ● ●
Spec runs in a git worktree ● ○ ○ ○ ○

Filled: yes. Half: partial. Empty: no. Checked against kdo 0.3.0-alpha.1.

install

Binary or Cargo.

Still pre-1.0. Cargo skips alphas unless you pass --version. The shell script downloads the GitHub release and does not need Rust.

binary fastest, no Rust required
curl -fsSL https://vivekpal1.github.io/kdo/install.sh | bash -s -- --from-release
cargo explicit version for pre-releases
cargo install kdo --version "0.3.0-alpha.1"

Already installed? kdo upgrade pulls the latest binary in place.

mcp

Register the server once.

kdo setup writes the client config. --dry-run prints the files and writes nothing. Cursor, Zed, Cline, and Continue use kdo serve --transport stdio --agent generic.

claude code setup command

Claude Code

Writes the Claude Code MCP entry and a CLAUDE.md block between sentinels. Running it again updates that block and leaves the rest of the file alone.

one-command setup
bash
kdo setup claude --global
preview first (writes nothing)
bash
kdo setup claude --global --dry-run
MCP reference ↗
openclaw setup command

OpenClaw

Writes an AgentSkills SKILL.md and merges the MCP server into ~/.openclaw/openclaw.json. The openclaw profile uses a 3-call loop window.

one-command setup
bash
kdo setup openclaw --global
preview first (writes nothing)
bash
kdo setup openclaw --global --dry-run
MCP reference ↗
keys

Factory runs use your key. Set ANTHROPIC_API_KEY or OPENAI_API_KEY, or put names under [keys] in ~/.kdo/credentials.toml. kdo keys status prints set or missing, never the secret. With no key, the factory uses a mock provider.