trusty-mpm
Harness role: The Meta-Harness — PM-style multi-agent orchestration
over coding work. Manages multi-project sessions, relays hooks, and exposes an
MCP server to Claude Code sessions. Delegates coding tasks to trusty-code
(tcode). See
docs/architecture/harnesses.md for the
full three-harness architecture and delegation graph.
Why: A single cargo install trusty-mpm should install all trusty-mpm tooling — the background daemon, the CLI, the TUI dashboard, and the Telegram bot — without requiring users to install eight separate packages and coordinate their versions.
What: Unified crate combining the formerly separate trusty-mpm-{core,client,mcp,daemon,cli,tui,telegram} sub-crates into one package with a single [[bin]] target (tm / trusty-mpm) that exposes all functionality via subcommands.
Installation
From GitHub Releases (recommended for binary users)
Prebuilt binaries are available for macOS (Apple Silicon) and Linux (x86_64).
-
Open GitHub Releases, choose the newest
trusty-mpm-v<version>release, and download the archive for your platform. -
Extract and install:
-
Verify the installation:
From Source with Cargo
Requires Rust 1.94 or later (install Rust).
This builds from the latest commit on main and installs the binaries (tm and trusty-mpm) to ~/.cargo/bin/. Make sure ~/.cargo/bin/ is on your PATH.
To install a specific release, replace <version> with its tag version:
With Homebrew (recommended)
Or install directly without tapping:
Homebrew provides:
- Automatic updates via
brew upgrade trusty-mpm - Standard macOS / Linux PATH integration
- Easy dependency management
The formula depends_on "rtk", so a Homebrew install pulls it in: tm compress routes tool output through the rtk binary and falls back to a slower native compressor when it is absent. cargo install users install it separately with brew install rtk. Do not run rtk init — it installs a competing PreToolUse hook, and tm invokes rtk directly.
Prerequisites & Special Cases
System Requirements
- Node.js (optional): only needed if you plan to use the MPM JavaScript SDK or integrate with third-party JavaScript tooling. The daemon and CLI work independently of Node.
- OS: macOS 12+ or Linux. Windows support is not yet available.
Binaries Installed
This crate installs two binaries with the same functionality:
tm— shorter alias for quick accesstrusty-mpm— canonical name
Both are identical; choose whichever you prefer. The CLI (tm / trusty-mpm) discovers the running daemon automatically via the standard socket or HTTP port and requires no configuration beyond a running daemon.
Configuration
The daemon reads from ~/.config/trusty-mpm/config.yaml by default. See the trusty-mpm crate README for configuration examples and the full option reference.
Verify Installation
All installations can be verified by running:
Expected output: the semantic version of the installed binary (e.g., tm 0.6.2).
Feature Flags
| Feature | Description | Enables |
|---|---|---|
default |
Common install: CLI + daemon | cli, daemon |
cli |
tm / trusty-mpm binary |
daemon, tui, telegram |
daemon |
Daemon library module + daemon subcommand |
mcp |
mcp |
MCP server library module | — |
tui |
TUI library module (tm tui) |
ratatui, crossterm |
telegram |
Telegram bot library module (tm telegram) |
teloxide |
gui |
tm gui subcommand (non-default; pulls in Tauri/WebKit) |
trusty-mpm-gui (Tauri) |
Binary
There is a single binary with two install names: tm (short alias) and trusty-mpm (canonical name), both compiled from the same source.
| Binary | Feature | Description |
|---|---|---|
tm / trusty-mpm |
cli |
Unified CLI: daemon control, sessions, projects, TUI, Telegram, MCP |
All functionality previously in standalone shim binaries (trusty-mpmd, trusty-mpm-tui,
trusty-mpm-telegram, trusty-mpm-gui) is now accessed through subcommands:
trusty-mpm daemon, trusty-mpm tui, trusty-mpm telegram, trusty-mpm gui.
Library Modules
trusty_mpm::core // Domain types: agents, sessions, hooks, IPC protocol
trusty_mpm::client // Daemon HTTP client, command model, executor
trusty_mpm::mcp // MCP server: OrchestratorBackend trait + dispatch (feature: mcp)
trusty_mpm::daemon // Daemon library: API router, DaemonState, serve_http (feature: daemon)
trusty_mpm::tui // ratatui coordinator dashboard (feature: tui)
trusty_mpm::telegram // Telegram bot library (feature: telegram)
Quick Start
# Start the daemon
# Check status
# Launch a Claude Code session in the current directory
# Open the TUI dashboard
# Pair a Telegram bot
Token savings on the statusline
The tm statusline bar ends with a 💸 segment showing two whole-number
percents: 💸34%/29% is the latest savings row's own reduction, then the
mean across every savings row this session recorded (owner ruling
2026-09-15, #8063). Each row's percent is tokens_saved / tokens_before for
that row alone, so the badge reports what the last tool call actually saved
instead of diluting it across everything the session sent. With one row
recorded, both figures are that row's. Three producers write the saved side to
a ledger: instruction sources folded into one compiled prompt, bulk reads
diverted to a cheap worker, and bash or gate output shrunk by tm compress —
the segment itself folds the last two (#7867). A divert row's tokens are the
diverted files' count minus the returned summary's; a compress row's are the
input's minus the compressed form's, and a run that returned its input
unchanged writes none. The segment reads 💸— when nothing has been recorded
for the session, and it never renders 0%.
Rows live in ~/.trusty-mpm/usage/savings.jsonl and are folded at read time.
The figure is an estimate, and it is NOT subtractable from the cost segment
beside it. Mechanism, per-technique basis, and how to read the ledger:
docs/trusty-mpm/statusline-savings.md.
GUI Note
The Tauri desktop GUI lives in the separate trusty-mpm-gui crate (it owns
build.rs + tauri.conf.json which require Tauri's build system). The gui
feature of this crate wraps it as an optional dependency. Building the GUI
requires the Tauri prerequisites: xcode-select, rustup, pnpm.
Upgrading / Migration
The standalone shim binaries trusty-mpmd, trusty-mpm-tui, trusty-mpm-telegram,
and trusty-mpm-gui have been removed. Their functionality is now exposed through
subcommands of the single trusty-mpm (or tm) binary:
| Old binary | New command |
|---|---|
trusty-mpmd [--addr <addr>] |
trusty-mpm daemon [--addr <addr>] |
trusty-mpm-tui |
trusty-mpm tui |
trusty-mpm-telegram |
trusty-mpm telegram |
trusty-mpm-gui |
trusty-mpm gui (requires --features gui) |
Update any external references (launchd LaunchAgent plists, systemd units,
Docker CMD, shell aliases, CI scripts) that reference trusty-mpmd to use
trusty-mpm daemon --addr <addr> instead. No symlink or wrapper shim is
provided — this is a clean break with a documented migration path.
Example launchd plist update:
<!-- Before -->
/Users/you/.cargo/bin/trusty-mpmd
<!-- After -->
/Users/you/.cargo/bin/trusty-mpm
daemon
--addr
127.0.0.1:7880
Architecture
crates/trusty-mpm/
├── src/
│ ├── lib.rs # Re-exports core::* and client::*
│ ├── core/ # Domain types (agents, sessions, hooks, IPC)
│ ├── client/ # HTTP client + command model
│ ├── mcp/ # MCP server protocol (feature: mcp)
│ ├── daemon/ # HTTP daemon (feature: daemon)
│ ├── tui/ # ratatui dashboard (feature: tui)
│ ├── telegram/ # Telegram bot (feature: telegram)
│ └── bin/
│ └── tm/ # Single CLI entry point (compiled as both `tm` and `trusty-mpm`)
│ ├── main.rs
│ ├── cli.rs
│ ├── commands/
│ ├── formatters/
│ └── types.rs
└── tests/
├── e2e/ # HTTP-level daemon integration tests
└── test_session_lifecycle.rs