Skip to content
Merged
Show file tree
Hide file tree
Changes from 63 commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
8fa98d6
Add surface resume bindings
lawrencecchen May 16, 2026
6bd7531
Fix surface resume review findings
lawrencecchen May 18, 2026
3e91951
Fix surface resume closeout findings
lawrencecchen May 18, 2026
dd032dd
Fix surface resume review follow-ups
lawrencecchen May 18, 2026
265d9bd
Fix codex teams surface resume restoration
lawrencecchen May 18, 2026
42c7e03
Fix tmux resume detection closeout
lawrencecchen May 18, 2026
a04ff36
Add surface resume window scope regression test
lawrencecchen May 18, 2026
ed77152
Fix surface resume closeout regressions
lawrencecchen May 18, 2026
ebfc2ba
Add moved tmux binding regression test
lawrencecchen May 18, 2026
e7c4540
Fix moved tmux binding detection
lawrencecchen May 18, 2026
723c683
Add surface resume closeout regression tests
lawrencecchen May 18, 2026
ad0446a
Fix restored bindings and codex fork resumes
lawrencecchen May 18, 2026
329292c
Add restored agent binding invalidation tests
lawrencecchen May 18, 2026
5a1be27
Clear stale restored agent bindings
lawrencecchen May 18, 2026
63901ba
Add stale process-detected binding regression test
lawrencecchen May 18, 2026
14fd937
Clear stale process-detected resume bindings
lawrencecchen May 18, 2026
1246469
Add unscanned surface resume snapshot regression test
lawrencecchen May 18, 2026
ccfd588
Preserve process-detected bindings before scan
lawrencecchen May 18, 2026
69f0a7a
Add agent resume binding session-end tests
lawrencecchen May 18, 2026
d026b10
Clear agent resume bindings on session end
lawrencecchen May 18, 2026
d95e40e
Guard surface resume CLI clears
lawrencecchen May 18, 2026
f588c77
Tighten agent resume binding lifecycle
lawrencecchen May 18, 2026
16279ba
Fix resume target fallback ordering
lawrencecchen May 18, 2026
185820a
Reject malformed surface resume targets
lawrencecchen May 18, 2026
66979cd
Document surface resume bindings
lawrencecchen May 18, 2026
c69fda9
Fix tmux process title resume detection
lawrencecchen May 18, 2026
70409e2
Reconcile process-detected resume bindings
lawrencecchen May 18, 2026
1203159
Scope resume binding environment to command
lawrencecchen May 18, 2026
dacfefa
Handle long surface resume inputs
lawrencecchen May 18, 2026
14e6f2f
Harden surface resume auto-run trust
lawrencecchen May 18, 2026
825430e
Localize session restore docs
lawrencecchen May 18, 2026
9d6e2c2
Harden surface resume persistence
lawrencecchen May 18, 2026
b705113
Address surface resume review findings
lawrencecchen May 18, 2026
3a5339e
Guard stale resume binding clears
lawrencecchen May 18, 2026
9faf8ed
Prefer trusted tmux resume bindings
lawrencecchen May 18, 2026
305a5da
Reject malformed resume clear guards
lawrencecchen May 18, 2026
160a1ca
Harden surface resume target handling
lawrencecchen May 18, 2026
e9fda2c
Preserve restored tmux resume bindings
lawrencecchen May 18, 2026
96d2b7b
Respect resume target restore scopes
lawrencecchen May 18, 2026
428321b
Harden process-detected resume bindings
lawrencecchen May 18, 2026
2c3aefb
Fix codex resume argument order
lawrencecchen May 18, 2026
b5346e2
Guard process-detected session save races
lawrencecchen May 18, 2026
4fab49c
Fix Codex Teams resume test expectation
lawrencecchen May 18, 2026
a5a8008
Tighten tmux resume binding safety
lawrencecchen May 18, 2026
0294829
Extract tmux resume parser
lawrencecchen May 18, 2026
3d3345f
Harden public resume binding sources
lawrencecchen May 18, 2026
6200003
Fix surface resume CLI edge cases
lawrencecchen May 18, 2026
7933b8d
Limit tmux resume detection to foreground jobs
lawrencecchen May 18, 2026
192370c
Honor tab_id for surface resume targets
lawrencecchen May 18, 2026
05065e0
Reject dangling surface resume CLI options
lawrencecchen May 18, 2026
dcf1fa2
Validate surface resume CLI before socket connect
lawrencecchen May 18, 2026
c54782c
Preserve tmux socket environment for resume
lawrencecchen May 18, 2026
8597145
Harden surface resume command parsing
lawrencecchen May 18, 2026
601c84e
Reject commandless tmux resume bindings
lawrencecchen May 18, 2026
4c4a6b3
Tighten surface resume argument handling
lawrencecchen May 18, 2026
394e7cf
Fix surface resume cleanup regressions
lawrencecchen May 18, 2026
daa091c
Keep surface resume routing non-focusing
lawrencecchen May 18, 2026
353afba
Route explicit surface resume targets globally
lawrencecchen May 18, 2026
498d44e
Validate surface resume shell commands before socket connect
lawrencecchen May 18, 2026
b4b4d32
Add signed surface resume approvals
lawrencecchen May 18, 2026
7cced45
Fix surface resume prompt actor warnings
lawrencecchen May 18, 2026
7b7401e
Fix surface resume restore gating
lawrencecchen May 18, 2026
9d950fd
merge: resolve conflicts with main
lawrencecchen May 19, 2026
b9df8d0
fix: keep agent-hook resume state trusted
lawrencecchen May 19, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
673 changes: 667 additions & 6 deletions CLI/cmux.swift

Large diffs are not rendered by default.

24 changes: 21 additions & 3 deletions README.ar.md
Original file line number Diff line number Diff line change
Expand Up @@ -236,15 +236,33 @@ cmux هو لبنة أساسية وليس حلًا جاهزًا. يمنحك طر

cmux NIGHTLY هو تطبيق منفصل بمعرّف حزمة خاص به، لذا يعمل بجانب الإصدار المستقر. يُبنى تلقائيًا من أحدث commit على فرع `main` ويتم تحديثه تلقائيًا عبر Sparkle الخاص به.

## استعادة الجلسة (السلوك الحالي)
## استعادة الجلسة

عند إعادة التشغيل، يستعيد cmux حاليًا تخطيط التطبيق والبيانات الوصفية فقط:
عند إغلاق cmux، يتم حفظ الجلسة الحالية. عند إعادة التشغيل، يستعيد cmux الحالة التي يملكها التطبيق:
- تخطيط النوافذ/مساحات العمل/الأجزاء
- مجلدات العمل
- سجل تمرير الطرفية (أفضل جهد)
- عنوان URL للمتصفح وسجل التنقل

cmux **لا** يستعيد حالة العمليات الحية داخل تطبيقات الطرفية. على سبيل المثال، جلسات Claude Code/tmux/vim النشطة لا يتم استئنافها بعد إعادة التشغيل بعد.
لا ينشئ cmux نقاط تحقق لأي حالة عملية حية عشوائية. يعاد فتح tmux وvim وshell وتطبيقات الطرفية غير المدعومة كطرفيات عادية.

يمكن استئناف جلسات الوكلاء المدعومة عندما تحفظ hooks معرف جلسة أصليًا:

```bash
cmux hooks setup
cmux hooks setup codex
cmux hooks setup --agent opencode
```

يمكن للمستخدمين المتقدمين والتكاملات ربط أمر استئناف مخصص بسطح الطرفية الحالي. هذا مفيد للأدوات التي تملك حالة دائمة خاصة بها، مثل جلسات tmux أو واجهات agent CLI مخصصة:

```bash
cmux surface resume set --kind tmux --checkpoint work --shell "tmux attach -t work"
cmux surface resume show --json
cmux surface resume clear --checkpoint work
```

يبقى هذا الربط مرتبطًا بسطح cmux. تُحفظ الارتباطات التي ينشئها CLI العام أو socket للفحص والاستئناف اليدوي. لا يشغّل cmux تلقائيًا إلا ارتباطات الاستئناف التي يضع عليها علامة موثوقة، مثل ارتباطات tmux المكتشفة من العمليات الحية. تُسقط مفاتيح البيئة الحساسة مثل الرموز وكلمات المرور والأسرار ومفاتيح API قبل حفظ ربط الاستئناف.

## تاريخ النجوم

Expand Down
24 changes: 21 additions & 3 deletions README.bs.md
Original file line number Diff line number Diff line change
Expand Up @@ -236,15 +236,33 @@ Prečice razvojnih alata preglednika prate Safari zadane postavke i mogu se pril

cmux NIGHTLY je zasebna aplikacija sa vlastitim bundle ID-om, tako da radi uporedo sa stabilnom verzijom. Automatski se gradi iz najnovijeg `main` commita i ažurira se putem vlastitog Sparkle feeda.

## Vraćanje sesije (trenutno ponašanje)
## Vraćanje sesije

Prilikom ponovnog pokretanja, cmux trenutno vraća samo raspored aplikacije i metapodatke:
Kada zatvorite cmux, trenutna sesija se sprema. Pri ponovnom pokretanju cmux vraća stanje kojim upravlja aplikacija:
- Raspored prozora/radnih prostora/panela
- Radne direktorije
- Scrollback terminala (po mogućnosti)
- URL preglednika i historija navigacije

cmux **ne** vraća stanje živih procesa unutar terminalnih aplikacija. Na primjer, aktivne sesije Claude Code/tmux/vim se još ne nastavljaju nakon restarta.
cmux ne pravi checkpoint proizvoljnog stanja živih procesa. tmux, vim, shellovi i nepodržane terminalne aplikacije ponovo se otvaraju kao obični terminali.

Podržane agent sesije mogu se nastaviti kada hooks spreme izvorni ID sesije:

```bash
cmux hooks setup
cmux hooks setup codex
cmux hooks setup --agent opencode
```

Napredni korisnici i integracije mogu vezati prilagođenu komandu za nastavak na trenutni terminal surface. To je korisno za alate s vlastitim trajnim stanjem, poput tmux sesija ili prilagođenih agent CLI alata:

```bash
cmux surface resume set --kind tmux --checkpoint work --shell "tmux attach -t work"
cmux surface resume show --json
cmux surface resume clear --checkpoint work
```

Binding ostaje vezan za cmux surface. Bindingi napravljeni javnim CLI-jem ili socketom čuvaju se za pregled i ručni nastavak. cmux automatski pokreće samo resume bindinge koje označi pouzdanim, poput tmux bindinga otkrivenih iz živih procesa. Osjetljivi ključevi okruženja, poput tokena, lozinki, tajni i API ključeva, odbacuju se prije spremanja resume bindinga.

## Historija zvjezdica

Expand Down
24 changes: 21 additions & 3 deletions README.da.md
Original file line number Diff line number Diff line change
Expand Up @@ -236,15 +236,33 @@ Browserens udviklerværktøjsgenveje følger Safaris standarder og kan tilpasses

cmux NIGHTLY er en separat app med sit eget bundle-ID, så den kører side om side med den stabile version. Bygges automatisk fra det seneste `main`-commit og opdaterer sig selv automatisk via sit eget Sparkle-feed.

## Sessionsgenoprettelse (nuværende adfærd)
## Sessionsgenoprettelse

Ved genstart genopretter cmux i øjeblikket kun app-layout og metadata:
Når du afslutter cmux, gemmes den aktuelle session. Ved genstart genopretter cmux app-ejet tilstand:
- Vindue/workspace/panel-layout
- Arbejdsmapper
- Terminal-scrollback (best effort)
- Browser-URL og navigationshistorik

cmux genopretter **ikke** aktive procestilstande i terminalapps. For eksempel genoptages aktive Claude Code/tmux/vim-sessioner endnu ikke efter genstart.
cmux tager ikke checkpoints af vilkårlig aktiv procestilstand. tmux, vim, shells og ikke-understøttede terminalapps åbnes igen som normale terminaler.

Understøttede agent-sessioner kan genoptages, når hooks har gemt et native sessions-ID:

```bash
cmux hooks setup
cmux hooks setup codex
cmux hooks setup --agent opencode
```

Avancerede brugere og integrationer kan knytte en brugerdefineret genoptagelseskommando til den aktuelle terminal-surface. Det er nyttigt for værktøjer med egen varig tilstand, som tmux-sessioner eller brugerdefinerede agent-CLI'er:

```bash
cmux surface resume set --kind tmux --checkpoint work --shell "tmux attach -t work"
cmux surface resume show --json
cmux surface resume clear --checkpoint work
```

Bindingen forbliver knyttet til cmux-surfacen. Bindinger oprettet via offentlig CLI eller socket gemmes til inspektion og manuel genoptagelse. cmux auto-kører kun resume-bindinger, som den markerer som betroede, for eksempel tmux-bindinger fundet fra live processer. Følsomme miljønøgler som tokens, adgangskoder, hemmeligheder og API-nøgler fjernes, før en resume-binding gemmes.

## Stjernehistorik

Expand Down
24 changes: 21 additions & 3 deletions README.de.md
Original file line number Diff line number Diff line change
Expand Up @@ -236,15 +236,33 @@ Tastenkürzel für Browser-Entwicklertools folgen den Safari-Standardeinstellung

cmux NIGHTLY ist eine separate App mit eigener Bundle-ID, die neben der stabilen Version läuft. Wird automatisch vom neuesten `main`-Commit gebaut und aktualisiert sich über einen eigenen Sparkle-Feed.

## Sitzungswiederherstellung (aktuelles Verhalten)
## Sitzungswiederherstellung

Beim Neustart stellt cmux derzeit nur App-Layout und Metadaten wieder her:
Beim Beenden speichert cmux die aktuelle Sitzung. Beim Neustart stellt cmux den von der App verwalteten Zustand wieder her:
- Fenster-/Arbeitsbereich-/Bereichs-Layout
- Arbeitsverzeichnisse
- Terminal-Scrollback (bestmöglich)
- Browser-URL und Navigationsverlauf

cmux stellt **keine** laufenden Prozesse in Terminal-Apps wieder her. Zum Beispiel werden aktive Claude Code-/tmux-/vim-Sitzungen nach einem Neustart noch nicht fortgesetzt.
cmux erstellt keine Prüfpunkte für beliebige laufende Prozesse. tmux, vim, Shells und nicht unterstützte Terminal-Apps werden als normale Terminals erneut geöffnet.

Unterstützte Agent-Sitzungen können fortgesetzt werden, wenn Hooks eine native Sitzungs-ID gespeichert haben:

```bash
cmux hooks setup
cmux hooks setup codex
cmux hooks setup --agent opencode
```

Fortgeschrittene Nutzer und Integrationen können einen eigenen Wiederaufnahmebefehl an die aktuelle Terminal-Surface binden. Das ist nützlich für Werkzeuge mit eigenem dauerhaftem Zustand, etwa tmux-Sitzungen oder eigene Agent-CLIs:

```bash
cmux surface resume set --kind tmux --checkpoint work --shell "tmux attach -t work"
cmux surface resume show --json
cmux surface resume clear --checkpoint work
```

Die Bindung bleibt mit der cmux-Surface verknüpft. Über öffentliche CLI oder Socket erstellte Bindungen werden zur Prüfung und manuellen Wiederaufnahme gespeichert. cmux startet nur Wiederaufnahme-Bindungen automatisch, die als vertrauenswürdig markiert sind, zum Beispiel aus laufenden Prozessen erkannte tmux-Bindungen. Sensible Umgebungsvariablen wie Tokens, Passwörter, Secrets und API-Keys werden verworfen, bevor eine Wiederaufnahme-Bindung gespeichert wird.

## Star-Verlauf

Expand Down
24 changes: 21 additions & 3 deletions README.es.md
Original file line number Diff line number Diff line change
Expand Up @@ -236,15 +236,33 @@ Los atajos de herramientas de desarrollo del navegador siguen los valores predet

cmux NIGHTLY es una app separada con su propio bundle ID, por lo que se ejecuta junto a la versión estable. Se compila automáticamente desde el último commit de `main` y se actualiza automáticamente a través de su propio feed de Sparkle.

## Restauración de sesión (comportamiento actual)
## Restauración de sesión

Al relanzar, cmux actualmente restaura solo el diseño y los metadatos de la aplicación:
Al salir, cmux guarda la sesión actual. Al relanzar, cmux restaura el estado que pertenece a la app:
- Diseño de ventanas/espacios de trabajo/paneles
- Directorios de trabajo
- Historial de desplazamiento del terminal (mejor esfuerzo)
- URL del navegador e historial de navegación

cmux **no** restaura el estado de los procesos activos dentro de las aplicaciones de terminal. Por ejemplo, las sesiones activas de Claude Code/tmux/vim no se reanudan después de reiniciar todavía.
cmux no guarda puntos de control de procesos activos arbitrarios. tmux, vim, shells y apps de terminal no compatibles se vuelven a abrir como terminales normales.

Las sesiones de agentes compatibles pueden reanudarse cuando los hooks han guardado un ID de sesión nativo:

```bash
cmux hooks setup
cmux hooks setup codex
cmux hooks setup --agent opencode
```

Los usuarios avanzados y las integraciones pueden asociar un comando de reanudación personalizado a la superficie de terminal actual. Esto es útil para herramientas con estado duradero propio, como sesiones tmux o CLIs de agentes personalizados:

```bash
cmux surface resume set --kind tmux --checkpoint work --shell "tmux attach -t work"
cmux surface resume show --json
cmux surface resume clear --checkpoint work
```

La asociación queda ligada a la superficie de cmux. Las asociaciones creadas por el CLI público o el socket se guardan para inspección y reanudación manual. cmux solo ejecuta automáticamente las asociaciones de reanudación que marca como confiables, como las de tmux detectadas desde procesos activos. Las claves de entorno sensibles, como tokens, contraseñas, secretos y claves de API, se descartan antes de guardar una asociación de reanudación.

## Historial de estrellas

Expand Down
24 changes: 21 additions & 3 deletions README.fr.md
Original file line number Diff line number Diff line change
Expand Up @@ -236,15 +236,33 @@ Les raccourcis des outils de développement du navigateur suivent les valeurs pa

cmux NIGHTLY est une application séparée avec son propre identifiant de bundle, elle fonctionne donc en parallèle de la version stable. Construite automatiquement à partir du dernier commit `main` et mise à jour automatiquement via son propre flux Sparkle.

## Restauration de session (comportement actuel)
## Restauration de session

Au relancement, cmux restaure actuellement uniquement la disposition et les métadonnées de l'application :
À la fermeture, cmux enregistre la session en cours. Au relancement, cmux restaure l'état géré par l'application :
- Disposition des fenêtres/espaces de travail/panneaux
- Répertoires de travail
- Historique de défilement du terminal (au mieux)
- URL du navigateur et historique de navigation

cmux ne restaure **pas** l'état des processus actifs dans les applications du terminal. Par exemple, les sessions actives de Claude Code/tmux/vim ne sont pas encore reprises après un redémarrage.
cmux ne crée pas de point de contrôle pour n'importe quel processus actif. tmux, vim, les shells et les applications de terminal non prises en charge se rouvrent comme des terminaux normaux.

Les sessions d'agents prises en charge peuvent reprendre lorsque les hooks ont enregistré un ID de session natif :

```bash
cmux hooks setup
cmux hooks setup codex
cmux hooks setup --agent opencode
```

Les utilisateurs avancés et les intégrations peuvent associer une commande de reprise personnalisée à la surface de terminal active. C'est utile pour les outils qui ont leur propre état durable, comme les sessions tmux ou les CLI d'agents personnalisés :

```bash
cmux surface resume set --kind tmux --checkpoint work --shell "tmux attach -t work"
cmux surface resume show --json
cmux surface resume clear --checkpoint work
```

Cette association reste liée à la surface cmux. Les associations créées par le CLI public ou le socket sont conservées pour inspection et reprise manuelle. cmux exécute automatiquement seulement les associations de reprise qu'il marque comme fiables, comme les associations tmux détectées depuis des processus actifs. Les clés d’environnement sensibles, comme les jetons, mots de passe, secrets et clés API, sont supprimées avant l’enregistrement d’une association de reprise.

## Historique des étoiles

Expand Down
24 changes: 21 additions & 3 deletions README.it.md
Original file line number Diff line number Diff line change
Expand Up @@ -236,15 +236,33 @@ Le scorciatoie degli strumenti di sviluppo del browser seguono i valori predefin

cmux NIGHTLY è un'app separata con il proprio bundle ID, quindi funziona in parallelo alla versione stabile. Compilata automaticamente dall'ultimo commit `main` e aggiornata automaticamente tramite il proprio feed Sparkle.

## Ripristino sessione (comportamento attuale)
## Ripristino sessione

Al riavvio, cmux attualmente ripristina solo il layout e i metadati dell'applicazione:
Alla chiusura, cmux salva la sessione corrente. Al riavvio, cmux ripristina lo stato gestito dall'app:
- Layout di finestre/workspace/pannelli
- Directory di lavoro
- Scrollback del terminale (best effort)
- URL del browser e cronologia di navigazione

cmux **non** ripristina lo stato dei processi attivi nelle applicazioni del terminale. Per esempio, le sessioni attive di Claude Code/tmux/vim non vengono ancora riprese dopo un riavvio.
cmux non crea checkpoint per processi attivi arbitrari. tmux, vim, shell e app terminale non supportate si riaprono come terminali normali.

Le sessioni degli agent supportati possono riprendere quando gli hook hanno salvato un ID sessione nativo:

```bash
cmux hooks setup
cmux hooks setup codex
cmux hooks setup --agent opencode
```

Utenti avanzati e integrazioni possono associare un comando di ripristino personalizzato alla surface del terminale corrente. È utile per strumenti con stato persistente proprio, come sessioni tmux o CLI agent personalizzate:

```bash
cmux surface resume set --kind tmux --checkpoint work --shell "tmux attach -t work"
cmux surface resume show --json
cmux surface resume clear --checkpoint work
```

L'associazione resta legata alla surface di cmux. Le associazioni create dal CLI pubblico o dal socket vengono salvate per ispezione e ripristino manuale. cmux esegue automaticamente solo le associazioni di resume che marca come attendibili, per esempio quelle tmux rilevate dai processi attivi. Le chiavi di ambiente sensibili, come token, password, segreti e chiavi API, vengono scartate prima di salvare un’associazione di resume.

## Cronologia Stelle

Expand Down
24 changes: 21 additions & 3 deletions README.ja.md
Original file line number Diff line number Diff line change
Expand Up @@ -236,15 +236,33 @@ cmuxの設定方法の詳細は、[ドキュメントをご覧ください](http

cmux NIGHTLYは独自のバンドルIDを持つ別のアプリなので、安定版と並行して実行できます。最新の`main`コミットから自動的にビルドされ、独自のSparkleフィード経由で自動更新されます。

## セッション復元(現在の動作)
## セッション復元

再起動時、cmuxは現在アプリのレイアウトとメタデータのみを復元します:
終了すると、cmuxは現在のセッションを保存します。再起動時にcmuxはアプリが管理する状態を復元します:
- ウィンドウ/ワークスペース/ペインのレイアウト
- 作業ディレクトリ
- ターミナルのスクロールバック(ベストエフォート)
- ブラウザのURLとナビゲーション履歴

cmuxはターミナルアプリ内のライブプロセスの状態を復元**しません**。例えば、アクティブなClaude Code/tmux/vimセッションは再起動後にまだ再開されません。
cmuxは任意のライブプロセス状態をチェックポイントしません。tmux、vim、シェル、未対応のターミナルアプリは通常のターミナルとして再度開きます。

対応エージェントは、フックがネイティブセッションIDを保存している場合に復元できます:

```bash
cmux hooks setup
cmux hooks setup codex
cmux hooks setup --agent opencode
```

上級ユーザーや連携機能は、現在のターミナルサーフェスにカスタム復元コマンドを紐づけられます。tmuxセッションやカスタムエージェントCLIのように、独自の永続状態を持つツールに使います:

```bash
cmux surface resume set --kind tmux --checkpoint work --shell "tmux attach -t work"
cmux surface resume show --json
cmux surface resume clear --checkpoint work
```

この紐づけはcmuxサーフェスに保存されます。公開CLIやsocketで作成された紐づけは確認と手動復元用に保存されます。cmuxが自動実行するのは、実行中プロセスから検出したtmux紐づけなど、信頼済みとして扱う復元紐づけだけです。 トークン、パスワード、シークレット、APIキーなどの機密環境変数キーは、復元紐づけを保存する前に破棄されます。

## Star History

Expand Down
Loading
Loading