Skip to content

Commit 593a034

Browse files
authored
🤖 chore: rename cmux references to mux (#597)
## Summary - replace the last literal `cmux` strings with `mux` across docs, configs, and code, leaving only `cmux.io` and the legacy ~/.cmux migration marker - rename the home-folder migration helper to document the legacy `~/.cmux` paths and normalize constants throughout services, telemetry, and benchmarks - refresh the VS Code extension, benchmark helpers, and public assets to match the new branding and env-var names ## Testing - not run (not requested) _Generated with `mux`_
1 parent f123168 commit 593a034

File tree

92 files changed

+472
-372
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

92 files changed

+472
-372
lines changed

.env.example

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Environment variables for cmux development
1+
# Environment variables for mux development
22

33
# API Keys for AI providers
44
# Required for integration tests when TEST_INTEGRATION=1

.github/workflows/release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ jobs:
9393
with:
9494
fetch-depth: 0 # Required for git describe to find tags
9595

96-
- uses: ./.github/actions/setup-cmux
96+
- uses: ./.github/actions/setup-mux
9797

9898
- name: Install GNU Make (for build)
9999
run: choco install -y make

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ runs/
108108
__pycache__
109109

110110
tmpfork
111-
.cmux-agent-cli
111+
.mux-agent-cli
112112
storybook-static/
113113
*.tgz
114114
src/test-workspaces/

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44

55
# mux - coding agent multiplexer
66

7-
[![CI](https://github.com/coder/cmux/actions/workflows/ci.yml/badge.svg)](https://github.com/coder/cmux/actions/workflows/ci.yml)
8-
[![Build](https://github.com/coder/cmux/actions/workflows/build.yml/badge.svg?event=merge_group)](https://github.com/coder/cmux/actions/workflows/build.yml?query=event:merge_group)
9-
[![Download](https://img.shields.io/badge/Download-Releases-purple)](https://github.com/coder/cmux/releases)
7+
[![CI](https://github.com/coder/mux/actions/workflows/ci.yml/badge.svg)](https://github.com/coder/mux/actions/workflows/ci.yml)
8+
[![Build](https://github.com/coder/mux/actions/workflows/build.yml/badge.svg?event=merge_group)](https://github.com/coder/mux/actions/workflows/build.yml?query=event:merge_group)
9+
[![Download](https://img.shields.io/badge/Download-Releases-purple)](https://github.com/coder/mux/releases)
1010
[![License: AGPL-3.0](https://img.shields.io/badge/License-AGPL%203.0-blue.svg)](LICENSE)
1111

1212
</div>
@@ -51,10 +51,10 @@ like [opportunistic compaction](https://cmux.io/context-management.html) and [mo
5151
## Install
5252

5353
> [!WARNING]
54-
> cmux is in a Preview state. You will encounter bugs and performance issues.
54+
> mux is in a Preview state. You will encounter bugs and performance issues.
5555
> It's still possible to be highly productive. We are using it almost exclusively for our own development.
5656
57-
Download pre-built binaries from [the releases page](https://github.com/coder/cmux/releases) for
57+
Download pre-built binaries from [the releases page](https://github.com/coder/mux/releases) for
5858
macOS and Linux.
5959

6060
[More on installation →](https://cmux.io/install.html)

benchmarks/terminal_bench/README.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Terminal-Bench Integration
22

3-
This directory contains the cmux agent adapter for [Terminal-Bench](https://github.com/benediktstroebl/terminal-bench), a benchmarking framework for evaluating agentic CLI/terminal capabilities.
3+
This directory contains the mux agent adapter for [Terminal-Bench](https://github.com/benediktstroebl/terminal-bench), a benchmarking framework for evaluating agentic CLI/terminal capabilities.
44

55
## Quick Start
66

@@ -57,7 +57,7 @@ TB_TIMEOUT=600 make benchmark-terminal TB_SAMPLE_SIZE=5
5757

5858
## Agent Configuration
5959

60-
The cmux agent supports the following kwargs (passed via `--agent-kwarg`):
60+
The mux agent supports the following kwargs (passed via `--agent-kwarg`):
6161

6262
- `model_name`: Model to use (e.g., `anthropic:claude-sonnet-4-5`, `openai:gpt-5-codex`)
6363
- `thinking_level`: Thinking level (`off`, `low`, `medium`, `high`)
@@ -103,6 +103,7 @@ Based on analysis of the Oct 30 nightly run (15-minute timeout):
103103

104104
- `mux_agent.py`: Main agent adapter implementing Terminal-Bench's agent interface
105105
- `mux-run.sh`: Shell script that sets up environment and invokes mux CLI
106-
- `mux_payload.py`: Helper to package the mux app for containerized execution
106+
- `mux_payload.py`: Helper to package mux app for containerized execution
107+
- `mux_payload.py`: Helper to package mux app for containerized execution
107108
- `mux_setup.sh.j2`: Jinja2 template for agent installation script
108109
- `sample_tasks.py`: Utility to randomly sample tasks from dataset

benchmarks/terminal_bench/mux_agent.py

Lines changed: 47 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@
1717

1818
class MuxAgent(AbstractInstalledAgent):
1919
"""
20-
Minimal Terminal-Bench adapter that installs cmux into the task container and
21-
forwards the benchmark instruction to the cmux headless runner.
20+
Minimal Terminal-Bench adapter that installs mux into the task container and
21+
forwards the benchmark instruction to the mux headless runner.
2222
"""
2323

24-
_ARCHIVE_NAME = "cmux-app.tar.gz"
25-
_RUNNER_NAME = "cmux-run.sh"
24+
_ARCHIVE_NAME = "mux-app.tar.gz"
25+
_RUNNER_NAME = "mux-run.sh"
2626
_DEFAULT_TRUNK = "main"
2727
_DEFAULT_MODEL = "anthropic:claude-sonnet-4-5"
2828
_DEFAULT_PROJECT_CANDIDATES = "/workspace:/app:/workspaces:/root/project"
@@ -50,18 +50,18 @@ class MuxAgent(AbstractInstalledAgent):
5050
)
5151

5252
_CONFIG_ENV_KEYS: Sequence[str] = (
53-
"CMUX_AGENT_GIT_URL",
54-
"CMUX_BUN_INSTALL_URL",
55-
"CMUX_PROJECT_PATH",
56-
"CMUX_PROJECT_CANDIDATES",
57-
"CMUX_TRUNK",
58-
"CMUX_MODEL",
59-
"CMUX_TIMEOUT_MS",
60-
"CMUX_THINKING_LEVEL",
61-
"CMUX_CONFIG_ROOT",
62-
"CMUX_APP_ROOT",
63-
"CMUX_WORKSPACE_ID",
64-
"CMUX_MODE",
53+
"MUX_AGENT_GIT_URL",
54+
"MUX_BUN_INSTALL_URL",
55+
"MUX_PROJECT_PATH",
56+
"MUX_PROJECT_CANDIDATES",
57+
"MUX_TRUNK",
58+
"MUX_MODEL",
59+
"MUX_TIMEOUT_MS",
60+
"MUX_THINKING_LEVEL",
61+
"MUX_CONFIG_ROOT",
62+
"MUX_APP_ROOT",
63+
"MUX_WORKSPACE_ID",
64+
"MUX_MODE",
6565
)
6666

6767
def __init__(
@@ -72,18 +72,18 @@ def __init__(
7272
**kwargs: Any,
7373
) -> None:
7474
super().__init__(**kwargs)
75-
repo_root_env = os.environ.get("CMUX_AGENT_REPO_ROOT")
75+
repo_root_env = os.environ.get("MUX_AGENT_REPO_ROOT")
7676
repo_root = (
7777
Path(repo_root_env).resolve()
7878
if repo_root_env
7979
else Path(__file__).resolve().parents[2]
8080
)
8181
if not repo_root.exists():
82-
raise RuntimeError(f"cmux repo root {repo_root} does not exist")
82+
raise RuntimeError(f"mux repo root {repo_root} does not exist")
8383

8484
runner_path = Path(__file__).with_name(self._RUNNER_NAME)
8585
if not runner_path.is_file():
86-
raise RuntimeError(f"cmux runner script missing at {runner_path}")
86+
raise RuntimeError(f"mux runner script missing at {runner_path}")
8787

8888
self._runner_path = runner_path
8989
self._repo_root = repo_root
@@ -95,7 +95,7 @@ def __init__(
9595

9696
@staticmethod
9797
def name() -> str:
98-
return "cmux"
98+
return "mux"
9999

100100
@property
101101
def _env(self) -> dict[str, str]:
@@ -106,63 +106,61 @@ def _env(self) -> dict[str, str]:
106106
if value:
107107
env[key] = value
108108

109-
env.setdefault("CMUX_TRUNK", self._DEFAULT_TRUNK)
110-
env.setdefault("CMUX_MODEL", self._DEFAULT_MODEL)
111-
env.setdefault("CMUX_CONFIG_ROOT", "/root/.cmux")
112-
env.setdefault("CMUX_APP_ROOT", "/opt/cmux-app")
113-
env.setdefault("CMUX_WORKSPACE_ID", "cmux-bench")
114-
env.setdefault("CMUX_THINKING_LEVEL", "high")
115-
env.setdefault("CMUX_MODE", "exec")
116-
env.setdefault("CMUX_PROJECT_CANDIDATES", self._DEFAULT_PROJECT_CANDIDATES)
109+
env.setdefault("MUX_TRUNK", self._DEFAULT_TRUNK)
110+
env.setdefault("MUX_MODEL", self._DEFAULT_MODEL)
111+
env.setdefault("MUX_CONFIG_ROOT", "/root/.mux")
112+
env.setdefault("MUX_APP_ROOT", "/opt/mux-app")
113+
env.setdefault("MUX_WORKSPACE_ID", "mux-bench")
114+
env.setdefault("MUX_THINKING_LEVEL", "high")
115+
env.setdefault("MUX_MODE", "exec")
116+
env.setdefault("MUX_PROJECT_CANDIDATES", self._DEFAULT_PROJECT_CANDIDATES)
117117

118-
model_value = self._model_name or env["CMUX_MODEL"]
118+
model_value = self._model_name or env["MUX_MODEL"]
119119
model_value = model_value.strip()
120120
if not model_value:
121-
raise ValueError("CMUX_MODEL must be a non-empty string")
121+
raise ValueError("MUX_MODEL must be a non-empty string")
122122
if "/" in model_value and ":" not in model_value:
123123
provider, model_name = model_value.split("/", 1)
124124
model_value = f"{provider}:{model_name}"
125-
env["CMUX_MODEL"] = model_value
125+
env["MUX_MODEL"] = model_value
126126

127-
thinking_value = self._thinking_level or env["CMUX_THINKING_LEVEL"]
127+
thinking_value = self._thinking_level or env["MUX_THINKING_LEVEL"]
128128
normalized_thinking = thinking_value.strip().lower()
129129
if normalized_thinking not in {"off", "low", "medium", "high"}:
130-
raise ValueError(
131-
"CMUX_THINKING_LEVEL must be one of off, low, medium, high"
132-
)
133-
env["CMUX_THINKING_LEVEL"] = normalized_thinking
130+
raise ValueError("MUX_THINKING_LEVEL must be one of off, low, medium, high")
131+
env["MUX_THINKING_LEVEL"] = normalized_thinking
134132

135-
mode_value = self._mode or env["CMUX_MODE"]
133+
mode_value = self._mode or env["MUX_MODE"]
136134
normalized_mode = mode_value.strip().lower()
137135
if normalized_mode in {"exec", "execute"}:
138-
env["CMUX_MODE"] = "exec"
136+
env["MUX_MODE"] = "exec"
139137
elif normalized_mode == "plan":
140-
env["CMUX_MODE"] = "plan"
138+
env["MUX_MODE"] = "plan"
141139
else:
142-
raise ValueError("CMUX_MODE must be one of plan, exec, or execute")
140+
raise ValueError("MUX_MODE must be one of plan, exec, or execute")
143141

144142
# These env vars are all set with defaults above, no need to validate
145143
for key in (
146-
"CMUX_CONFIG_ROOT",
147-
"CMUX_APP_ROOT",
148-
"CMUX_WORKSPACE_ID",
149-
"CMUX_PROJECT_CANDIDATES",
144+
"MUX_CONFIG_ROOT",
145+
"MUX_APP_ROOT",
146+
"MUX_WORKSPACE_ID",
147+
"MUX_PROJECT_CANDIDATES",
150148
):
151149
env[key] = env[key].strip()
152150

153-
if timeout_value := env.get("CMUX_TIMEOUT_MS"):
151+
if timeout_value := env.get("MUX_TIMEOUT_MS"):
154152
if not timeout_value.strip().isdigit():
155-
raise ValueError("CMUX_TIMEOUT_MS must be an integer")
153+
raise ValueError("MUX_TIMEOUT_MS must be an integer")
156154

157-
if project_path := env.get("CMUX_PROJECT_PATH"):
155+
if project_path := env.get("MUX_PROJECT_PATH"):
158156
if not project_path.strip():
159-
raise ValueError("CMUX_PROJECT_PATH must be non-empty when provided")
157+
raise ValueError("MUX_PROJECT_PATH must be non-empty when provided")
160158

161159
return env
162160

163161
@property
164162
def _install_agent_script_path(self) -> Path:
165-
return self._get_templated_script_path("cmux_setup.sh.j2")
163+
return self._get_templated_script_path("mux_setup.sh.j2")
166164

167165
def perform_task(
168166
self,

benchmarks/terminal_bench/mux_agent_test.py

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,20 @@
88

99

1010
@pytest.fixture(autouse=True)
11-
def _clear_cmux_env(monkeypatch: pytest.MonkeyPatch) -> None:
11+
def _clear_mux_env(monkeypatch: pytest.MonkeyPatch) -> None:
1212
keys = [
13-
"CMUX_AGENT_GIT_URL",
14-
"CMUX_BUN_INSTALL_URL",
15-
"CMUX_PROJECT_PATH",
16-
"CMUX_PROJECT_CANDIDATES",
17-
"CMUX_TRUNK",
18-
"CMUX_MODEL",
19-
"CMUX_TIMEOUT_MS",
20-
"CMUX_THINKING_LEVEL",
21-
"CMUX_CONFIG_ROOT",
22-
"CMUX_APP_ROOT",
23-
"CMUX_WORKSPACE_ID",
24-
"CMUX_MODE",
13+
"MUX_AGENT_GIT_URL",
14+
"MUX_BUN_INSTALL_URL",
15+
"MUX_PROJECT_PATH",
16+
"MUX_PROJECT_CANDIDATES",
17+
"MUX_TRUNK",
18+
"MUX_MODEL",
19+
"MUX_TIMEOUT_MS",
20+
"MUX_THINKING_LEVEL",
21+
"MUX_CONFIG_ROOT",
22+
"MUX_APP_ROOT",
23+
"MUX_WORKSPACE_ID",
24+
"MUX_MODE",
2525
]
2626
for key in keys:
2727
monkeypatch.delenv(key, raising=False)
@@ -32,20 +32,20 @@ def _repo_root() -> Path:
3232

3333

3434
def test_env_defaults_are_normalized(monkeypatch: pytest.MonkeyPatch) -> None:
35-
monkeypatch.setenv("CMUX_AGENT_REPO_ROOT", str(_repo_root()))
35+
monkeypatch.setenv("MUX_AGENT_REPO_ROOT", str(_repo_root()))
3636
agent = MuxAgent(model_name="anthropic/claude-sonnet-4-5")
3737

3838
env = agent._env
3939

40-
assert env["CMUX_MODEL"] == "anthropic:claude-sonnet-4-5"
41-
assert env["CMUX_THINKING_LEVEL"] == "high"
42-
assert env["CMUX_MODE"] == "exec"
43-
assert env["CMUX_PROJECT_CANDIDATES"] == agent._DEFAULT_PROJECT_CANDIDATES
40+
assert env["MUX_MODEL"] == "anthropic:claude-sonnet-4-5"
41+
assert env["MUX_THINKING_LEVEL"] == "high"
42+
assert env["MUX_MODE"] == "exec"
43+
assert env["MUX_PROJECT_CANDIDATES"] == agent._DEFAULT_PROJECT_CANDIDATES
4444

4545

4646
def test_timeout_must_be_numeric(monkeypatch: pytest.MonkeyPatch) -> None:
47-
monkeypatch.setenv("CMUX_AGENT_REPO_ROOT", str(_repo_root()))
48-
monkeypatch.setenv("CMUX_TIMEOUT_MS", "not-a-number")
47+
monkeypatch.setenv("MUX_AGENT_REPO_ROOT", str(_repo_root()))
48+
monkeypatch.setenv("MUX_TIMEOUT_MS", "not-a-number")
4949

5050
agent = MuxAgent()
5151
with pytest.raises(ValueError):

benchmarks/terminal_bench/mux_payload.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010

1111

1212
def build_app_archive(repo_root: Path, include_paths: Iterable[str]) -> bytes:
13-
"""Pack the cmux workspace into a gzipped tarball."""
13+
"""Pack the mux workspace into a gzipped tarball."""
1414
if not repo_root.exists():
15-
raise FileNotFoundError(f"cmux repo root {repo_root} not found")
15+
raise FileNotFoundError(f"mux repo root {repo_root} not found")
1616

1717
buffer = io.BytesIO()
1818
with tarfile.open(fileobj=buffer, mode="w:gz") as archive:
@@ -30,7 +30,7 @@ def stage_payload(
3030
archive_name: str,
3131
runner_path: Path,
3232
) -> None:
33-
"""Copy the cmux bundle and runner into the task container."""
33+
"""Copy the mux bundle and runner into the task container."""
3434
with tempfile.NamedTemporaryFile(suffix=".tar.gz", delete=False) as temp_file:
3535
temp_file.write(archive_bytes)
3636
temp_path = Path(temp_file.name)

benchmarks/terminal_bench/mux_setup.sh.j2

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,30 +30,30 @@ export PATH="${BUN_INSTALL}/bin:${PATH}"
3030

3131
if ! command -v bun >/dev/null 2>&1; then
3232
log "installing bun"
33-
curl -fsSL "${CMUX_BUN_INSTALL_URL:-https://bun.sh/install}" | bash
33+
curl -fsSL "${MUX_BUN_INSTALL_URL:-https://bun.sh/install}" | bash
3434
fi
3535

36-
CMUX_APP_ROOT="${CMUX_APP_ROOT:-/opt/mux-app}"
37-
CMUX_CONFIG_ROOT="${CMUX_CONFIG_ROOT:-/root/.mux}"
38-
CMUX_AGENT_VERSION="{{ version if version is not none else '' }}"
36+
MUX_APP_ROOT="${MUX_APP_ROOT:-/opt/mux-app}"
37+
MUX_CONFIG_ROOT="${MUX_CONFIG_ROOT:-/root/.mux}"
38+
MUX_AGENT_VERSION="{{ version if version is not none else '' }}"
3939

40-
rm -rf "${CMUX_APP_ROOT}"
41-
if [[ -n "${CMUX_AGENT_VERSION}" ]]; then
42-
: "${CMUX_AGENT_GIT_URL:?CMUX_AGENT_GIT_URL required when version is set}"
43-
log "cloning mux from ${CMUX_AGENT_GIT_URL} @ ${CMUX_AGENT_VERSION}"
44-
git clone --depth 1 --branch "${CMUX_AGENT_VERSION}" "${CMUX_AGENT_GIT_URL}" "${CMUX_APP_ROOT}"
40+
rm -rf "${MUX_APP_ROOT}"
41+
if [[ -n "${MUX_AGENT_VERSION}" ]]; then
42+
: "${MUX_AGENT_GIT_URL:?MUX_AGENT_GIT_URL required when version is set}"
43+
log "cloning mux from ${MUX_AGENT_GIT_URL} @ ${MUX_AGENT_VERSION}"
44+
git clone --depth 1 --branch "${MUX_AGENT_VERSION}" "${MUX_AGENT_GIT_URL}" "${MUX_APP_ROOT}"
4545
else
4646
log "extracting mux archive"
47-
mkdir -p "${CMUX_APP_ROOT}"
48-
tar -xzf "/installed-agent/mux-app.tar.gz" -C "${CMUX_APP_ROOT}"
47+
mkdir -p "${MUX_APP_ROOT}"
48+
tar -xzf "/installed-agent/mux-app.tar.gz" -C "${MUX_APP_ROOT}"
4949
fi
5050

51-
cd "${CMUX_APP_ROOT}"
51+
cd "${MUX_APP_ROOT}"
5252

5353
log "installing mux dependencies via bun"
5454
bun install --frozen-lockfile
5555

56-
mkdir -p "${CMUX_CONFIG_ROOT}"
56+
mkdir -p "${MUX_CONFIG_ROOT}"
5757

5858
chmod +x /installed-agent/mux-run.sh
5959

0 commit comments

Comments
 (0)