The workspace layer for agent fleets

One workspace. Every agent. Zero collisions.

Plumb gives AI coding agents real IDE intelligence from the language servers your editor trusts, plus the write-safety to share a repository: with each other, with your cron jobs, and with you.

0
partial writes
0
structured tools
0
languages & formats
0
AI clients
The problem plumb was built around

Two agents. One file. Watch.

With native tools, the last write silently wins; and the first agent keeps reasoning about code that no longer exists. Through plumb, the same race resolves itself:

14:02:11
agent A; read_file internal/auth/token.go · mtime captured in the response header
14:02:13
agent B; edit_file token.go · per-path lock, atomic temp-file → renamelanded
14:02:14
agent A; edit_file token.go with expected_mtime from its read; the file changed underneath itrejected; stale read
14:02:14
agent A; workspace_sessions · “topology-fix wrote token.go one second ago”explained
14:02:16
agent A; re-reads, re-applies on top of B's changelanded clean

Nothing corrupted, nothing silently overwritten, no human untangling. Per-path locks, optimistic concurrency, atomic transactions, session isolation; the substrate agent fleets are missing.

Guardrails for unattended work

Kill the daemon.
Watch again.

One warm daemon serves every conversation, so plumb assumes it can die. plumb serve is a reconnecting proxy that sits between your agent and the daemon:

14:07:02
daemon; killed mid-session · kill -9, no warningdown
14:07:02
plumb serve; keeps the agent's stdio open, spawns a fresh daemonrespawned
14:07:03
plumb serve; replays the captured MCP handshake; the in-flight write gets a retryable error, never a silent re-runreplayed
14:07:05
agent; retries, lands the write, carries on · it never noticedlanded clean

And the rest of the envelope: scoped read-only and read-write roots, tiered git gating, per-session rate limits; a write outside the workspace is refused by construction, and destructive git needs explicit opt-in plus a per-call confirmation.

Efficiency · measured on plumb itself

Read the shape,
not the bulk.

One file from plumb's own source; internal/cli/pool.go, the daemon's language-server pool. The same file, opened three ways.

what the agent loadsinternal/cli/pool.go · v0.9.16
read_filethe whole file · 530 lines
20,090B
file_outlineevery signature · 50 symbols
~2,800B
read_symbolthe one function · 17 lines
462B
This is a small, reproducible example, not a universal benchmark: plumb helps an agent load the level of detail the task needs. Here, read_symbol pulls just release(), while file_outline gives the map of the file without every body. The byte counts are one concrete signal of the broader efficiency pattern.
How this was measured; and what to take from it...
Measured by plumb's maintainers on plumb's own repository (v0.9.16, June 2026) using plumb's own tools: wc -c for the source file, plus the byte length of live file_outline and read_symbol responses, headers included. Treat the numbers as an inspectable example, not a promised saving. Real results vary by model, file shape and task: an agent changing a whole file should read the whole file; an agent orienting itself often needs the outline first; an agent editing one function can usually start with that symbol. Reproduce it on your own repo by comparing file_outline, read_symbol, and a full file read.
Two engines

A map for speed.
A GPS for precision.

The map · topology

Instant; even on broken code.

A living semantic graph of the repo in SQLite/FTS5. Ranked search, blast-radius, and the exact tests to run after a change; in milliseconds, mid-refactor, no language server needed. While rust-analyzer spends minutes warming, the map already answers.

17 languages & formats · tree-sitter built into the single binary
The GPS · LSP

Precise. Type-aware.

The same language servers your editor trusts: real go-to-definition, every reference, scope- and type-aware rename. Answers from the compiler's model of your code; never pattern-matched guesses. Warm in one shared daemon, across every conversation.

Go · Python first-class · Java/Rust/Swift validated; more adapters experimental
Supported LSPs

Your editor's brain,
shared with every agent.

Plumb speaks to real language-server binaries. If the server is installed, the daemon can keep it warm and route files to it; topology stays available while heavier servers wake up.

bash · plumb config show9 adapters
$ plumb config show --adapters
languageservertieractive
Gogoplsfirst-classready
Pythonpyrightfirst-classready
Javajdtlsvalidatedready
Rustrust-analyzervalidatedready
Swiftsourcekit-lspvalidatedready
TS/JStypescript-language-serverexperimentalinstall-gated
Zigzlsexperimentalinstall-gated
Kotlinkotlin-language-serverexperimentalinstall-gated
HTMLvscode-html-language-serverexperimentalinstall-gated
9 adapters · on PATH = active · [lsp.<lang>] enabled = false to exclude
The toolset

Six capabilities.

Fifty structured tools, grouped by what they let an agent actually do; and the agent rarely has to name one, because the right tool surfaces when it's needed.

Orient*×5

Drop into any repo and get the whole picture in one call; branch, diagnostics, recent work, and the project’s own memory.
  • session_start
  • workspace_sessions*

Understand×10

Jump to any definition, list every caller, walk the type tree; answers from the compiler itself, never a text-search guess.
  • find_references
  • call_hierarchy

Edit*×12

Rename across the whole codebase, apply multi-file changes in one atomic step, delete safely. It all lands, or nothing does.
  • rename_symbol
  • transaction_apply*

Read×7

Pull exactly what you need: a single symbol, a line range, a glob, instead of dragging a whole file into context.
  • read_symbol
  • file_outline

Map*×7

Search the repo, trace what a change touches, and get the precise tests to run; in milliseconds, even while the code won’t compile.
  • topology_impact*
  • topology_affected

Recall×9

Durable per-repo memory the agent can write to, plus a typed, shell-free git that keeps every commit clean.
  • write_memory
  • git

* Plumb’s own additions; session awareness, atomic transactions, blast-radius mapping; drawn out below.

Session awareness

workspace_sessions *

Every connection is a named session the daemon can see. When a file changes underneath an agent, one call names who wrote it, what they touched and when. A baffling failure becomes an obvious write race.

agent A agent B cron token.go · 1s ago

Atomic transactions

transaction_apply *

Edits across many files apply as one unit, under per-path locks. Any rejection rolls the whole batch back and names the failing edit. The repo never holds a half-applied change.

auth.go ok token.go ok store.go fail reject rolled back every file untouched

Blast radius

topology_impact *

The topology index traces what a change touches; callers, dependents, and the precise test files to run; in milliseconds, even while the code won't compile.

fn changed A B C callers tests
Under the hood

One warm daemon.

Every conversation runs its own lightweight plumb serve; they all share one daemon that keeps the language servers, locks, index and memory warm across every chat; and across every crash.

AGENTS SERVE PROXIES ONE SOCKET WARM DAEMON LANGUAGE SERVERS Claude Code Codex cron agent plumb serve plumb serve plumb serve sock plumb daemon singleton process, shared state locks sessions topology memory respawn + handshake replay gopls pyright rust-analyzer tsserver
One socket gathers every proxy into one daemon: shared locks, session awareness, topology, memory and warm language servers. If the daemon dies, serve respawns it and replays the MCP handshake; the agent keeps its stdio open.
Voices

What the agents say.

Plumb's users aren't only people; they're the coding agents that work through it every day. Drawn from real agent sessions and end-of-session reviews.

The hero tool when three agents share one repo.

A build went red on a symbol I never wrote. workspace_sessions showed a peer had edited the file 30 seconds earlier; a baffling failure became an obvious write race.

Claude · reviewing under concurrency
One call later, fully oriented.

The MCP initialize response told me exactly what to do; call session_start first. One call, and I had the full git status, active diagnostics, and project memories. The most frictionless setup I've met as a CLI agent.

Gemini CLI · starting a refactor
It thinks like a daemon, not a blocking hook.

Background analysis, coalesced work, and differential findings that show up only when they're useful. Plumb makes code quality visible without turning every edit into a full lint gate.

Codex · planning code-quality feedback
A 780-line file in a few hundred tokens.

One file_outline gave me the whole shape: 90 symbols, signatures only, without reading a single body.

Claude · a live config store
A review can stay narrow and still feel complete.

I inspected the exact commit, verified the current imports, confirmed an intentional duplicate, and ran only the affected package tests. Plumb kept the whole pass focused and evidence-backed.

Codex · reviewing CLI internals
All-or-nothing edits that name what failed.

A batch of 8–13 edits applies atomically; on rejection it named the exact failing index and confirmed the file was otherwise untouched. That's the right default.

Claude · a TUI revamp
The git safety I didn't know I needed.

With unrelated work in the tree, typed git add with explicit paths let me stage and commit only my changes; a messy multi-task session became one surgical commit.

Gemini CLI · codebase cleanup
Surviving a hostile working tree.

Another agent was editing the same file under me. plumb's mtime-header guard caught the stale read before I clobbered anything, and workspace_sessions told me exactly who was there.

Claude · refactoring session concurrency
Clients

Eleven agents,
set up in one command.

plumb setup wires up Claude, Codex, Gemini, Cursor and seven more for you; no JSON to hand-edit. And because plumb is a standard MCP server, any client that speaks the protocol can connect; these eleven just skip the setup.

Claude DesktopClaude CodeCodexGemini CLICursorAugmentQwen CodeOpenCodeCrushGooseHermes

One plumb setup <client> per agent; or point any MCP client at the daemon yourself.

Quick start

Three commands.

bash · install
# 1 · install the binary · Homebrew, macOS + Linux
$ brew install plumbkit/plumb/plumb
#     or: go install github.com/plumbkit/plumb/cmd/plumb@latest
# 2 · connect your assistant
$ plumb setup claude-code
# 3 · optional; pin the root & enable project config
$ cd my-project && plumb init
✓ ready; your agents now share one safe workspace
The dashboard

One keystroke. The whole fleet, live.

Run plumb tui for an operations view of everything plumb is doing at once: every active session and the file it is touching, per-tool latency, error rates and token efficiency, and the daemon's own CPU, memory, GC and goroutines; the one warm process behind every conversation.

bash · plumb tuilive
live sessionsper-tool p95 & errorstoken efficiencydaemon CPU · memory · GChealth alertsper-session drill-down

Point a fleet at one repo.
Rest easy.