Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
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 crates.io
trusty-mpm 1.8.0 is published on crates.io. Requires Rust 1.94 or later (install Rust).
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 1.8.0).
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 |
Binary
There is a single binary, tm. cargo install trusty-mpm also installs trusty-mpm,
a small compatibility alias that runs the tm installed beside it, so launchd plists
and hook commands written by older releases keep working.
| Binary | Feature | Description |
|---|---|---|
tm |
cli |
Unified CLI: daemon control, sessions, projects, TUI, Telegram, MCP |
trusty-mpm |
cli |
Compatibility alias: execs the sibling tm with the same arguments |
All functionality previously in standalone shim binaries (trusty-mpmd, trusty-mpm-tui,
trusty-mpm-telegram) is now accessed through subcommands:
tm daemon, tm tui, tm telegram.
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
What's in 1.8
tm pr open tags a phase pull request with its [EPIC_N PHASE_M] issue title. tm doctor gains a worktree_registry row. tm services init starts trusty-search with --no-http, and port and url for trusty-search exit 1 naming the socket. See the CHANGELOG for the full list, including the breaking ServiceDecl change.
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
There is no desktop GUI. The Tauri client (trusty-mpm-gui) and tm gui were
retired (#7964); the fleet dashboard is hosted by trusty-console (#6924).
Upgrading / Migration
The standalone shim binaries trusty-mpmd, trusty-mpm-tui, and trusty-mpm-telegram
have been removed. Their functionality is now exposed through
subcommands of the single tm binary:
| Old binary | New command |
|---|---|
trusty-mpmd [--addr <addr>] |
tm daemon [--addr <addr>] |
trusty-mpm-tui |
tm tui |
trusty-mpm-telegram |
tm telegram |
Update any external references (launchd LaunchAgent plists, systemd units,
Docker CMD, shell aliases, CI scripts) that reference trusty-mpmd to use
tm 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/tm
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