# Özel Komutlar ve Eylemler

cmux.json, cmux'a kendi alışkanlıklarınızı öğrettiğiniz yerdir: sık çalıştırdığınız kabuk komutları, önceden belirlenmiş bir terminal ve tarayıcı düzeniyle açılan çalışma alanları ve kısayollara, sekme çubuğu düğmelerine ve Command Palette'e bağlayabileceğiniz eylemler. Bir projenin içinde .cmux/cmux.json konumunda, tüm projeler için ~/.config/cmux/cmux.json konumunda veya her ikisinde bir dosya tutun.

## cmux, cmux.json dosyasını nereden okur

Girdiler bir proje dosyasından, kullanıcı genelindeki bir dosyadan veya her ikisinden gelebilir. Proje dosyaları için cmux geçerli dizinden başlar ve üstündeki her üst dizini de kontrol eder.

-   **Proje:** `./.cmux/cmux.json` (çalışma dizininden yukarı doğru aranarak bulunur; kullanıcı genelindeki dosyaya göre önceliklidir)
-   **Yerel fallback:** `./cmux.json` (mevcut repolar için hâlâ desteklenir)
-   **Kullanıcı geneli:** `~/.config/cmux/cmux.json` (tüm projelerde ortaktır; bir proje dosyasının tanımsız bıraktığı her şeyi sağlar)

Yerel eylemler ve komutlar, aynı ID veya ada sahip genel girdilerin yerine geçer.

cmux.json dosyasını düzenleyin, ardından Cmd+Shift+, tuşlarına basın veya değişiklikleri uygulamak için cmux reload-config çalıştırın.

Bir proje veya global config içinde şema hatası varsa cmux bir sonraki geçerli config’e döner ve Command Palette içinde **cmux.json Schema Error** satırını gösterir. Config dosyasını açmak için seçin.

## Kabuk komutları

En küçük girdi bir ad ve bir command dizesinden oluşur. Command Palette'te seçildiğinde bu dize odaktaki terminale yazılır ve çalıştırılır.

cmux.json

```
{
  "commands": [
    {
      "name": "Format Changed Files",
      "description": "Run the formatter on files that differ from main",
      "keywords": [
        "fmt",
        "prettier",
        "style"
      ],
      "command": "git diff --name-only main -- '*.ts' '*.tsx' | xargs npx prettier --write"
    },
    {
      "name": "Reset Local Database",
      "keywords": [
        "db",
        "wipe"
      ],
      "command": "cd \"$(git rev-parse --show-toplevel)\" && ./scripts/db-reset.sh",
      "confirm": true
    }
  ]
}
```

### Kabuk komutu alanları

-   `name`: Command Palette'te seçtiğiniz, zorunlu ve boş olmayan etiket
-   `command`: cmux'un odaktaki terminale yazıp çalıştırdığı kabuk metni
-   `description`: Girdinin yanında gösterilen isteğe bağlı ikincil metin
-   `keywords`: Command Palette'te arama yaptığınızda bu girdiyle eşleşmesi gereken ek sözcükler
-   `confirm`: Her çalıştırmadan önce onay istemi almak için true yapın

Bir kabuk komutu, odaktaki terminal o anda nerede bulunuyorsa orada çalışır. Komutun öngörülebilir bir başlangıç noktasına ihtiyacı varsa onu şununla başlatın: `cd "$(git rev-parse --show-toplevel)" &&` (Git deposunun en üst dizinine geçmek için) ya da `cd /some/folder &&` (sabit bir klasöre bağlamak için).

## Çalışma alanı açan komutlar

Bir komuta command dizesi yerine bir workspace nesnesi verirseniz komut bunun yerine yeni bir çalışma alanı açar; bu alan, terminalleri ve tarayıcıları barındıran bölünmüş bölmelerden oluşan bir ağaç olarak düzenlenir. Bir girdide bu ikisinden tam olarak biri bulunmalıdır.

cmux.json

```
{
  "commands": [
    {
      "name": "API Stack",
      "keywords": [
        "api",
        "server",
        "logs"
      ],
      "restart": "confirm",
      "workspace": {
        "name": "API",
        "cwd": "./services/api",
        "color": "#10b981",
        "env": {
          "PORT": "8080"
        },
        "layout": {
          "direction": "vertical",
          "split": 0.65,
          "children": [
            {
              "direction": "horizontal",
              "children": [
                {
                  "pane": {
                    "surfaces": [
                      {
                        "type": "terminal",
                        "name": "Server",
                        "command": "go run ./cmd/api",
                        "focus": true
                      }
                    ]
                  }
                },
                {
                  "pane": {
                    "surfaces": [
                      {
                        "type": "terminal",
                        "name": "Worker",
                        "command": "go run ./cmd/worker",
                        "env": {
                          "QUEUE": "default"
                        }
                      }
                    ]
                  }
                }
              ]
            },
            {
              "pane": {
                "surfaces": [
                  {
                    "type": "terminal",
                    "name": "Logs",
                    "cwd": "/var/log",
                    "command": "tail -F system.log"
                  },
                  {
                    "type": "browser",
                    "name": "Health",
                    "url": "http://localhost:8080/healthz"
                  }
                ]
              }
            }
          ]
        }
      }
    }
  ]
}
```

### Bir workspace nesnesinin alanları

-   `name`: Çalışma alanının başlığı; belirtilmezse komutun adı kullanılır
-   `cwd`: Çalışma alanının temel dizini; her sekmenin cwd değeri buna göre çözümlenir
-   `layout`: Aşağıda açıklanan düzen ağacının kök düğümü
-   `color`: Kenar çubuğu rengi; #RRGGBB onaltılık değeri veya bir çalışma alanı rengi adı olarak
-   `env`: Environment variables inherited by every shell in the workspace
-   `setup`: Bootstrap command sent to the workspace's first terminal before that terminal's own command

### Çalışma alanı zaten açıksa

Aynı adda bir çalışma alanı zaten varsa ne olacağına karar vermek için komutta restart değerini ayarlayın:

-   `"new"`: Yeni bir workspace oluştur (varsayılan)
-   `"confirm"`: Önce sorar, onaylarsanız onu değiştirir
-   `"recreate"`: Sormadan hemen değiştirir
-   `"ignore"`: Mevcut workspace’e geç

## Bir düzeni tanımlama

Bir düzen bir ağaçtır. Her iç düğüm kendi alanını ikiye böler ve her yaprak, sekmeleri barındıran bir bölmedir.

### Bölünme düğümleri

Bir bölünme kendi alanını iki parçaya ayırır:

-   `direction`: `"horizontal"` veya `"vertical"`
-   `children`: Her biri başka bir bölünme veya bir bölme olan tam olarak iki düğümden oluşan bir dizi
-   `split`: Ayırıcının alanın kesri olarak konumu. Varsayılan 0.5'tir; 0.1 ile 0.9 aralığı dışındaki değerler bu sınırlara çekilir

### Bölme düğümleri

Bölme, ağacın bir yaprağıdır. surfaces dizisi bölmenin açılırken içereceği sekmeleri listeler ve en az bir girdi içermelidir.

## Yüzeyler

Bir bölmenin surfaces dizisindeki her girdi, terminal ya da tarayıcı olan bir sekme açar:

-   `type`: `"terminal"` veya `"browser"`
-   `name`: Varsayılan yerine gösterilecek sekme başlığı
-   `focus`: Düzen oluşturulduktan sonra klavye odağını bu sekmeye vermek için true yapın
-   `command`: Yalnızca terminaller: terminal açılır açılmaz çalıştırılacak kabuk metni
-   `url`: Yalnızca tarayıcılar: yüklenecek sayfa
-   `cwd`: Bu sekmenin başlangıç dizini, aşağıdaki kurallarla çözümlenir
-   `env`: Ek ortam değişkeni adları ve değerlerinden oluşan bir nesne

### cwd değerleri nasıl çözümlenir

-   `~/path`: ana klasörünüzün içinde çözümlenir
-   / ile başlayan bir yol: olduğu gibi kullanılır
-   `./subdir`: çalışma alanı dizininin sonuna eklenir
-   `.` veya ayarlanmamış: çalışma alanı dizinini devralır

## Dosya yapısı

Eylem kayıt defteri bir nightly özelliğidir. `actions`, `shortcut` veya `ui.surfaceTabBar.buttons` kullanmadan önce en yeni nightly derlemeyi yükleyin.

`commands` yeniden kullanılabilir shell komutlarını ve çalışma alanı düzenlerini tanımlamaya devam eder. Nightly derlemeler bir `actions` kayıt defteri ekler. Eylemler surface sekme çubuğu, Command Palette ve eylem düzeyi kısayollar tarafından paylaşılan genel ID’lerdir.

cmux.json

```
{
  "actions": {
    "cmux.newTerminal": {
      "type": "agent",
      "agent": "claude",
      "title": "Claude Code",
      "subtitle": "Start Claude Code in a new tab"
    },
    "lint": {
      "type": "command",
      "title": "Lint",
      "subtitle": "Run the linter in a fresh tab",
      "keywords": [
        "eslint",
        "check"
      ],
      "command": "npm run lint",
      "shortcut": [
        "cmd+k",
        "cmd+l"
      ],
      "icon": {
        "type": "symbol",
        "name": "checkmark.seal"
      }
    },
    "scratch-dir": {
      "type": "command",
      "title": "Scratch Directory",
      "command": "cd \"$(mktemp -d)\"",
      "target": "currentTerminal",
      "palette": false,
      "icon": {
        "type": "emoji",
        "value": "📝",
        "scale": 0.85
      }
    },
    "api-stack": {
      "type": "workspaceCommand",
      "title": "API Stack",
      "commandName": "API Stack"
    }
  },
  "ui": {
    "surfaceTabBar": {
      "buttons": [
        "cmux.newTerminal",
        "cmux.splitRight",
        "lint",
        {
          "action": "scratch-dir",
          "tooltip": "cd into a new temp folder"
        }
      ]
    }
  },
  "commands": [
    {
      "name": "API Stack",
      "keywords": [
        "api"
      ],
      "workspace": {
        "cwd": "./services/api",
        "layout": {
          "pane": {
            "surfaces": [
              {
                "type": "terminal",
                "name": "Server",
                "command": "go run ./cmd/api"
              }
            ]
          }
        }
      }
    }
  ]
}
```

### Nightly eylem kayıt defteri

`actions` kararlı ID’leri çalıştırılabilir davranışa eşler. Varsayılanları geçersiz kılmak için yerleşik ID’ler olan `cmux.newTerminal`, `cmux.newBrowser`, `cmux.splitRight` ve `cmux.splitDown` kullanın. Projeye özel araçlar için kendi ID’lerinizi kullanın.

`palette` varsayılan olarak `true` değerindedir. Bir eylemi Command Palette içinden gizleyip surface sekme çubuğu veya kısayol üzerinden kullanılabilir tutmak için `false` yapın. `shortcut`, ayar kısayollarıyla aynı söz dizimini kullanır. Örneğin `cmd+shift+c` veya `["cmd+k", "cmd+c"]`.

`ui.surfaceTabBar.buttons` mevcut olduğunda varsayılan düğme listesinin yerini alır. Gizlemek için yerleşik bir ID’yi listeden çıkarın. İkonlar her zaman nesne biçimini kullanır: `{ "type": "symbol", "name": "play.circle" }`, `{ "type": "emoji", "value": "🧪", "scale": 0.9 }` veya `{ "type": "image", "path": "./icons/codex.svg" }`. Görüntü yolları config dosyasına görelidir. Emoji `scale` isteğe bağlıdır ve varsayılanı `1` değeridir. SVG, PDF, PNG, JPEG, GIF, TIFF, BMP, HEIC, HEIF, WebP, AVIF, ICO ve ICNS desteklenir.

Her düğme girdisi bir eylem ID string’i veya düğme nesnesi olabilir. Aynı eylemi farklı bir surface etiketi, ikon veya tooltip ile kullanmak istediğinizde düğme nesnesi kullanın. Çözümlenen düğme başlığı güven isteminin başlığı olarak da kullanılır.

Onay veya izin flag’lerini doğrudan çalıştırmak istediğiniz komut string’inin içine koyun. Varsayılan eylem hedefi `newTabInCurrentPane` olduğundan yaygın desen, mevcut pane içinde yeni bir terminal sekmesi açıp Codex, Claude Code veya OpenCode’u orada başlatmaktır.

Projeye yerel eylemler surface sekme çubuğunda ve Command Palette içinde hemen görünür. İlk çalıştırma yine güven ister. Güven repo başına değil, tam eylem parmak izi başına verilir. Projeye yerel görüntü ikonları, o eyleme güvenilene kadar kilitli kalır.

## Özel eylemler ve Command Palette

`actions` girdisi, cmux’un çalıştırdığı yeniden kullanılabilir davranıştır. Aynı davranışın Command Palette, yüzey sekme çubuğu, kısayollar veya artı düğmesi menüsünden kullanılmasını istediğinizde eylemleri kullanın. Yeniden kullanılabilir shell komutları ve çalışma alanı düzenleri için `commands` kullanmaya devam edin. Bir eylem Command Palette içinde görünmemeliyse `palette` değerini false yapın.

### Eylem türleri

-   `"command"`: Terminalde shell metni çalıştırır. Geçerli terminali veya geçerli bölmedeki yeni sekmeyi seçmek için target kullanın.
-   `"agent"`: Desteklenen bir kodlama ajanı başlatır. Bugün codex ve claude desteklenir, isteğe bağlı argümanlarla.
-   `"builtin"`: cmux.newTerminal, cmux.newBrowser, cmux.splitRight veya cmux.splitDown gibi yerleşik bir cmux eylemi için alias oluşturur. Yerleşik kopyalama eylemleri: cmux.copyWorkingDirectory terminalin çalışma dizinini, cmux.copyProjectRoot git deposunun kökünü (depo dışında çalışma dizinini) ve cmux.copyScreen görünür ekranı kopyalar. SSH, bulut veya uzak tmux çalışma alanında cmux, diğer ana makinedeki git deposunu bulamadığı için cmux.copyProjectRoot uzak çalışma dizinini kopyalar.
-   `"workspaceCommand"`: commands içinden adlandırılmış bir çalışma alanı tanımını çalıştırır. Çok bölmeli düzenler, özel çalışma dizinleri ve başlangıç komutları için kullanın.
-   `"workspace"`: Create a workspace from an inline workspace definition, with optional restart behavior. Offered in the new-workspace plus-button menu automatically.
-   `"setting"`: Genel cmux.json dosyanızdaki bir ayarı değiştirir; örneğin true/false bir ayarı açıp kapatır veya bir değer listesinde sırayla ilerler. Aşağıdaki Ayar eylemleri bölümüne bakın.
-   `"settingPreset"`: settingPresets içindeki adlandırılmış bir ayar grubunu tek adımda uygular.

### Eylem alanları

-   `title`: Command Palette satır başlığı, yüzey düğmesi etiketi, menü öğesi başlığı ve güven istemi başlığıdır, bir girdi üzerine yazmadığı sürece.
-   `subtitle` / `description`: Command Palette ikincil metni. description, subtitle için alias olarak kabul edilir.
-   `keywords`: Command Palette için ek arama terimleri.
-   `palette`: Özel eylemler için varsayılan true değeridir. Eylem başka yerlerden çağrılabilir kalsın ama Command Palette içinde görünmesin istiyorsanız false yapın.
-   `shortcut`: Ayar kısayollarıyla aynı tek vuruş veya iki adımlı chord sözdizimini kullanan isteğe bağlı eylem kısayolu.
-   `target`: Yalnızca command ve agent eylemleri için. currentTerminal veya newTabInCurrentPane kullanın.
-   `confirm`: Eylemi çalıştırmadan önce onay iste.
-   `newWorkspaceMenu`: Set true to offer any action in the new-workspace plus-button menu, or false to hide a workspace action from it.

### Command Palette davranışı

Command Palette çözümlenmiş eylem kayıt defterini okur. `palette` false değilse özel eylem ID’leri satır olarak eklenir. Eski `commands`, aynı oluşturulmuş ID’ye sahip bir eylem zaten yoksa otomatik olarak özel satırlar olarak eklenir. Yerleşik komutlar normal palet etiketlerini korur, ancak `cmux.newTerminal` gibi yerleşik bir ID’yi geçersiz kılmak bu ortak giriş noktasının arkasındaki davranışı değiştirir.

### Ayar eylemleri

Bir ayar eylemi, ayarın yolunu veren `path` ile şunlardan tam olarak birini belirtir: `set` (bir değer yazar), `toggle: true` (true/false bir ayarı tersine çevirir), `cycle` (listedeki sonraki değere geçer, sonuncudan sonra başa döner) veya `unset: true` (anahtarı cmux.json dosyasından kaldırır; böylece Ayarlar penceresindeki değer ya da varsayılan değer geçerli olur). toggle ve cycle, Ayarlar penceresinde belirlediğiniz değer dahil, cmux’un o anda kullandığı değerden başlar. settingPreset eylemi `settingPresets` içinden bir girdiyi uygular; bu girdi, iç içe nesneleri anahtar anahtar birleştirilen kısmi bir cmux.json’dur. cmux her değişikliği kaydetmeden önce şemaya göre denetler, yorumlarınızı ve diğer anahtarları korur ve değişikliği hemen uygular. Ayar eylemleri ve preset’ler yalnızca genel cmux.json dosyanızdan ve onun başvurduğu paketlerden çalışır; proje yapılandırmaları bunları tanımlayamaz.

~/.config/cmux/cmux.json

```
{
  "actions": {
    "scroll.cycle": {
      "type": "setting",
      "title": "Cycle Scroll Speed",
      "path": "terminal.scrollSpeed",
      "cycle": [1.0, 1.4, 1.8]
    },
    "editor.wrap": {
      "type": "setting",
      "title": "Toggle Editor Word Wrap",
      "path": "fileEditor.wordWrap",
      "toggle": true
    },
    "sidebar.quiet": {
      "type": "settingPreset",
      "title": "Quiet Sidebar",
      "preset": "sidebar.quiet"
    }
  },
  "settingPresets": {
    "sidebar.quiet": {
      "sidebar": { "showPorts": false, "showPullRequests": false, "showLog": false }
    }
  }
}
```

Aynı değişiklikler terminalden de yapılabilir: `cmux config set terminal.scrollSpeed 1.4`, `cmux config toggle fileEditor.wordWrap` ve `cmux config preset sidebar.quiet`.

`confirm: true` ile cmux kaydetmeden önce sorar ve eşdeğer cmux config komutunu gösterir. Yollar her "." karakterinde bölünür; bu yüzden kendisi "." içeren bir anahtar (örneğin ~/src/app.web için bir `workspaceGroups.byCwd` girdisi) bu yolla değiştirilemez. Onu doğrudan cmux.json içinde düzenleyin.

## Artı düğmesi için özel eylemler

Artı düğmesinin ne yaptığını geçersiz kılmak için `ui.newWorkspace.action` kullanın. Sıralı sağ tık menüsünü tanımlamak için `ui.newWorkspace.contextMenu` (veya `rightClick` alias’ı) kullanın. Menü girdileri eylem ID’leri, eylem nesneleri veya `{ "type": "separator" }` olabilir. Ayarlanmadığında menü, geçerli kısayollarıyla cmux.newWorkspace (⌘N), cmux.newCloudWorkspace (⌘Y), cmux.newCloudMachine (⇧⌘Y), cmux.newTerminal (⌘T), cmux.newBrowser (⇧⌘L) öğelerini listeler. Bulut öğeleri yalnızca Cloud Machines etkin olduğunda görünür. New Cloud Workspace en son seçilen Cloud çalışma alanının makinesini, ardından sağ kenar çubuğundaki ilk makineyi kullanır; kullanılabilir makine yoksa New Cloud Machine açılır.

cmux.json

```
{
  "actions": {
    "worktree-agents": {
      "type": "workspaceCommand",
      "title": "Agents in New Worktree",
      "commandName": "Agents in New Worktree",
      "icon": {
        "type": "symbol",
        "name": "arrow.triangle.branch"
      }
    }
  },
  "ui": {
    "newWorkspace": {
      "action": "worktree-agents",
      "contextMenu": [
        "worktree-agents",
        {
          "type": "separator"
        },
        {
          "action": "cmux.newWorkspace",
          "title": "Blank Workspace"
        },
        {
          "action": "cmux.newBrowser",
          "title": "Browser"
        }
      ]
    }
  },
  "commands": [
    {
      "name": "Agents in New Worktree",
      "description": "Branch off a new Git worktree, then run Codex and Claude Code in it side by side",
      "workspace": {
        "name": "Worktree",
        "layout": {
          "direction": "vertical",
          "split": 0.7,
          "children": [
            {
              "direction": "horizontal",
              "children": [
                {
                  "pane": {
                    "surfaces": [
                      {
                        "type": "terminal",
                        "name": "Codex",
                        "command": "marker=\"${TMPDIR:-/tmp}/cmux-wt-${CMUX_WORKSPACE_ID:-local}\"; echo \"Waiting for the worktree...\"; until [ -s \"$marker\" ]; do sleep 0.25; done; cd \"$(cat \"$marker\")\" && exec codex --yolo"
                      }
                    ]
                  }
                },
                {
                  "pane": {
                    "surfaces": [
                      {
                        "type": "terminal",
                        "name": "Claude",
                        "command": "marker=\"${TMPDIR:-/tmp}/cmux-wt-${CMUX_WORKSPACE_ID:-local}\"; echo \"Waiting for the worktree...\"; until [ -s \"$marker\" ]; do sleep 0.25; done; cd \"$(cat \"$marker\")\" && exec claude --dangerously-skip-permissions"
                      }
                    ]
                  }
                }
              ]
            },
            {
              "pane": {
                "surfaces": [
                  {
                    "type": "terminal",
                    "name": "Setup",
                    "command": "marker=\"${TMPDIR:-/tmp}/cmux-wt-${CMUX_WORKSPACE_ID:-local}\"; rm -f \"$marker\"; root=$(git rev-parse --show-toplevel) || exit 1; branch=\"wt-$(date +%m%d-%H%M%S)\"; wt=\"$root/../$(basename \"$root\")-$branch\"; git -C \"$root\" worktree add -b \"$branch\" \"$wt\" && printf \"%s\\n\" \"$wt\" > \"$marker\" && cd \"$wt\" && exec \"${SHELL:-/bin/zsh}\" -l",
                    "focus": true
                  }
                ]
              }
            }
          ]
        }
      }
    }
  ]
}
```

Bu örnek, normal artı tıklamasının `worktree-agents` eylemini çalıştırmasını sağlar. `commands` içindeki çalışma alanı komutu, önce Git `worktree` oluşturmak için görünür bir kurulum terminali kullanır. Codex ve Claude aynı anda başlar, çalışma alanına özgü durum dosyasını bekler ve sonra exec öncesinde oluşturulan dizine geçer.

## Workspace layouts

A workspace layout is stored as a `workspace` action, embedding a full workspace definition directly in the action so it needs no separate `commands` entry. It supports the same workspace fields plus `setup`, a bootstrap command sent to the first terminal before that terminal's own command:

cmux.json

```
{
  "actions": {
    "pair-review": {
      "type": "workspace",
      "title": "Pair Review",
      "icon": {
        "type": "symbol",
        "name": "person.2.wave.2"
      },
      "restart": "ignore",
      "newWorkspaceMenu": true,
      "workspace": {
        "name": "Review",
        "cwd": "~/src/app",
        "setup": "git pull --ff-only",
        "layout": {
          "direction": "horizontal",
          "split": 0.55,
          "children": [
            {
              "pane": {
                "surfaces": [
                  {
                    "type": "terminal",
                    "name": "Diff",
                    "command": "git log -p -n 5",
                    "focus": true
                  }
                ]
              }
            },
            {
              "pane": {
                "surfaces": [
                  {
                    "type": "terminal",
                    "name": "Codex",
                    "command": "codex"
                  },
                  {
                    "type": "terminal",
                    "name": "Shell"
                  }
                ]
              }
            }
          ]
        }
      }
    }
  }
}
```

Workspace layouts appear in the plus-button right-click menu automatically. Set `newWorkspaceMenu` to `false` to hide one, or to `true` on any other action to add it to the menu.

You can also create these without writing JSON: right-click the plus button and choose **Save Workspace as Layout** to capture the current workspace's splits, directories, running agents, and browser tabs into `~/.config/cmux/cmux.json`. They are stored as entries in the `actions` block. **Customize Workspace Layouts** opens that file in your editor.

### Default for new workspaces

Use the **Default for New Workspace** submenu to pick which saved workspace layout plain New Workspace should run, or choose None to return to a blank terminal. The save dialog also has a **Use as default for new workspaces** checkbox. The setting is `ui.newWorkspace.action`; a project-local `.cmux/cmux.json` value wins over `~/.config/cmux/cmux.json`.

## Tam örnek

cmux.json

```
{
  "actions": {
    "cmux.newTerminal": {
      "type": "command",
      "title": "Codex",
      "command": "codex --yolo",
      "shortcut": "cmd+t",
      "icon": {
        "type": "image",
        "path": "./icons/codex.svg"
      }
    },
    "review": {
      "type": "agent",
      "agent": "claude",
      "args": "--permission-mode plan",
      "title": "Plan with Claude",
      "shortcut": "cmd+shift+p",
      "icon": {
        "type": "symbol",
        "name": "list.bullet.clipboard"
      }
    },
    "storybook": {
      "type": "workspaceCommand",
      "commandName": "Storybook",
      "newWorkspaceMenu": true
    },
    "typecheck": {
      "type": "command",
      "title": "Typecheck",
      "command": "npx tsc --noEmit",
      "target": "newTabInCurrentPane",
      "confirm": false,
      "icon": {
        "type": "emoji",
        "value": "🔎"
      }
    }
  },
  "ui": {
    "surfaceTabBar": {
      "buttons": [
        "cmux.newTerminal",
        "review",
        {
          "action": "typecheck",
          "title": "tsc"
        },
        "cmux.newBrowser",
        "cmux.splitDown"
      ]
    },
    "newWorkspace": {
      "contextMenu": [
        "storybook",
        {
          "type": "separator"
        },
        "cmux.newTerminal",
        "cmux.newBrowser"
      ]
    }
  },
  "commands": [
    {
      "name": "Storybook",
      "description": "Component explorer with a live preview beside it",
      "keywords": [
        "ui",
        "components",
        "stories"
      ],
      "workspace": {
        "name": "Storybook",
        "cwd": "./packages/ui",
        "color": "#a855f7",
        "layout": {
          "direction": "horizontal",
          "split": 0.4,
          "children": [
            {
              "direction": "vertical",
              "split": 0.5,
              "children": [
                {
                  "pane": {
                    "surfaces": [
                      {
                        "type": "terminal",
                        "name": "Storybook",
                        "command": "npx storybook dev -p 6006 --no-open",
                        "focus": true
                      }
                    ]
                  }
                },
                {
                  "pane": {
                    "surfaces": [
                      {
                        "type": "terminal",
                        "name": "Tests",
                        "command": "npx vitest --watch",
                        "env": {
                          "CI": "false"
                        }
                      }
                    ]
                  }
                }
              ]
            },
            {
              "pane": {
                "surfaces": [
                  {
                    "type": "browser",
                    "name": "Preview",
                    "url": "http://localhost:6006"
                  }
                ]
              }
            }
          ]
        }
      }
    },
    {
      "name": "Install Dependencies",
      "keywords": [
        "install",
        "deps"
      ],
      "command": "npm ci",
      "confirm": true
    },
    {
      "name": "Open Changelog",
      "keywords": [
        "changes",
        "release"
      ],
      "command": "${EDITOR:-vi} CHANGELOG.md"
    }
  ]
}
```

Canonical: https://cmux.com/tr/docs/custom-commands

Documentation index: https://cmux.com/llms.txt
