~/.config/cmux/cmux.json by the installer when you have no cmux
configuration yet:
~/.config/cmux/cmux.json
- macOS, because the default-browser fallback uses
open. - The five scripts in
~/.obversa/cmux/bin, on yourPATH. - The Shared root, once:
export OBVERSA_SHARED_ROOT=<shared worktree>.
Install
Install the glue with one command. It’s five small scripts and one palette entry, not an npm package:Terminal
~/.obversa/cmux/bin and never edits a
configuration you already have. To do it by hand, the scripts are in
hosts/cmux/bin in the repository, and the palette entry above names the
launcher by absolute path. Prefer to have an agent do it? Paste this:
Install the Obversa cmux glue. Fetch the five scripts fromhosts/cmux/binin github.com/jonny981/obversa into~/.obversa/cmux/bin, make them executable, add a Command Palette entry named “Order Workspace” to~/.config/cmux/cmux.jsonpointing at the absolute path ofobversa-order-workspace, and add~/.obversa/cmux/binto my PATH. Do not putOBVERSA_SURFACE_BINorPLANNOTATOR_BROWSERin any profile or settings file: those bind per workspace, and a global one sends every review to the wrong host.
Open an order workspace
Run Order Workspace from the Command Palette. The first run shows the cmux trust prompt. A project-local.cmux/cmux.json overrides the global
entry, so a repository can carry its own and the pair never conflicts.
From a terminal:
Terminal
~/.local/state/obversa/workspaces/, outside both trees, and opens it
with code (override with $OBVERSA_EDITOR_CMD). It refuses nested or
identical roots.
Create a workspace
Create workspaces through the host’s launcher, so every terminal and agent in the workspace has the two placement variables bound to the glue’s own scripts:Terminal
OBVERSA_SURFACE_BIN places Obversa surfaces and PLANNOTATOR_BROWSER
places the Plannotator review page. The binding is per launch host, never
global: don’t put either variable in a shell profile or an agent client’s
settings, and remove an old global PLANNOTATOR_BROWSER from
~/.claude/settings.json if one is there. A global binding sends every
launch to one host, so a review started elsewhere would land here. In a
workspace opened without the launcher, export OBVERSA_SURFACE_BIN as the
absolute path of obversa-surface in that workspace. Apply configuration
changes with cmux reload-config.
Place a page
A surface is a small page for one decision. In cmux it opens as a browser pane split beside the terminal; outside cmux the same command opens your default browser, so every script stays usable in a plain terminal:Terminal
PLANNOTATOR_BROWSER.
Only that page routes into cmux; no other tool reads the variable, so no
other link changes behaviour.
The URL a surface hands the glue is a one-time launch URL that opens the
session: single use, valid for a minute, and the page URL with its token
never goes into a process argument. That launch URL still opens the
review, so every command the glue uses runs by absolute path from a fixed
list of system directories (/usr/bin, /bin, /usr/local/bin,
/opt/homebrew/bin), never by a bare name looked up on PATH. A host may
name other directories in OBVERSA_SYSTEM_BIN_DIRS, colon-separated. On
Linux the glue doesn’t run xdg-open, because xdg-open runs its own
helpers by bare name; the URL is printed on stderr for you to open, as it
is on any platform with no opener found.
Failure
Every failure path lands somewhere safe. When cmux is absent, wedged, or returns an unusable topology, the URL opens in the default browser. When the Shared root is missing, the generator stops with the exact flag to pass. A cancel during the lookup opens nothing. Wrong placement is treated as worse than a plain browser, so the scripts never guess a workspace.Limits
- One palette entry, five scripts, nothing else. cmux supplies the panes, the layout and the keybindings; Obversa supplies the workspace file and the surface placement. Remove the glue and cmux is exactly as it was.
- macOS only for the installer and the browser fallback.
Next steps
- Review a diff in a host pane: the review page that opens in a split.
- Surfaces: the page a question opens on, and why it ends once.
- Watch a run in the browser: the run’s own page, which the glue can place the same way.