Skip to main content

A terminal-native multi-agent command center

Project description

maestro

A terminal-native multi-agent command center. Spawns AI/CLI agents in real PTYs and shows them in switchable panes with a session timeline — all inside one TUI.

Install

Maestro is a Python CLI (needs Python 3.11+ and a claude on your PATH). Install it on any device with pipx so it lands in its own isolated venv with the maestro command on your PATH:

pipx install "git+https://github.com/jmbmunda/maestro.git"

Or run it once without installing, using uv:

uvx --from git+https://github.com/jmbmunda/maestro.git maestro

Update later with pipx upgrade maestro. Pin a release with ...@v0.1.0.

From source (development)

git clone https://github.com/jmbmunda/maestro.git && cd maestro
python3 -m venv .venv && source .venv/bin/activate
pip install -e .

Run

maestro

Keys

Each pane is a real terminal (full ANSI: colors, cursor, alt-screen), so claude, vim, htop etc. render correctly. Maestro has two modes:

OUTSIDE (default — manage panes):

  • Ctrl+S — spawn a claude agent in a new pane
  • Ctrl+Shift+S — spawn a $SHELL agent (terminal-dependent; see note)
  • Ctrl+W — dismiss the focused pane (confirms first if it's still running)
  • r — rename the focused pane (blank resets to the default pane-N · claude)
  • b — broadcast one prompt to multiple panes at once (pick targets, type, Enter)
  • a — quick agents: launch a pre-seeded role, or create/edit/delete templates
  • Ctrl+J / Ctrl+K — focus next / previous pane
  • Ctrl+L — cycle layout: split → grid → focused
  • Ctrl+B — toggle the sessions status panel
  • Ctrl+A — toggle the agents panel (off by default)
  • Ctrl+T — toggle the timeline
  • / — open the skills launcher (pick a skill → injects /name into the focused pane)
  • Enter — step INSIDE the focused pane to interact with it
  • q — quit (also Ctrl+Q, where the terminal doesn't grab it — the VSCode integrated terminal does)

INSIDE (drive one agent): every keystroke goes straight to that pane's terminal — arrows, Esc, Tab, Shift+Tab (cycle Claude modes), Option+Enter (newline), Option+←/→ (word motion), Ctrl-C, everything. The one reserved key is Ctrl+], which steps back OUTSIDE.

Heads-up: Ctrl+] is reliable everywhere (terminals send it as a single byte, 0x1d). Ctrl+Esc also works as a fallback, but only in terminals that transmit it distinctly (kitty keyboard protocol / modifyOtherKeys=2). The footer reflects the mode — while INSIDE it shows just Ctrl+] Exit pane; OUTSIDE it shows the command list.

Scroll back through a pane's history — every pane has a real scrollbar: drag the thumb, click the trough to page, or mouse-wheel over the pane (works INSIDE or OUTSIDE, including finished panes). While OUTSIDE, PageUp/PageDown page the focused pane. The border title shows ⇡N (scrolled) while you're above the live view; the pane keeps following new output while parked at the bottom and stays put once you scroll up — typing INSIDE snaps you back to the live bottom. Up to ~2000 lines are kept per pane.

Click a pane to focus + interact in one step — clicking auto-enters that pane, no separate Enter needed. Clicking a different pane while INSIDE another stays INSIDE the new one. Clicking a finished pane drops you back OUTSIDE. In focused layout, click a row in the panes strip to switch.

(Keyboard nav Ctrl+J/Ctrl+K still moves focus without auto-entering, so you can chain commands like spawn → navigate → spawn → … without stepping in.) The background is transparent, so maestro inherits your terminal's wallpaper/theme.

Quick agents

Press a (OUTSIDE) for one-click specialized agents. A quick agent is a template — a name + a starting prompt + an optional skill — that spawns a claude pane, names it, injects the skill and prompt, and drops you inside. Ships with built-ins (Reviewer, Tester, Security, Docs, Refactor) and is fully CRUD-able in-app: Enter launches the highlighted one, n new, e edit, d delete. Templates live in a hand-editable ~/.config/maestro/quick-agents.toml (seeded on first run).

Broadcast

Press b (OUTSIDE) to fan one prompt out to several sessions at once: a modal lists the running panes (all checked by default — Space toggles), you type a prompt, and Enter sends it to every checked pane. Great for "run the same task across N agents" or kicking off a fleet. Uncheck any pane (e.g. a $SHELL) you don't want.

Skills

Press / (OUTSIDE) to open the skills launcher — a filterable list of the skills in ~/.claude/skills (and a project's .claude/skills). Pick one and maestro types /name into the focused pane and steps you inside, exactly as if you'd typed it in Claude. (Typing /name yourself while INSIDE still works too.)

Maestro also watches each pane's output for Claude's skill markers and shows the active skill as a ⚡<skill> badge on the pane's border (best-effort — it keys off Claude's output text).

Status board

Maestro shows, at a glance, which sessions need you. Each pane gets a best-effort status inferred from output timing:

  • working — producing output right now
  • waiting — alive but quiet → needs you (a question, an approval, or just done with its turn); the pane border glows amber
  • done — exited cleanly · failed — exited non-zero

There's a dedicated sessions panel on the left listing every pane with its status, your terminal's own title bar summarises it (e.g. maestro ▶2 ⏳1 ○1), and each pane border reflects it too. (Heuristic: maestro can't tell "waiting for approval" from "waiting for your next message" — both show as ⏳ waiting.) The focused pane stands out with a colored border (green while you're INSIDE it) and full-brightness text, while non-focused panes are dimmed. The sessions panel is on by default (toggle with Ctrl+B); a second agents panel with the same rows is off by default (toggle with Ctrl+A); the timeline event log is off by default (toggle with Ctrl+T).

Theme

Maestro defaults to the ansi-dark theme, which draws with your terminal's own 16-colour palette — so it adapts to whatever colour scheme your terminal uses. Press Ctrl+P → "Change theme" to pick another (ansi-light for light terminals, or any of Textual's built-ins like gruvbox / dracula). Your choice is remembered in .maestro/state.json.

Note: Ctrl+Shift+S relies on the terminal forwarding shift+ctrl combos; some terminals fold it into Ctrl+S. claude is the default spawn either way.

Ctrl+] is the only key maestro reserves while INSIDE, so apps that use it (e.g. vim's tag-jump) won't see it.

Layouts

  • split — vertical stack; auto-promotes to grid once a 4th pane spawns
  • grid — auto-shaped tiles (2×2, 2×3, 3×3, then a scrollable 3×N)
  • focused — one large pane plus a left strip of status tiles for the rest

When an agent exits cleanly (exit=0) the pane is auto-dismissed — no frozen-screen confusion. Failed exits (non-zero) stay sticky so you can read what went wrong; press Ctrl+W to dismiss those.

Layout

┌─timeline──────────────────────────────────────────┐
│ 16:18:30 spawn  pane-1 claude                      │
│ 16:18:42 spawn  pane-2 /bin/zsh -l                 │
└────────────────────────────────────────────────────┘
┌─panes──┐ ┌─● pane-1 · claude · INSIDE — Ctrl+] to exit┐
│ ● 1 cla│ │                                            │
│ ○ 2 sh │ │   (live terminal — claude renders here)    │
│ ◄      │ │                                            │
└────────┘ └────────────────────────────────────────────┘

(The panes strip only appears in focused layout. A pane's border turns heavy/green while you're INSIDE it.)

Where things live

  • maestro/app.py — Textual app, key bindings, focus-toggle, spawn/dismiss/focus
  • maestro/panes.pyPane model + PaneManager state machine (Textual-agnostic)
  • maestro/layouts.py — split / grid / focused renderers + the focus tiles strip
  • maestro/terminal.py — pyte-backed Emulator, TerminalView, query responder, key encoder
  • maestro/agent.py — PTY-backed subprocess wrapper (ptyprocess); raw bytes + resize
  • maestro/events.py — append-only JSONL event log (.maestro/session.jsonl)

.maestro/state.json persists your layout + timeline-visibility choices across restarts. Agent sessions themselves are not resumed.

Tests

pip install -e '.[test]'
pytest

Next steps

  • Provider adapters beyond claude / $SHELL (codex, gemini, gh copilot)
  • Claude Code skill passthrough (toggle ~/.claude/skills per pane)
  • Prompt library + per-agent system prompts
  • Inter-agent message bus for "review on modify" workflows
  • Terminal niceties: mouse reporting, bracketed paste, configurable INSIDE-exit key

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

maestro_tui-0.1.2.tar.gz (94.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

maestro_tui-0.1.2-py3-none-any.whl (51.1 kB view details)

Uploaded Python 3

File details

Details for the file maestro_tui-0.1.2.tar.gz.

File metadata

  • Download URL: maestro_tui-0.1.2.tar.gz
  • Upload date:
  • Size: 94.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for maestro_tui-0.1.2.tar.gz
Algorithm Hash digest
SHA256 dddd89f421ebc0d7884f99837346da0f55bfec6633ee3294ce85184fabe22085
MD5 011e655b69399253d8058b66781b0b77
BLAKE2b-256 4b66d33428800e41da6f4a4dc3781a8734e7636ab758613ec670947305981fe0

See more details on using hashes here.

Provenance

The following attestation bundles were made for maestro_tui-0.1.2.tar.gz:

Publisher: release.yml on jmbmunda/maestro

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file maestro_tui-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: maestro_tui-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 51.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for maestro_tui-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 635b621f8754ae5620999bff29cbb0d4a005b5eb35a5d96dd1c7b91c9594065f
MD5 59238aec04d43b5cc7dbe8f3fb7c409b
BLAKE2b-256 13f1f2b5d7a321544c90a9a29a29bd806f06f279902b48f3bba6984c6e1830e1

See more details on using hashes here.

Provenance

The following attestation bundles were made for maestro_tui-0.1.2-py3-none-any.whl:

Publisher: release.yml on jmbmunda/maestro

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page