## 経緯
[[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 > 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
```