npm.io
4.0.0 • Published 2d agoCLI

@rousan/mx

Licence
MIT
Version
4.0.0
Deps
0
Size
389 kB
Vulns
0
Weekly
0

mx

mx ("multiplexer") runs several features in parallel across shared repos using git worktrees. Each feature gets an isolated environment — its own worktrees, branches, and ports — so you switch between features instantly without stashing or branch-juggling.

mx manages a runtime: a single mx/ folder holding pristine repo clones (each in a per-repo container at repos/<repo>/git) and one folder per feature (works/), each with its git worktrees under wt/<repo> on their own branches. It also carries a shared context/ (institutional knowledge) and a free-form files/ store (operational values like creds, cluster names, and tokens that any work can read). mx owns the per-work manifest (work.json) and a VS Code workspace file; you drive everything through mx commands.

The runtime is versioned (an integer in <runtime>/mx.json). A given CLI supports exactly one runtime version — CLI major ⇄ runtime version (CLI 2.x ⇄ runtime v2). After a major CLI upgrade, run mx migrate once to bring an existing runtime up to date.

Install

npm install -g @rousan/mx      # provides the `mx` command

Requires Node >= 22 and git.

Point mx at a runtime

mx resolves its runtime in this order: --runtime <path> flag, then $MX_RUNTIME, then the default ~/mx. Set it once in your shell:

export MX_RUNTIME="$HOME/mx"

Quick start

mx init                                  # scaffold the runtime (at $MX_RUNTIME or ~/mx)
mx repo add git@github.com:you/app.git   # clone a pristine repo into the runtime
mx work new my-feature                   # create a work (prints its folder path)
mx work -n my-feature worktree add app   # add a worktree on branch my-feature
mx work -n my-feature port set app web   # allocate a free port (across all works)
mx info                                # see repos, works, worktrees, ports

Inside a work folder or worktree you can drop -n — mx infers the work/repo from your cwd. Read commands accept --porcelain for stable JSON; errors are {"error","code"} with a non-zero exit.

Commands

command does
mx init [path] scaffold/adopt a runtime (repos/, works/, bin/, .mx-root, mx.json, CLAUDE.md)
mx info [--all] [--porcelain] list repos, works, worktrees, ports
mx sync re-stamp the runtime's mx-owned files (CLAUDE.md, per-repo/per-work scaffolding) from the current CLI — same-major, non-destructive
mx update self-update the CLI within its major (npm i -g), then auto-run mx sync; flags a newer major if one exists
mx migrate [--dry-run] upgrade an older-version runtime to the version this CLI supports (the only command allowed on a version-mismatched runtime); --dry-run previews the plan without changing anything
mx repo add <git-url> [--name <n>] clone a pristine repo (into repos/<repo>/git; writes its repo.json)
mx repo new <name> [--quick] [-o] create a fresh local repo with no remote (git init on main + README + initial commit); --quick also makes a dev-<name> work + a develop worktree (quick-experiment one-shot)
mx repo ls / mx repo -n <name> fetch|info|rm manage pristine repos
mx repo health / mx repo -n <name> health local-only health check (augmented by the central repo-health hook)
mx work new <name> [<repo>[:<branch>[:<base>]]]... [--branch <b>] [--base <ref>] [-o] create a work; extra args are repos to make initial worktrees for (per repo: branch = :<branch>--branch → work name; base = :<base>--base → pristine HEAD); -o opens a fullscreen Terminal + starts the work's Claude session (macOS)
mx work ls [--all|--archived] / mx work -n <name> info|describe|path manage works
mx work -n <name> open (or -o) [--prompt <text>] fullscreen Terminal (macOS) that resumes-or-creates the per-work Claude session named <name> (0 → create, seeded by the session-prompt hook / --prompt; 1 → resume; ≥2 → error, resume manually)
mx work -n <name> worktree add <repo> [<wt-name>] [--branch <b>] [--base <ref>] add a worktree (fires pre/post-worktree-create); <wt-name> defaults to the repo — pass a distinct one for multiple worktrees of the same repo
mx work -n <name> worktree ls|rm <wt-name> list / remove a worktree (by name; defaults to the repo)
mx work -n <name> worktree set-branch <wt-name> [<branch>] re-record a worktree's branch in work.json after you switch branches inside it yourself (reads the live branch; mx never checks out); optional <branch> guards against a mismatch
mx work -n <name> port set|unset|ls <wt-name> <service> [<port>] allocate/release ports per worktree (omit <port> to auto-pick)
mx work -n <name> archive [--yes] / unarchive soft-delete / restore a work (keeps branches); fires the central pre/post-work-archive / pre/post-work-unarchive hooks (a pre-* non-zero exit aborts)
mx work -n <name> destroy --force permanently remove the work folder (keeps branches)
mx work health / mx work -n <name> health local-only work-folder audit (stray files, worktree presence, cross-work port collisions, archive invariants); augmented by the central work-health hook (--all includes archived)
mx health [--all] whole-runtime overview: every repo's health + every active work's health
mx bin ls / mx bin path (alias mx bins) list the runtime's bin/ utility executables (mx-shipped + your own); path prints the dir for export PATH="$(mx bin path):$PATH"
mx divider <text> [-o] fill a terminal with <text> as large block letters (a visual separator for macOS Spaces); -o opens a new fullscreen Terminal (macOS)

License

MIT

Keywords