What trusty-tools is
A single Cargo workspace holding the whole trusty-* family — shared libraries, daemons and MCP
servers, a multi-agent platform, and an orchestrator. Everything is co-located under crates/, so a change spanning several of them is one commit
against one lockfile.
Each crate versions, tags, and publishes independently, and everything is MIT licensed. All
five flagship tools below speak the Model Context Protocol, so they plug into Claude Code and
any other MCP client without a bespoke integration.
Five flagship tools
Each one has its own page — what it does, how it works, and how to install it.
trusty-git-analytics (tga) and trusty-audit have moved to their own site, tga.trustytools.dev.
Until it is live, see the repository.
UNIT 01
Hybrid code search
- BM25, vector, and knowledge-graph retrieval fused with Reciprocal Rank Fusion
- One machine-wide daemon, unlimited named project indexes
- Query-intent routing across definition, usage, conceptual, and bug/debt lookups
- Branch-aware ranking and caller/callee chain expansion
trusty-search →
What’s new
0.63.0· 2026-11-07
- Added index_status embed_window.window now reports the sidecar's real input window, and the embed pass counts truncation against it (#9284). A sidecar that sends no window leaves it null.
- Added Per-index searches report where their time went (#10195). The search log line and the new meta.timings reply object carry resolve_ms (index lookup, including a cold lazy load), lock_ms, embed_ms, vector_ms, lexical_ms, ripgrep_ms, fusion_ms, rehydrate_wait_ms, total_ms, and whether the query started a corpus rehydrate (rehydrate_ran) or ran while the vector index promoted its mmap view (hnsw_promoted).
- Added latency_ms now starts before the index is resolved, so a search that lazy-loads a cold index counts the load.
All changes →
UNIT 02
Memory palace storage
- Named palaces, one per project, with rooms and wings inside them
- Hybrid BM25 + vector recall over an HNSW index and a redb store
- A knowledge graph of subject/predicate/object triples alongside the prose
- A dream cycle that consolidates near-duplicates instead of hoarding them
trusty-memory →
What’s new
0.36.5· 2026-11-07
- Fixed the uncached-palace console metrics test waits for the aborted KgWriter task before it reads the disk, which removes a flaky failure (Refs #10515)
- Fixed memory_note and memory_remember no longer skip a fact_key slot rewrite as a near-duplicate. A new value that differs from the slot's occupant by a few characters, such as a step number, now replaces the occupant instead of leaving the stale value in recall. Writes without an admitted slot keep the 5-minute near-duplicate window (#10643).
- Fixed A malformed expires_at on either tool is now an error even when the content would also trip a content gate; it no longer returns a "skipped" success envelope (#10643).
All changes →
UNIT 03
Multi-agent orchestration
- One `tm` binary: daemon, CLI, TUI dashboard, and MCP server
- Sessions and worktrees per project, tracked across restarts
- Claude Code lifecycle hooks relayed into the daemon
- A statusline estimate of the tokens the harness kept out of the session
- Remote control from Telegram or Slack when you are away from the terminal
trusty-mpm →
What’s new
1.12.0· 2026-11-07
- Breaking cargo-semver-checks reports breaking changes in trusty-mpm 1.12.0 against 1.11.1, mostly in TUI-internal types (tui::project_ctl, tui::home), plus the field SessionRecord.tmux_socket added in #10786 (constructible_struct_adds_field). The owner ruling D35 (2026-11-02) keeps the version at 1.12.0, because these are internal structs and not a supported library API.
- Added tm doctor --fix --dry-run states the preview explicitly and refuses --yes; tm doctor --fix --only <check> (repeatable) runs only the named checks' repairs, in their fixed order, and an unknown check id is an error. The dry-run hint keeps the --only scope (#10425).
- Added tm doctor --fix prints a NOT EVALUATED line for each repair it could not run (no cwd, no home, no managed CLAUDE_CONFIG_DIR, an undetermined Rust build environment) instead of omitting it, so a preview never reads as "no change" for a repair it did not evaluate (#10425).
All changes →
UNIT 04
Code analysis sidecar
- Cyclomatic and cognitive complexity per chunk, file, and index
- Code-smell detection with configurable thresholds and named categories
- Git-blame temporal decay, so stale complex code sorts to the top
- Tree-sitter adapters for 14 languages, behind a Unix socket and one MCP server
trusty-analyze →
What’s new
0.13.0· 2026-11-07
- Breaking trusty-analyze 0.12.7 ships a public-API break under the internal numbering
policy (owner ruling 2026-09-26); recorded in scripts/semver-accepted-breaks/trusty-analyze-0.12.7.txt (Refs #8699).
- Added trusty_analyze::lsp: an on-demand stdio language-server client and child manager, off unless ANALYZE_LSP=1 (DOC-72 §2). It spawns rust-analyzer once per workspace root in its own process group, frames LSP messages with Content-Length, correlates requests with a per-request timeout, versions documents read from disk (didOpen at 1, didChange only when the content hash changes), and returns typed errors (lsp_disabled, lsp_not_installed, lsp_initialize_failed with the stderr tail, lsp_timeout, lsp_hung, lsp_stale, …). An idle server is killed after 2 minutes (ANALYZE_LSP_IDLE_SECS); every write is bounded by the request timeout, and a server that stops reading its stdin is killed as hung; a crashed or hung one is reported, not respawned in a loop; and no child outlives the daemon's idle exit, SIGTERM, drop or panic. No socket method uses it yet (Refs #9078).
- Added With ANALYZE_LSP=1, every analyze.lsp_* call pushes two events to the trusty-events bus as source analyze (DOC-72 §4): ActionEvent::Tool with phase started, then finished or errored, sharing one call_id. The tool names are lsp.textDocument/references, lsp.publishDiagnostics and lsp.analysed_at. The Started event's parent_id is the call's parent_event_id; the terminal event's parent_id is the Started event. Events carry metadata only, in attrs: language, position, workspace, document version, snapshot, result_count, duration_ms and outcome (ok or the lsp_* error code). They carry no source text, no diagnostic messages and no absolute path under $HOME (shown as ~/...). Pushes only buffer, bounded and counted, so a missing or slow bus never delays or fails a call; a flush runs every second and once, bounded to 1 s, on idle exit, on SIGTERM and when serve --mcp ends on stdin EOF (the daemon task is now stopped through its exit path instead of aborted). With the flag off nothing is pushed and the bus socket is not resolved (Refs #9078).
All changes →
UNIT 05
LLM code review
- Reviews a GitHub PR, a git ref range, or a diff on stdin
- Injects code context from trusty-search and metrics from trusty-analyze
- A letter grade alongside an APPROVE / REQUEST_CHANGES / BLOCK verdict
- Skips a review it cannot ground rather than issue a confident guess
trusty-review →
What’s new
0.40.0· 2026-11-07
- Breaking pipeline::prompt_templates::SYSTEM_PROMPT_STOCK and SYSTEM_PROMPT_COVERAGE_GATING are removed. The prompt builders reviewer_system_prompt, reviewer_system_prompt_with_coverage, build_system_prompt, build_system_prompt_with_coverage, build_review_prompt and build_review_prompt_with_coverage take the prompts as a new first argument, &ReviewerPrompts, read with ReviewerPrompts::load or ReviewerPrompts::from_content. mapreduce::MapContext gains a prompts field. pipeline::ReviewerPrompts, pipeline::PromptContentError and ReviewOptions::with_prompts are new (#9015).
- Breaking pipeline::build_voice_config (and pipeline::voice_config::build_voice_config) returns Result<VoiceConfig, PromptContentError>. review_template::ReviewTemplateError and voice::VoiceLoaderError gain a Content(PromptContentError) variant; neither enum is #[non_exhaustive], so an exhaustive match needs the arm (#9015).
- Breaking New module runtime_content: CONTENT_DIR, CHECKOUT_ENV, REMEDY, content_path, describe_source, dev_override, resolve_with, resolve_for_process, require_text and PromptContentError, which moved here and gains a CheckoutOverride variant; pipeline::prompt_templates re-exports PromptContentError, REMEDY and describe_source. report::ReportError gains a Content variant and report::TemplateLoader gains with_content (#9015).
All changes →
Install
A bare tctl install brings up the eight managed crates in dependency
order. Name one to install just that crate and whatever it needs at runtime.
Bootstrap, then tctl
Recommended. No Rust toolchain needed on a supported platform. Resolves the runtime dependency graph, and keeps macOS signing grants stable across upgrades.
curl -sSf https://raw.githubusercontent.com/bobmatnyc/trusty-tools/main/install.sh | sh
tctl install
Homebrew
Ten formulae in the tap. Installs one binary, without the dependency resolution tctl does.
brew tap bobmatnyc/trusty
brew install bobmatnyc/trusty/trusty-search
From source
Requires Rust 1.94. cargo install writes atomically — never copy a built binary onto your PATH on macOS.
git clone https://github.com/bobmatnyc/trusty-tools
cd trusty-tools
cargo install --path crates/trusty-search --locked
Managed by tctl
trusty-search · trusty-memory · trusty-analyze · trusty-review · tga · trusty-events · trusty-console · trusty-mpm · trusty-installer
The bootstrap installer verifies every downloaded tarball against its published SHA-256
checksum. The install script itself is unsigned — read it first if you need higher assurance.
Installing one specific product? The install walkthrough has the exact sequence for each of the eight, what it needs first, and the macOS permission it asks
for.