Ö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)
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.
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.
{
"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 etiketcommand: cmux'un odaktaki terminale yazıp çalıştırdığı kabuk metnidescription: Girdinin yanında gösterilen isteğe bağlı ikincil metinkeywords: Command Palette'te arama yaptığınızda bu girdiyle eşleşmesi gereken ek sözcüklerconfirm: 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.
{
"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ırcwd: Çalışma alanının temel dizini; her sekmenin cwd değeri buna göre çözümlenirlayout: 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ı olarakenv: Environment variables inherited by every shell in the workspacesetup: 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 dizisplit: 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ıncommand: Yalnızca terminaller: terminal açılır açılmaz çalıştırılacak kabuk metniurl: Yalnızca tarayıcılar: yüklenecek sayfacwd: Bu sekmenin başlangıç dizini, aşağıdaki kurallarla çözümlenirenv: 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ı
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.
{
"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.
Ö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.
{
"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.
{
"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:
{
"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
{
"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"
}
]
}