Files
claudemesh/apps/cli
Alejandro Gutiérrez f1d35b10da
Some checks failed
CI / Lint (push) Has been cancelled
CI / Typecheck (push) Has been cancelled
CI / Broker tests (Postgres) (push) Has been cancelled
CI / Docker build (linux/amd64) (push) Has been cancelled
fix(cli): clean TTY handoff to claude via spawnSync + defensive reset
Terminals spawned by `claudemesh launch` were dropping keystrokes at
claude's prompt and showing the launch wizard re-rendering on top of
claude's TUI. Two compounding causes:

1. spawn() + child.on('exit') kept the parent node event loop alive
   during claude's lifetime. Any stray readline 'data' listener or
   late render from the wizard could fire on the inherited stdin/
   stdout, stealing keystrokes or painting over claude's Ink TUI.
2. Raw mode / alt-screen / hidden cursor set by the wizard helpers
   was not reliably restored before the handoff.

Fix:
- Swap spawn for spawnSync so the parent event loop is fully blocked
  while claude runs. No listener or setImmediate can fire during
  claude's lifetime.
- Hard TTY reset right before the spawn: setRawMode(false),
  removeAllListeners on stdin, show cursor (ESC[?25h), exit alt
  screen (ESC[?1049l). Defensive — survives partial wizard cleanup.
- Move cleanup() registration to process.on('exit') so it runs
  synchronously on every exit path (normal, signal, throw).
- Preserve signal forwarding: if claude dies from a signal, re-raise
  the same signal on the parent so exit codes propagate correctly.

Bumps to v0.10.6.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 13:38:09 +01:00
..

claudemesh-cli

Client tool for claudemesh — install once per machine, join one or more meshes, and your Claude Code sessions can talk to peers on demand.

Install

# From npm (once published)
npm install -g claudemesh-cli

# Or from the monorepo during dev
cd apps/cli && bun link

Then register the MCP server with Claude Code:

claudemesh install
# prints:  claude mcp add claudemesh --scope user -- claudemesh mcp

Run the printed command, then restart Claude Code.

Join a mesh

claudemesh join https://claudemesh.com/join/<token>

Launch Claude Code

For real-time push messages from peers (messages injected mid-turn as <channel source="claudemesh"> system reminders), launch with:

claudemesh launch
# or pass through any claude flags:
claudemesh launch --model opus
claudemesh launch --resume

Under the hood this runs:

claude --dangerously-load-development-channels server:claudemesh

Plain claude still works — the MCP tools are available — but incoming messages are pull-only via the check_messages tool instead of being pushed to Claude immediately.

The invite link is generated by whoever runs the mesh. It bundles the mesh id, expiry, signing key, and role. Your CLI verifies it, generates a fresh keypair, enrolls you with the broker, and persists the result to ~/.claudemesh/config.json.

Commands

claudemesh install         # register MCP + status hooks
claudemesh uninstall       # remove MCP + status hooks
claudemesh launch [args]   # launch Claude Code with push messages enabled
claudemesh join <url>      # join a mesh via invite URL
claudemesh list            # show joined meshes + identities
claudemesh leave <slug>    # leave a mesh
claudemesh mcp             # start MCP server (stdio — Claude Code only)
claudemesh --help          # show usage

Env overrides

Var Default Purpose
CLAUDEMESH_BROKER_URL wss://ic.claudemesh.com/ws Point at a self-hosted broker
CLAUDEMESH_CONFIG_DIR ~/.claudemesh/ Override config location
CLAUDEMESH_DEBUG 0 Verbose logging

Status

v0.1.0 scaffold — CLI commands + MCP server shell in place. WS broker connection, libsodium crypto, invite-link verification, and auto-install of hooks land in subsequent steps.