Multi-repo Integration Tool. Manage multiple repositories as a unified workspace without git submodules. Supports both Git and Sapling as VCS drivers. Designed for both humans and AI agents.
brew install opentreehq/tap/mit# Initialize a new workspace
mit init
# Clone all repos defined in mit.yaml
mit clone
# Check workspace status
mit status
# Pull latest on all repos
mit sync
# Run a command across all repos
mit run "git log --oneline -5"
# Semantic search (requires full build)
mit index
mit search "rate limiting logic"A workspace is defined by a mit.yaml file at the root:
# yaml-language-server: $schema=https://raw.githubusercontent.com/gabemeola/mit/refs/heads/main/mit.schema.json
version: "1"
workspace:
name: my-project
description: "A multi-repo project"
repos:
service-a:
url: git@github.com:org/service-a.git
branch: main
service-b:
url: git@github.com:org/service-b.git
path: custom-path # defaults to repo name
branch: develop| Command | Description |
|---|---|
mit init |
Create mit.yaml in current directory |
mit clone [--vcs git|sl] |
Clone all repos |
mit add <url> |
Add a repo and clone it |
mit remove <name> |
Remove a repo from mit.yaml |
mit list |
List all repos with metadata |
mit doctor |
Validate workspace health |
| Command | Description |
|---|---|
mit status |
Aggregated status of all repos |
mit sync |
Pull latest default branch for all repos |
mit pull |
Pull current branch for all repos |
mit push |
Push repos with local commits |
mit fetch |
Fetch all remotes in parallel |
mit switch <branch> |
Switch branches (--create to create) |
mit branch |
List branches (--common for shared) |
mit commit -m "msg" |
Commit in all dirty repos |
mit diff |
Show diffs across all repos |
mit log |
Interleaved commit log |
mit grep <pattern> |
Search across all repos |
mit run <cmd> |
Run a shell command in each repo |
| Flag | Description |
|---|---|
--repos <names> |
Filter to specific repos (comma-separated) |
--exclude <names> |
Exclude specific repos |
-j <N> |
Parallelism (default: num CPUs) |
--output json|table|plain |
Output format |
-q, --quiet |
Suppress progress output |
--dry-run |
Show what would be done |
mit is designed to be used by AI agents for navigating and understanding large multi-repo codebases. All commands support --output json for structured output.
mit includes a local semantic search engine powered by llama.cpp and the qwen3-embedding model. Embeddings are computed entirely on-device -- no API calls or external services.
# Build the index (incremental -- only re-indexes changed files)
mit index
# Force a full rebuild
mit index --rebuild
# Check index health
mit index --statusOn first run, mit index downloads the embedding model (~400MB) to ~/.mit/models/ and indexes all files across every repo in the workspace. Subsequent runs are incremental -- only files that changed since the last index are re-embedded.
The index is stored in .mit/state.db (SQLite). Files are split into ~50-line chunks that respect function/class boundaries, and each chunk is embedded into a 1024-dimensional vector.
# Semantic search across all repos
mit search "rate limiting middleware"
# Limit results
mit search --limit 5 "database connection pooling"
# Show matching source code inline
mit search --content "error handling in auth"
# JSON output for programmatic use
mit search --output json "retry logic"Results include the repo name, file path, line range, and a relevance score:
web-api:src/middleware/rateLimit.ts:1-50 (0.847)
engine:lib/throttle/limiter.go:23-71 (0.812)
With --content, the matching source lines are displayed inline beneath each result.
mit search --output json "query"{
"version": "1",
"command": "search",
"timestamp": "2026-03-27T10:00:00Z",
"success": true,
"results": [
{
"repo": "web-api",
"file": "src/middleware/rateLimit.ts",
"line_start": 1,
"line_end": 50,
"score": 0.847
}
],
"summary": { "matches": 2 }
}An agent can use mit index + mit search to quickly locate relevant code across a large workspace before making changes:
# 1. Discover the workspace layout
mit discover
# 2. Build/update the semantic index
mit index
# 3. Find relevant code
mit search --output json --limit 10 "authentication flow"
# 4. Read the matching files and make changes
# ...
# 5. Verify workspace state
mit status --output jsonWorktrees let agents work in isolated copies of every repo without affecting the main checkout:
# Create worktrees across all repos
mit worktree create feature-auth
# List active worktrees
mit worktree list
# Clean up when done
mit worktree remove feature-authFor Git repos this uses git worktree add (fast, shares object store). For Sapling repos it falls back to sl clone.
Multiple agents can coordinate work through mit's task system, backed by SQLite with WAL mode for safe concurrent access:
# Create tasks
mit task create "Refactor auth middleware" --repo web-api
# Agent discovers available work
mit task list --status open --output json
# Agent atomically claims a task (fails if already claimed)
mit task claim <id> --agent agent-1
# Agent marks work as done
mit task update <id> --status doneAgents can persist knowledge and discover reusable workflows:
# Store an observation
mit memory add "web-api uses RabbitMQ for async messaging to the scheduler"
# Search memories
mit memory search "messaging"
# Discover available skills
mit skill list
mit skill show run-backend-tests| Command | Description |
|---|---|
mit discover |
Full workspace topology as JSON |
mit guide |
Comprehensive guide to all mit features (designed for LLM consumption) |
mit context |
Auto-generate workspace context document |
mit deps |
Analyze inter-repo dependencies |
mit doctor --output json |
Machine-readable health check |
All binaries are output to ./dist/.
| Task | Platform | Output |
|---|---|---|
task build |
Auto-detect | dist/mit |
task build:macos-arm64 |
macOS Apple Silicon | dist/mit |
task build:macos-amd64 |
macOS Intel | dist/mit-macos-amd64 |
task build:linux-amd64 |
Linux x86_64 | dist/mit-linux-amd64 |
task build:linux-arm64 |
Linux aarch64 | dist/mit-linux-arm64 |
task build:windows-amd64 |
Windows x86_64 | dist/mit-windows-amd64.exe |
task build-lite |
Any (no CGo) | dist/mit |
Cross-compilation from macOS uses Zig as the C/C++ toolchain. Linux and Windows targets are CPU-only; macOS uses Metal + Accelerate.
# Clone with submodules
git clone --recurse-submodules https://github.com/opentreehq/mit.git
cd mit
# Build for your current platform
task build
# Or install to $GOPATH/bin
task installIf you don't need mit index / mit search, you can build without CGo or llama.cpp:
task build-liteThis produces a smaller binary without the index and search commands.
# Run tests
task test
# Run tests with verbose output
task test-verbose
# Run tests with coverage
task test-coverage
# Lint
task lint
# Clean all build artifacts
task clean- Default build: includes llama.cpp embedding support via CGo. Requires CMake and the llama.cpp submodule.
noembed: excludes all embedding code. No CGo required.mit indexandmit searchcommands are omitted from the binary entirely.
- Create
command/<name>.go - Define an exported constructor
func NameCommand() *cli.Commandreturning a*cli.Command - Add the constructor call to the command list in
cmd/mit/main.go - If the command depends on embeddings, place it in
command/embedcmd/and add it tocmd/mit/embed.go
Cross-compilation uses Zig as a drop-in C/C++ compiler via CMake toolchain files in cmake/. Each target has:
- A CMake toolchain file (e.g.,
cmake/zig-linux-x86_64.cmake) - Wrapper scripts for
zig cc/zig c++(required because CMake needs a single executable path) - Platform-specific CGo linker flags in
embedding/llama/cgo_<platform>.go
To add a new cross-compilation target:
- Add wrapper scripts in
cmake/for the new zig target triple - Add a CMake toolchain file referencing those wrappers
- Add
build-llama:<os>-<arch>andbuild:<os>-<arch>tasks toTaskfile.yml - Add a
cgo_<platform>.gofile with the appropriate#cgo LDFLAGS