Skip to content

Rust workspace · MIT

Tooling for AI-assisted development, in one workspace.

trusty-tools is one Cargo workspace for the trusty-* ecosystem: hybrid code search, a memory palace, and a code-analysis sidecar, each with an MCP server.

License
MIT
MSRV
Rust 1.94
Prebuilt for
macOS arm64, Linux x86_64, Linux arm64

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. Five of the six flagship tools below speak the Model Context Protocol, so they plug into Claude Code and any other MCP client without a bespoke integration; the sixth is a command-line analytics tool.

Six flagship tools

Each one has its own page — what it does, how it works, and how to install it.

UNIT 01

trusty-search

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.44.0· 2026-08-10

  • Added Reindex now reports a per-stage wall-clock breakdown — hash-cache load, corpus carryover copy, batch pipeline, prune, HNSW commit, corpus commit, KG, and an explicit unattributed remainder — in the reindex phase timings log line and in the complete SSE event's timings object. This replaces the derived model_load_approx_ms residual, which folded five distinct stages into one number computed by subtraction, leaving the cost of a corpus carryover copy unmeasurable. Adds tests/reindex_stage_profile.rs, an #[ignore]d harness that prints cold and warm breakdowns against a throwaway temp corpus (#5024).
  • Fixed Updated doc comments, Cargo.toml, and CLAUDE.md that still named open-mpm as a consumer/orchestrator to say trusty-agents (renamed in #831), and removed an orphaned .open-mpm/agents/ fixture directory (2 stray .toml files, unreferenced by any code) that was left behind in the crate tree.
  • Fixed cargo test -p trusty-search compiles again. #5345 gave index_status and chunks a JSON body, changing their error type from StatusCode to (StatusCode, Json<Value>), but two assert_eq! calls in deleted_cold_parked_index_is_404_not_a_permanent_503 still compared the whole tuple against a bare StatusCode, so the lib-test target failed to build and took every gate on main with it. The three guards that test pins now destructure the response and assert both the 404 and the unknown index: <id> body, so a regression that returns 404 while still advertising restore_via is caught rather than passing on the code alone.

All changes →

UNIT 02

trusty-memory

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.22.0· 2026-07-27

  • Changed trusty-common requirement raised to ^0.27 (was ^0.26.2): 0.27.0 makes ChatEvent #[non_exhaustive], which a ^0.26 requirement cannot express. Because the re-exports above are public, this requirement change is itself the reason for the MINOR level.
  • Fixed Post-publish source drift — the SSE chat handler did not compile against the ChatEvent::Usage variant. src/chat/handler.rs gained its ChatEvent::Usage(_) arm in #4112, after 0.21.2 was published, so the published 0.21.2 artifact cannot build against any trusty-common carrying that variant. This release ships the arm. The match also gained a wildcard arm now that ChatEvent is #[non_exhaustive], so the next variant addition is no longer breaking here.

All changes →

UNIT 03

trusty-mpm

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
  • Remote control from Telegram or Slack when you are away from the terminal

trusty-mpm →

What’s new

1.3.5· 2026-08-10

  • Added BASE-AGENT.md (synced to trusty-code) adds a "Never Directly Monitor a Declarative Process" rule: run gates in their quiet/filtered form (--quiet, tail/grep for the summary line, or tm compress --tool "<tool-name>"), re-run only the failing case with full output, and never gh pr checks --watch. Prompted by two agents burning 415k and 546k tokens streaming per-test and per-check-poll output directly. States explicitly that filtered output is still raw output — the evidence rule is unchanged
  • Added BASE-AGENT.md (synced to trusty-code) now states a "No Subagent Fan-Out" rule: a delegated agent does its own work or reports back to its dispatcher — it never spawns its own subagents. The Agent/Task tool is reserved for the top-level PM/orchestrator. Prompted by a rust-engineer spawning an untyped child agent that bypassed the roster entirely for routine documentation work
  • Added BASE-AGENT.md (synced to trusty-code) adds "Agent-Authored Prose", extending the PM's "Write Plainly" register (core.md, #4757) to the agent side: review verdicts, reports back to the PM, ticket/PR body text, and generated documentation — lead with the concrete referent, state cause then effect, show before-and-after, cut hedges and process narration, end options as a bare enumeration. Governs how, never whether: the evidence rule is unchanged

All changes →

UNIT 04

trusty-analyze

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 one HTTP API and one MCP server

trusty-analyze →

What’s new

0.9.0· 2026-08-10

  • Breaking POST /webhooks/github is retired and now returns 404 (#5181, ADR-0034). GitHub deliveries reach trusty-analyze only through trusty-console's POST /api/webhooks/{source}, which verifies the HMAC once, spools the payload durably, and relays over UDS to trusty-analyze webhook-listen. The route is deleted rather than stubbed, so a delivery still aimed at it fails visibly at GitHub instead of being acknowledged and dropped. Anyone with a GitHub webhook pointed at trusty-analyze directly must repoint it at the console. The analysis pipeline is unchanged — the route's handler already delegated to webhook_drain, which the UDS path uses.
  • Breaking Removed public API: service::handlers::review::github_webhook_handler, core::verify_webhook_signature (and core::github::verify_webhook_signature), and AnalyzerAppState::{webhook_secret, with_webhook_secret}. This crate no longer verifies a webhook signature at all; that is trusty-console's single implementation (ADR-0034 §3), so the hmac, sha2 and hex dependencies are dropped.
  • Breaking webhook_listener::run now takes a TrustySearchClient, which it needs to run the analysis pipeline. Callers must pass the client they already build from --search-url (#5192).

All changes →

UNIT 05

trusty-review

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.14.0· 2026-08-10

  • Fixed The technical-DD report's §2 Executive Summary no longer renders _No data available — see Gaps & Caveats._ on a run without --synthesize (issue #5318). It was filled only from LLM synthesis prose, so every tga audit report collapsed the first section a diligence reader opens while listing real RED/AMBER findings in §5. §2 and its Top Risks table now roll up from the report's own data — applications, size, language mix, severity counts by dimension, and the application risk concentrates in — with the provenance of the figures used. Verified synthesis prose still wins when --synthesize runs. When nothing measurable was supplied, §2 now names the specific missing inputs (no metrics file, no --analyze fetch, no scannable checkout) instead of collapsing to the generic Gaps & Caveats pointer. The Top Risks table caps at five rows and now says so in the table itself ("Top 5 of 7 — 2 further RED/AMBER finding(s) are not listed here…"), so a reader who skims the table without the paragraph above it cannot mistake five rows for the whole risk picture.
  • Fixed The report's Data gaps: line now states how many gaps it lists and then lists exactly that many. It used to comma-join the labels straight after the colon, so a label carrying its template section number rendered as Data gaps: 2. Executive Summary, … — read as a count of two ahead of sixteen names. The count is now the length of the same slice the line joins, and items are separated with ; so a label's own comma or leading section number cannot be read as a count or a list boundary (#5319).

All changes →

UNIT 06

trusty-git-analytics

Developer analytics from git

  • Walks local repositories into SQLite, then classifies every commit
  • A tiered classification cascade, with an optional LLM tier at the end
  • Per-author and per-week velocity, quality, and DORA reporting
  • CSV, JSON, and Markdown output from one `tga analyze` run

trusty-git-analytics →

What’s new

2.14.0· 2026-08-10

  • Fixed A repository tga audit collected from stale local refs is now named in the report's Gaps & Caveats section, with its remote and the fetch error, and states that its data may be behind the true remote state. The sweep hard-codes --allow-stale, so an unreachable remote leaves the collect stage reporting ok; the per-repository fetch outcomes were printed to stderr and dropped, and a report over months-old refs was indistinguishable from a current one (#5321, DOC-67 §9). commands::collect::run_reporting_fetch is the new entry point that returns those outcomes — run and run_with_progress are unchanged and still return (). The sweep's terminal table qualifies the same stage as ok (N stale); a run where every remote was reached renders as before.
  • Fixed audit::run_full_sweep now reports every stage on the ProgressBus it is given, instead of discarding the parameter. Each of the eight stages emits a start event (naming the stage and its position in the run) and a completed/failed event under the new Stage::Audit, and the collection stage is handed that same bus so its per-repository events land there too. A None or disabled bus stays a no-op.

All changes →

The rest of the lineup

What else you can install today, and what is still being built. Shared libraries and internal tooling are left out — the workspace glob in the root Cargo.toml is the authoritative list of everything under crates/.

Also shipped

  • trusty-installer

    The tctl install and upgrade control plane

  • trusty-console

    Web dashboard over the trusty services you run

  • trusty-code

    Per-project coding harness (tcode)

  • trusty-gworkspace

    Google Workspace MCP server

In development

  • trusty-agents

    Agentic harness with multi-model routing (tagent)

  • trusty-channels

    Chat-channel MCP servers, starting with Slack

  • trusty-kb

    Personal knowledge base as an MCP server

  • trusty-sld-lint

    Linter for spec-linked documentation

  • trusty-mpm-gui

    Desktop dashboard for trusty-mpm

  • trusty-code-gui

    Desktop shell for the tcode daemon

Install

A bare tctl install brings up the seven 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-console · trusty-mpm

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.

Read the documentation

Guides, references, and architecture decisions for every crate.

Browse docs

trusty-tools

One Cargo workspace for the trusty-* tooling ecosystem. MIT licensed.

© 2026 · MIT · github.com/bobmatnyc/trusty-tools