Distributed terminal multiplexing & fleet management for AI agent oracles — Rust port of maw-js.
On macOS Apple Silicon, install the stable prebuilt binary and zsh completions without a Rust toolchain:
brew install soul-brews-studio/maw/mawSee docs/install.md for upgrades, pinned CI installs, the release
installer, and source builds.
macOS Apple Silicon and Linux x86_64 prebuilt binaries are published on tagged releases.
The installer downloads the matching asset, verifies its .sha256 sidecar, backs
up any existing maw, and installs to ~/.local/bin/maw by default.
Stable release installer:
curl -fsSL https://github.com/Soul-Brews-Studio/maw-rs/releases/latest/download/install.sh | shBleeding-edge installer from alpha:
curl -fsSL https://raw.githubusercontent.com/Soul-Brews-Studio/maw-rs/alpha/install.sh | shPin the installer and binary to a specific release (day-based CalVer tags, e.g. v26.7.16):
curl -fsSL https://github.com/Soul-Brews-Studio/maw-rs/releases/download/v26.7.16/install.sh | MAW_VERSION=v26.7.16 shOptions:
MAW_VERSION=v26.7.16 sh install.sh
INSTALL_DIR="$HOME/bin" sh install.sh
sh install.sh --version v26.7.16 --install-dir "$HOME/bin"Supported prebuilt platforms:
maw-rs-macos-arm64— macOS Apple Siliconmaw-rs-linux-x86_64-musl— Linux x86_64 static binary
Manual fallback:
- Download the matching binary and
.sha256sidecar from a release. - Verify the SHA-256 hash.
chmod +xthe binary and move or symlink it asmawin yourPATH.
If ~/.local/bin is not on PATH, add it to your shell profile. If macOS
Gatekeeper blocks the binary, run:
xattr -d com.apple.quarantine ~/.local/bin/mawmaw-rs is intentionally starting with deterministic, side-effect-free crates.
Each crate copies the same JSON fixture contract from maw-js/test/spec/ and
must pass those fixtures in Rust before runtime IO, transports, or CLI commands
move over.
maw-rs supports native Rust-WASM plugin builds. The supported authoring path is:
maw plugin create --rust my-plugin
cd my-plugin
maw plugin buildThat path builds a wasm32-unknown-unknown artifact with Cargo, writes a
dist/plugin.json artifact contract, and is loaded through the native Extism
WASM runtime.
The maw-rs ship-tier WASM builder does not yet compile JS/TS source: it vendors
no JS-to-WASM compiler, and the pinned host has no Bun subprocess fallback. This
is a boundary of that deployment path, not a ban on Bun; Bun/JS fleet plugins and
dev-tier surfaces remain first-class alongside Rust. A JS/TS plugin entering the
ship-tier WASM host must currently provide a prebuilt artifact with target = "wasm" and a relative wasm path in plugin.json. A future Javy/QuickJS-style
toolchain would need a separate design and security review.
Cargo workspace scaffolded and pushed to main.
| Crate | maw-js source | Portable fixture |
|---|---|---|
maw-matcher |
src/core/matcher/resolve-target.ts, normalize-target.ts |
matcher-resolve-target.fixtures.json, normalize-target.fixtures.json |
maw-calver (external repo since 2026-07-15, consumed as a pinned git dependency) |
scripts/calver.ts |
calver.fixtures.json |
maw-policy |
src/plugin/default-active.ts, src/plugin/tier.ts, src/plugin/manifest-constants.ts |
plugin-policy.fixtures.json |
maw-worktree |
src/core/fleet/worktree-window-match.ts |
worktree-window-match.fixtures.json |
maw-transport |
src/core/transport/transport.ts |
transport-router.fixtures.json |
maw-routing |
src/core/routing.ts |
routing.fixtures.json |
maw-identity |
src/core/fleet/session-name.ts, src/core/fleet/node-identity.ts, src/core/fleet/validate.ts |
canonical-session-name.fixtures.json, canonical-node-identity.fixtures.json, test/validate-oracle-name.test.ts |
maw-bring |
src/commands/shared/bring-flags.ts |
bring-to-flag.fixtures.json, bring-to-target.fixtures.json, bring-self-guard.fixtures.json |
maw-split |
src/vendor/mpr-plugins/split/impl.ts, src/commands/plugins/tmux/safety.ts |
split-policy.fixtures.json |
maw-peer |
src/commands/shared/peer-sources.ts |
peer-source-resolver.fixtures.json |
maw-tmux |
src/core/transport/tmux-class.ts, src/commands/shared/discover-live-state.ts |
tmux parser unit tests, discover-tmux-live-state.fixtures.json |
maw-hub |
src/transports/hub-config.ts |
test/isolated/hub-config.test.ts, hub config loader coverage |
maw-feed |
src/lib/feed.ts |
test/isolated/feed-lib-coverage.test.ts |
maw-auth |
src/lib/federation-auth.ts |
federation auth pure helper and O6 decision tests |
maw-xdg |
src/core/xdg.ts, src/core/paths.ts, src/cli/instance-preset.ts |
test/core-xdg.test.ts, test/paths.test.ts, test/00-resolve-home.test.ts |
maw-bind |
src/core/bind-host.ts |
test/bind-heuristic.test.ts |
maw-fuzzy |
src/core/util/fuzzy.ts |
test/fuzzy-match.test.ts |
maw-plugin-scaffold |
src/commands/shared/plugin-create-scaffold.ts |
test/plugin-create.test.ts (pure validation/manifest cases) |
maw-plugin-manifest |
src/plugin/manifest-validate.ts |
test/plugin-manifest-validate-edges.test.ts (cli/api validators) |
Current local gates:
cargo test --workspace
cargo clippy --workspace --all-targets -- -D warnings- Add side-effecting transport implementations behind the
maw-transportpolicy:- tmux via the
tmuxCLI - HTTP federation via injectable IO first; runtime HTTP client wiring later
- Zenoh via the Rust stylos/themion ecosystem
- tmux via the
- Add runtime adapters for fleet/worktree/session discovery around the pure crates.
- Keep maw-js and maw-rs running side-by-side until command parity is proven.
- Add a
maw-rsCLI withclap. - Port high-value fast-path commands first:
ls,hey,peek, and target resolution helpers. - Validate each command against maw-js fixtures or captured golden outputs before replacing any default
mawentrypoint.