Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
16 changes: 8 additions & 8 deletions .design-sync/conventions.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Mux design system — how to build with it
# Xum design system — how to build with it

These components are Mux's real, compiled React components (the desktop app's UI:
chat tool-call cards, message states, settings sections, banners, modals, small
Expand Down Expand Up @@ -30,14 +30,14 @@ There are **no CSS-module class maps**; style layout with Tailwind utility class
built from Mux's semantic color tokens (NOT raw hex). Real families (all in the
shipped stylesheet):

| Purpose | Utilities |
| ----------- | -------------------------------------------------------------------------------------------- |
| Surfaces | `bg-background`, `bg-background-secondary`, `bg-surface-primary`, `bg-surface-secondary` |
| Text | `text-foreground`, `text-muted-foreground`, `text-content-primary`, `text-content-secondary` |
| Borders | `border-border` |
| Accent | `bg-accent`, `text-accent` |
| Purpose | Utilities |
| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Surfaces | `bg-background`, `bg-background-secondary`, `bg-surface-primary`, `bg-surface-secondary` |
| Text | `text-foreground`, `text-muted-foreground`, `text-content-primary`, `text-content-secondary` |
| Borders | `border-border` |
| Accent | `bg-accent`, `text-accent` |
| Agent modes | `text-plan-mode` / `bg-plan-mode` — same for `edit` / `exec` / `thinking` / `task`. `ask` & `debug` ship only as `--color-<mode>-mode` tokens (no utility): use `style={{ color: "var(--color-ask-mode)" }}` |
| Radius | `rounded-md` |
| Radius | `rounded-md` |

For a token Tailwind doesn't expose as a utility, reference it directly:
`style={{ color: "var(--color-content-primary)" }}`. Token names live in the
Expand Down
2 changes: 1 addition & 1 deletion .design-sync/previews/PRLinkBadge.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import type { GitHubPRLinkWithStatus } from "@/common/types/links";
// PRLinkBadge only needs theme + tooltip from the shell.
const PR_LINK: GitHubPRLinkWithStatus = {
type: "github-pr",
url: "https://github.com/coder/mux/pull/1623",
url: "https://github.com/coder/xum/pull/1623",
owner: "coder",
repo: "mux",
number: 1623,
Expand Down
12 changes: 8 additions & 4 deletions .envrc
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,13 @@ nix_direnv_manual_reload

use flake .

# Optional: shared per-user env vars for all mux worktrees
MUX_SHARED_ENVRC="$HOME/.mux/.envrc"
if [[ -f "$MUX_SHARED_ENVRC" ]]; then
# Optional: shared per-user env vars for all Xum worktrees.
XUM_SHARED_ENVRC="$HOME/.xum/.envrc"
LEGACY_MUX_SHARED_ENVRC="$HOME/.mux/.envrc"
if [[ -f "$XUM_SHARED_ENVRC" ]]; then
# source_env() also calls watch_file(), so edits trigger direnv reloads.
source_env "$MUX_SHARED_ENVRC"
source_env "$XUM_SHARED_ENVRC"
elif [[ -f "$LEGACY_MUX_SHARED_ENVRC" ]]; then
# Existing developer machines may not have moved their shared env file yet.
source_env "$LEGACY_MUX_SHARED_ENVRC"
fi
37 changes: 21 additions & 16 deletions .github/workflows/nightly-terminal-bench.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,13 @@ on:
description: "Experiments to enable (comma-separated)"
required: false
type: string
xum_run_as_goal:
description: "Run nightly smoke/matrix tasks as strict Xum CLI Goal Runs"
required: false
default: false
type: boolean
mux_run_as_goal:
description: "Run nightly smoke/matrix tasks as strict mux CLI Goal Runs"
description: "Deprecated alias for xum_run_as_goal"
required: false
default: false
type: boolean
Expand All @@ -32,13 +37,13 @@ jobs:
uses: ./.github/workflows/terminal-bench.yml
with:
model_name: "anthropic/claude-sonnet-4-5"
mux_run_args: "--thinking high"
xum_run_args: "--thinking high"
dataset: "terminal-bench@2.0"
concurrency: "1"
env: "daytona"
task_names: "chess-best-move"
experiments: ${{ inputs.experiments }}
mux_run_as_goal: ${{ github.event_name == 'workflow_dispatch' && inputs.mux_run_as_goal || false }}
xum_run_as_goal: ${{ github.event_name == 'workflow_dispatch' && (inputs.xum_run_as_goal || inputs.mux_run_as_goal) || false }}
# Keep least-privilege secret scope for reusable workflow calls.
secrets:
TERMINAL_BENCH_ANTHROPIC_API_KEY: ${{ secrets.TERMINAL_BENCH_ANTHROPIC_API_KEY }}
Expand All @@ -48,23 +53,23 @@ jobs:
GCP_SA_KEY: ${{ secrets.GCP_SA_KEY }}

# Smoke tests for Harbor SWE-style datasets (single task each).
# These validate that mux can run inside the dataset's repo checkout (--runtime local)
# and that we target the verifier's expected working directory (MUX_PROJECT_PATH).
# These validate that Xum can run inside the dataset's repo checkout (--runtime local)
# and that we target the verifier's expected working directory (XUM_PROJECT_PATH).
swebench-verified-smoke-test:
name: "Smoke test (swebench-verified: django__django-10097)"
needs: smoke-test
uses: ./.github/workflows/terminal-bench.yml
with:
model_name: "anthropic/claude-sonnet-4-5"
mux_run_args: "--thinking high --runtime local"
xum_run_args: "--thinking high --runtime local"
dataset: "swebench-verified@1.0"
concurrency: "1"
env: "daytona"
task_names: "django__django-10097"
mux_project_path: "/testbed"
xum_project_path: "/testbed"
timeout: "3000"
experiments: ${{ inputs.experiments }}
mux_run_as_goal: ${{ github.event_name == 'workflow_dispatch' && inputs.mux_run_as_goal || false }}
xum_run_as_goal: ${{ github.event_name == 'workflow_dispatch' && (inputs.xum_run_as_goal || inputs.mux_run_as_goal) || false }}
secrets:
TERMINAL_BENCH_ANTHROPIC_API_KEY: ${{ secrets.TERMINAL_BENCH_ANTHROPIC_API_KEY }}
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
Expand All @@ -78,15 +83,15 @@ jobs:
uses: ./.github/workflows/terminal-bench.yml
with:
model_name: "anthropic/claude-sonnet-4-5"
mux_run_args: "--thinking high --runtime local"
xum_run_args: "--thinking high --runtime local"
dataset: "swe-gen-js@1.0"
concurrency: "1"
env: "daytona"
task_names: "biomejs__biome-7314"
mux_project_path: "/app/src"
xum_project_path: "/app/src"
timeout: "600"
experiments: ${{ inputs.experiments }}
mux_run_as_goal: ${{ github.event_name == 'workflow_dispatch' && inputs.mux_run_as_goal || false }}
xum_run_as_goal: ${{ github.event_name == 'workflow_dispatch' && (inputs.xum_run_as_goal || inputs.mux_run_as_goal) || false }}
secrets:
TERMINAL_BENCH_ANTHROPIC_API_KEY: ${{ secrets.TERMINAL_BENCH_ANTHROPIC_API_KEY }}
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
Expand All @@ -100,15 +105,15 @@ jobs:
uses: ./.github/workflows/terminal-bench.yml
with:
model_name: "anthropic/claude-sonnet-4-5"
mux_run_args: "--thinking high --runtime local"
xum_run_args: "--thinking high --runtime local"
dataset: "aider-polyglot@1.0"
concurrency: "1"
env: "daytona"
task_names: "polyglot_cpp_all-your-base"
mux_project_path: "/app"
xum_project_path: "/app"
timeout: "1800"
experiments: ${{ inputs.experiments }}
mux_run_as_goal: ${{ github.event_name == 'workflow_dispatch' && inputs.mux_run_as_goal || false }}
xum_run_as_goal: ${{ github.event_name == 'workflow_dispatch' && (inputs.xum_run_as_goal || inputs.mux_run_as_goal) || false }}
secrets:
TERMINAL_BENCH_ANTHROPIC_API_KEY: ${{ secrets.TERMINAL_BENCH_ANTHROPIC_API_KEY }}
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
Expand Down Expand Up @@ -147,12 +152,12 @@ jobs:
uses: ./.github/workflows/terminal-bench.yml
with:
model_name: ${{ matrix.model }}
mux_run_args: "--thinking high"
xum_run_args: "--thinking high"
dataset: "terminal-bench@2.0"
concurrency: "48"
env: "daytona"
experiments: ${{ inputs.experiments }}
mux_run_as_goal: ${{ github.event_name == 'workflow_dispatch' && inputs.mux_run_as_goal || false }}
xum_run_as_goal: ${{ github.event_name == 'workflow_dispatch' && (inputs.xum_run_as_goal || inputs.mux_run_as_goal) || false }}
allow_transient_agent_errors: true
secrets:
TERMINAL_BENCH_ANTHROPIC_API_KEY: ${{ secrets.TERMINAL_BENCH_ANTHROPIC_API_KEY }}
Expand Down
50 changes: 34 additions & 16 deletions .github/workflows/terminal-bench.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,18 +44,34 @@ on:
required: false
type: string
default: ""
mux_project_path:
xum_project_path:
description: "Project path inside the task container (e.g., /testbed, /app/src)"
required: false
type: string
default: ""
xum_run_args:
description: "Additional CLI flags passed to Xum run (e.g., --thinking high --use-1m --budget 5.00; with goal mode, add --goal-turns/--goal-budget)"
required: false
type: string
default: ""
xum_run_as_goal:
description: "Run each task instruction as a Xum CLI Goal Run"
required: false
type: boolean
default: false
# Compatibility inputs for reusable-workflow callers created before the rename.
mux_project_path:
description: "Deprecated alias for xum_project_path"
required: false
type: string
default: ""
mux_run_args:
description: "Additional CLI flags passed to mux run (e.g., --thinking high --use-1m --budget 5.00; with goal mode, add --goal-turns/--goal-budget)"
description: "Deprecated alias for xum_run_args"
required: false
type: string
default: ""
mux_run_as_goal:
description: "Run each task instruction as a mux CLI Goal Run"
description: "Deprecated alias for xum_run_as_goal"
required: false
type: boolean
default: false
Expand Down Expand Up @@ -101,12 +117,14 @@ on:
description: "Model to use (e.g., anthropic/claude-opus-5, openai/gpt-5.6-sol)"
required: false
type: string
# GitHub caps workflow_dispatch at ten inputs. Keep these established
# external names while reusable workflow calls use canonical xum_* inputs.
mux_run_args:
description: "Additional CLI flags passed to mux run (e.g., --thinking high --use-1m; with goal mode, add --goal-turns/--goal-budget)"
description: "Additional CLI flags passed to Xum run (legacy input name)"
required: false
type: string
mux_run_as_goal:
description: "Run each task instruction as a mux CLI Goal Run"
description: "Run each task instruction as a Xum CLI Goal Run (legacy input name)"
required: false
default: false
type: boolean
Expand Down Expand Up @@ -192,15 +210,15 @@ jobs:
TB_ENV: ${{ inputs.env }}
TB_TASK_NAMES: ${{ inputs.task_names }}
TB_MODEL: ${{ inputs.model_name }}
MUX_MODEL: ${{ inputs.model_name }}
XUM_MODEL: ${{ inputs.model_name }}
TB_TIMEOUT: ${{ inputs.timeout }}
MUX_PROJECT_PATH: ${{ inputs.mux_project_path }}
XUM_PROJECT_PATH: ${{ inputs.xum_project_path || inputs.mux_project_path }}
TB_ARGS: >-
${{ inputs.max_tasks && format('--n-tasks {0}', inputs.max_tasks) || '' }}
${{ inputs.extra_args || '' }}
MUX_EXPERIMENTS: ${{ inputs.experiments }}
MUX_RUN_ARGS: ${{ inputs.mux_run_args }}
MUX_RUN_AS_GOAL: ${{ inputs.mux_run_as_goal && '1' || '' }}
XUM_EXPERIMENTS: ${{ inputs.experiments }}
XUM_RUN_ARGS: ${{ inputs.xum_run_args || inputs.mux_run_args }}
XUM_RUN_AS_GOAL: ${{ (inputs.xum_run_as_goal || inputs.mux_run_as_goal) && '1' || '' }}
ANTHROPIC_API_KEY: ${{ secrets.TERMINAL_BENCH_ANTHROPIC_API_KEY }}
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }}
Expand Down Expand Up @@ -280,13 +298,13 @@ jobs:
echo "Artifact name: $ARTIFACT_NAME"

- name: Upload Terminal-Bench results to BigQuery
if: always() && github.repository == 'coder/mux' && startsWith(inputs.dataset, 'terminal-bench@')
if: always() && github.repository == 'coder/xum' && startsWith(inputs.dataset, 'terminal-bench@')
env:
GCP_SA_KEY: ${{ secrets.GCP_SA_KEY }}
GCP_PROJECT_ID: mux-benchmarks
BQ_DATASET: benchmarks
MUX_EXPERIMENTS: ${{ inputs.experiments }}
MUX_RUN_AS_GOAL: ${{ inputs.mux_run_as_goal && '1' || '' }}
XUM_EXPERIMENTS: ${{ inputs.experiments }}
XUM_RUN_AS_GOAL: ${{ inputs.xum_run_as_goal && '1' || '' }}
Comment thread
matifali marked this conversation as resolved.
run: |
if [ -z "$GCP_SA_KEY" ]; then
echo "GCP_SA_KEY not set, skipping BigQuery upload"
Expand All @@ -299,13 +317,13 @@ jobs:
rm -f /tmp/gcp-sa.json

- name: Upload Harbor results to BigQuery
if: always() && github.repository == 'coder/mux' && !startsWith(inputs.dataset, 'terminal-bench@')
if: always() && github.repository == 'coder/xum' && !startsWith(inputs.dataset, 'terminal-bench@')
env:
GCP_SA_KEY: ${{ secrets.GCP_SA_KEY }}
GCP_PROJECT_ID: mux-benchmarks
BQ_DATASET: benchmarks
MUX_EXPERIMENTS: ${{ inputs.experiments }}
MUX_RUN_AS_GOAL: ${{ inputs.mux_run_as_goal && '1' || '' }}
XUM_EXPERIMENTS: ${{ inputs.experiments }}
XUM_RUN_AS_GOAL: ${{ inputs.xum_run_as_goal && '1' || '' }}
run: |
if [ -z "$GCP_SA_KEY" ]; then
echo "GCP_SA_KEY not set, skipping BigQuery upload"
Expand Down
Loading
Loading