ReinaMacCredy/maestro
Local-first coordination for human and agent work: durable work, decisions, dispatches, evidence, and prompt-first methods, powered by TypeScript and Bun.
Maestro is a local-first coordination system for human and agent work written in TypeScript and running on Bun. It manages durable work, decisions, and evidence within a repository's shared Git root using a three-layer architecture of a mechanism kernel, plugins, and Markdown-based recipes.
- Uses a local-first SQLite store and Git root for durability.
- Organizes work through Human, Supervisor, Lead, and Peer roles.
- Supports five lane types for different work scopes.
full readme from github
maestro
Maestro is a local-first coordination system for human and agent work. It keeps durable work, decisions, sessions, evidence, dispatches, and handbacks in each repository's shared Git root. It is written in TypeScript, runs on Bun, and does not require a background service.
Documentation: maestro.maccredyreina.me
Version 0.108.0 is the first TypeScript release. It continues the version line after 0.107.x, the final Rust release.
Three layers
- Mechanism kernel owns the SQLite store, event log, sessions, CLI dispatch, plugin loading, and readiness projection. It does not impose workflow policy.
- Plugins provide verbs and optional policy gates. Repositories enable or
disable policies such as proof and breakdown in
.maestro/config. - Recipes and skills provide prompt-first working methods as Markdown. Use
maestro recipe listto browse recipes andmaestro recipe show <name>to read one without copying it into a repository.
Install, update, and remove
Maestro is distributed from source. Install with one command (needs git
and Bun):
curl -fsSL https://raw.githubusercontent.com/ReinaMacCredy/maestro/main/scripts/install.sh | sh
The script clones the repository into ~/.maestro/source (override with
MAESTRO_SOURCE_DIR; MAESTRO_REF picks the branch, default main) and runs
the installer from that checkout, which maestro update then follows. From
your own checkout, run the installer directly:
bun bin/maestro.ts install
maestro version
Install copies the runtime to ~/.maestro/runtime, writes the shim at
~/.local/bin/maestro, records the source checkout in
~/.maestro/source.json, and wires the current repository. When replacing an
older executable, it preserves that executable as maestro-legacy if no
rollback executable already exists.
Install also scaffolds ~/maestro, the Supervisor room, and registers the
current repository there. It materializes four managed skills under
~/maestro/skills: maestro-bundle, maestro-design, maestro-work, and
maestro-verify. The installer links those skills for Claude without
overwriting unmanaged skills.
Use maestro update to fetch the recorded source checkout, accept only a
fast-forward, and resync the runtime. It refuses dirty, diverged, missing, or
unreachable sources without partially updating the runtime. Use
maestro install from the source checkout for an offline resync.
Use maestro uninstall to remove Maestro-managed hooks, settings keys, and
mirror blocks from the current repository. It is idempotent and does not delete
repository data, the machine runtime, the shim, or the Supervisor room.
maestro doctor inspects the shim, runtime stamp, recorded source, repository
wiring, permissions, and store access without repairing them. A healthy report
exits zero; a reported problem names the next command when the repair is
mechanical.
Roles and lanes
Maestro uses four durable roles. The Human owns purpose, risk, priority,
and external effects. The single Supervisor in ~/maestro represents the
Human across registered projects, but works through each project's Lead and
does not edit project code, dispatch Peers directly, or accept technical work.
Its owner, scope, observation boundary, and denied write, acceptance,
transcript, and recovery authorities are explicit in ~/maestro/IDENTITY.md;
the installer also denies Claude's Agent and Task tools in that room.
A repository session is the Lead for that scope. The Lead owns the outcome, contracts, topology, one write owner per moving scope, integration, and technical acceptance. A pane opened with a dispatch becomes a Peer when it accepts the stored contract. The Peer owns independent judgment or bounded delivery and returns a handback with layered evidence.
flowchart TB
Human --> Supervisor
Human --> Lead
Supervisor -. "owner authority through Lead" .-> Lead
Lead --> PeerA["Peer: bounded scope A"]
Lead --> PeerB["Peer: bounded scope B"]
Lead --> PeerC["Peer: independent review"]
Read the full authority model with maestro recipe show slp.
Using SLP requires Herdr, which hosts the Supervisor room and every lane pane. Install it with:
curl -fsSL https://herdr.dev/install.sh | sh
Lanes are Herdr panes, not subprocess agents created by Maestro. A Lead stores
the lane contract with maestro dispatch open, the Peer takes it with
maestro dispatch accept, and the Peer returns a packet with
maestro handback file. Herdr owns pane creation, agent startup, prompting,
wake-up, and pane closure; Maestro owns the durable contract and evidence.
The room's ~/maestro/lane.md contains the complete lane procedure.
The five lane types are scout for no-write discovery, decision for a
recommendation, delivery for bounded writes, challenge for trying to break
a premise or candidate, and shadow for no-write comparison evidence that is
never a candidate. Concurrent dispatches on one work item form a sealed
council. If the first views conflict, the Lead can open a targeted second
generation that quotes the other handbacks; Peers answer by handback and never
prompt each other.
Each moving scope has one Lead. Continuing or replacing that Lead requires a
frozen handoff packet and the ordered receipts packet_ready,
successor_authorized, successor_acknowledged, and
predecessor_released before the predecessor stops writing.
Work, decisions, and evidence
maestro statusshows session identity, held work, and live peers;maestro readyshows work that can start and the gates blocking other work.maestro workmanages work trees, dependencies, leases, notes, cancellation, claims, and proof.- Method depth is quickfix for a one-sentence diff with inline verification and no record, Light for one session and branch tracked with a work item, and Full for multi-session, shared-scope, high-risk, or repeated work tracked with a SPEC/NOTES/VERIFY bundle.
maestro decisionrecords draft, locked, and superseded choices with their rationale and work links. Supersession takes effect when the replacement is locked, not while it is still a draft.- Cross-role decisions are drafted in the store before a Herdr prompt names the sender role and decision id. The answer is the locked or superseding record; non-decision questions and answers are work notes.
maestro dispatchstores lane contracts and council state;maestro handbackstores shape-checked return packets, including explicit dependency, council, challenge, reopen, unknown, and failure outcomes.maestro searchsearches native work, decisions, notes, events, bundles, and imported Rust records.
Proof is layered as source, artifact, installed, live, and journey.
Claims stop at the last proven layer and name untested links rather than
rounding them up to completion. Repeated failures route by holder: Peer-held
work reaches the Lead through the repository brief; Lead-held work reaches the
Supervisor through the room brief.
Failed commands emit a JSON error envelope on stderr and exit nonzero. Empty or whitespace-only required arguments are rejected rather than interpreted as missing identities or targets.
Verb tour
maestro statusshows sessions and leases;maestro readyshows startable and gated work.maestro work add|start|note|done|show|listmanages the work lifecycle.maestro decision draft|lock|show|listmanages durable choices.maestro dispatch open|accept|show|liststores lane contracts, whilemaestro handback file|showstores and reads return packets.maestro attentionscans the current repository andmaestro briefsummarizes every registered repository.maestro recipe list|showserves methods;maestro plugin list|enable|disablemanages the configured extension set.maestro import rustimports preserved Rust data;maestro legacy showreads imported cards and files.maestro install,maestro update,maestro uninstall, andmaestro doctormanage and diagnose the source-installed runtime.maestro versionreports the package version and installed commit.
Attention and brief
maestro attention computes current attention packets at read time. It detects
stalled leases, repeated failures, stale decisions, scope collisions,
unreturned dispatches, and returned handbacks that have not been reviewed. It
records no mailbox message and runs no daemon.
maestro brief reads the registry in ~/maestro/registry, opens each project
in observer mode, and reports only what needs attention. Missing repositories
are named and skipped. When every registered project is running normally, the
brief says so in one line. The hm shell function focuses the Supervisor room
and prints this brief; it does not start an agent.
Observer mode
Set MAESTRO_READ_ONLY=1 to run Maestro as an observer. Pure commands such as
status, search, recipes, and read-only list/show operations remain available.
Mutating commands fail with READ_ONLY; external plugins are not loaded; and
session, lease, and liveness state is not persisted. Search fails closed if its
index cannot be refreshed rather than returning stale results as current.
Harness integration
maestro install writes managed adapters for Claude and Codex and merges only
the managed hook entries. SessionStart and UserPromptSubmit record the
session and print its current brief. Small managed blocks in CLAUDE.md and
AGENTS.md point agents to status, ready work, and recipes. No hook sends
mail, pushes a dispatch into another session, or delivers PostToolUse packets.
Recipes, skills, and plugins
maestro recipe list and maestro recipe show <name> serve the shipped
Markdown methods. The four installed skills drive bundle, design, work, and
verification lifecycles. maestro plugin lists and manages built-in, global,
and repository plugins; policy plugins remain removable instead of being
baked into the kernel.
Use maestro help for the complete verb list and maestro <verb> --help for
the current syntax and flags.
Rust-era data
The last Rust stores are preserved under legacy/rust/. Import the card store
read-only with:
maestro import rust --path legacy/rust/store.sqlite
Add --promote to create native work, decisions, and provenance notes:
maestro import rust --path legacy/rust/store.sqlite --promote
Promotion preserves card kinds, terminal outcomes, decision links,
supersession chronology, and receipt provenance. Orphan receipts are skipped
and counted. The legacy_map table makes repeated promotion idempotent.
Archived Rust snapshots can also be imported for search:
maestro import rust --path legacy/rust/archive-cards.sqlite
Bun decodes zstd snapshot payloads when possible and falls back to stored
search text when it cannot. Imported records remain available through
maestro search and maestro legacy show <id>. See
legacy/rust/README.md for the preserved datasets and
their exact counts.