## 経緯 [[cmux]] 0.64.0 で追加されたセッションのレジューム機能を試すのに必要なので試してみる。 <div class="link-card-v2"> <div class="link-card-v2-site"> <img class="link-card-v2-site-icon" src="https://github.githubassets.com/favicons/favicon.svg" /> <span class="link-card-v2-site-name">GitHub</span> </div> <div class="link-card-v2-title"> Restore previous sessions and resume agents by austinywang · Pull Request #2978 · manaflow-ai/cmux </div> <div class="link-card-v2-content"> Summaryrestore the previous saved cmux session from relaunch, File &gt; Reopen Previous Session, ⌘⇧O, or cmux re ... </div> <img class="link-card-v2-image" src="https://opengraph.githubassets.com/c0b542b8485465e562ebd09408b7059e2360ac2e979559714d60af3deb40efdd/manaflow-ai/cmux/pull/2978" /> <a href="https://github.com/manaflow-ai/cmux/pull/2978"></a> </div> ## インストール ```console cmux hooks codex install ``` `~/.codex/hooks.json` が追加される。 ```json { "hooks" : { "PermissionRequest" : [ { "hooks" : [ { "command" : "[ -n \"$CMUX_SURFACE_ID\" ] && [ \"$CMUX_CODEX_HOOKS_DISABLED\" != \"1\" ] && command -v cmux >\/dev\/null 2>&1 && cmux hooks feed --source codex --event PermissionRequest || echo '{}'", "timeout" : 120000, "type" : "command" } ] } ], "PreToolUse" : [ { "hooks" : [ { "command" : "[ -n \"$CMUX_SURFACE_ID\" ] && [ \"$CMUX_CODEX_HOOKS_DISABLED\" != \"1\" ] && command -v cmux >\/dev\/null 2>&1 && cmux hooks feed --source codex --event PreToolUse || echo '{}'", "timeout" : 120000, "type" : "command" } ] } ], "SessionStart" : [ { "hooks" : [ { "command" : "[ -n \"$CMUX_SURFACE_ID\" ] && [ \"$CMUX_CODEX_HOOKS_DISABLED\" != \"1\" ] && command -v cmux >\/dev\/null 2>&1 && cmux hooks codex session-start || echo '{}'", "timeout" : 5000, "type" : "command" } ] } ], "Stop" : [ { "hooks" : [ { "command" : "[ -n \"$CMUX_SURFACE_ID\" ] && [ \"$CMUX_CODEX_HOOKS_DISABLED\" != \"1\" ] && command -v cmux >\/dev\/null 2>&1 && cmux hooks codex stop || echo '{}'", "timeout" : 5000, "type" : "command" } ] } ], "UserPromptSubmit" : [ { "hooks" : [ { "command" : "[ -n \"$CMUX_SURFACE_ID\" ] && [ \"$CMUX_CODEX_HOOKS_DISABLED\" != \"1\" ] && command -v cmux >\/dev\/null 2>&1 && cmux hooks codex prompt-submit || echo '{}'", "timeout" : 5000, "type" : "command" } ] } ] } } ``` `~/.codex/config.toml` に以下が追加される。 ```toml [features] codex_hooks = true ``` ## 動作確認 [[Codex CLI]]を立ち上げた状態のまま、[[cmux]]を閉じたところ、再起動したときに各セッションが再起動された。 ## 参考調査 > [!left-bubble] ![[chappy-mini.webp]] > 主な影響はこのあたりです。 1. `~/.codex/hooks.json` が作成/更新される `SessionStart`、`UserPromptSubmit`、`Stop` の hook が追加されます。既存 hook は残し、cmux が以前入れた hook だけ差し替える実装です。 2. `~/.codex/config.toml` に `codex_hooks = true` が入る これで Codex 側の hook 機能が有効になります。アンインストール時は cmux がこの行を削除します。 3. Codex 実行中に hook ごとに `cmux hooks codex ...` が呼ばれる cmux 内の Codex なら、セッションID・cwd・workspace/surface 対応を `~/.cmuxterm/codex-hook-sessions.json` に保存します。これが復元用の元データです。 4. cmux の UI 状態に反映される prompt submit で Codex status が `Running` になり、通知がクリアされます。Stop で完了通知、Idle/Error status、必要なら transcript monitor による失敗要約が走ります。 5. Feed/permission 系にも効く Codex の `PermissionRequest` など、Feed 対象 hook も `~/.codex/hooks.json` 経由で cmux に流せるようになります。 6. cmux 外で Codex を起動した場合 `CMUX_SURFACE_ID` / `CMUX_WORKSPACE_ID` がない場合は基本 no-op になる設計です。つまり、普通のターミナルで Codex を使っても cmux への通知・状態更新はしません。 副作用として一番現実的なのは、Codex の各 hook イベントで `cmux` プロセスが短時間起動するため、わずかなオーバーヘッドが増えることです。hook timeout は Codex 用に 5000ms で設定されていますが、cmux 外では早期 no-op、cmux 内でも主に socket 更新と state ファイル更新です。 戻す場合は: ```bash cmux hooks codex uninstall ``` または互換 alias: ```bash cmux codex uninstall-hooks ```