Skip to content

v0.19.0

Choose a tag to compare

@Kewton Kewton released this 03 Aug 03:42
· 441 commits to main since this release
52291d0

[0.19.0] - 2026-08-03

Highlight: tmux セッションを「読める」「取りこぼさない」状態にし、Codex ワーカーに対して検証ゲートが機能していなかった穴を塞いだリリース。 attach しても transcript が一行も見えなかった 200×1000 キャンバスに、ジオメトリを一切変えないオンデマンドの読むモード(prefix+g の popup ページャと capture --pane)を足した。あわせて、history-limit が一度も pane に適用されておらず全セッションが tmux 既定の 2000 行で動いていた欠陥(稼働中の codex セッションが 1977/2000 で古い履歴を捨て続けていた)と、wait が未起動セッションを完了扱いして --verify の exit 0 が完走を意味しなくなっていた欠陥を修正した。

Added

  • attach しても一行も読めない tmux セッションに、ジオメトリ非破壊の「読むモード」を追加 (#1623): 200×1000 のキャンバス(#1163)でカーソルが 997 行目に居座るため、attach しても可視域は空白と入力欄だけになる(実測: 72 行のクライアントで transcript 可視 0 行)。prefix+g で display-popup にレイアウト空行を畳んだ transcript を出す案Aと、attach も tmux 3.2+ も要らない commandmate capture <id> --pane [--tail N] [--raw] [--json](案B、tmux <3.2 のフォールバック)の 2 本立てで解決した。ジオメトリと capture-pane の要求 argv は一切変えない(Auto-Yes / status-detector / 応答保存が依存しているため、変異注入で赤を確認したテストで固定)。bind-key はサーバグローバルなので、display-popup 能力プローブ・list-keys による衝突検査(他人のバインドは上書きしない)・#{m:mcbd-*,#{session_name}} によるセッション名ガードを必須にし、いずれかに引っかかれば bind-key を 1 回も発行しない。キーは CM_READ_MODE_KEY、無効化は CM_READ_MODE=off(前回導入したバインドを削除する収束型。複数サーバが 1 つの tmux サーバを共有するため停止時 unbind は行わない)。空行圧縮は #1172 の Web UI 正規化と同一ルールで、TS 版・popup が実行する awk 版・#1172 版の 3 実装が実 capture 3 本に対しバイト一致することを conformance テストで固定した。5 件の未解決事項の決定と実測(Issue 本文との食い違い 3 件を含む)は docs/design/1623-tmux-reading-mode.md

Fixed

  • tmux セッションの scrollback が意図の 1/25(tmux 既定の 2000 行)しか確保されていなかった問題を修正 (#1624): history-limit はセッションオプションだが、pane は生成時点の値でスクロールバッファを一度だけ確保する。new-session(この時点で window 0 と pane ができる)の後に set-option していたため、show-options は 50000 を返すのに pane の #{history_limit} は 2000 のままという乖離が生じていた(実測: 稼働中の mcbd-codex-* セッションが 1977/2000 行と使用率 98.85% で、古い履歴を落とし続けていた)。影響を受けるのは scrollback を持つ非 alternate-screen ツール(codex / gemini / vibe-local / antigravity)で、claude / opencode / copilot は history_size=0 のため無関係。set-option → new-window -k(window 0 を index を保ったまま作り直す)の順序に変更し、新 window は window-size manual を継承しないためジオメトリ設定(#1163)はその後に当てる。respawn-pane -k は pane が既存バッファを再利用するため効かない(実測)。あわせて値を 50000 → TMUX_HISTORY_LIMIT=20000 に見直した — capturePane の execFile maxBuffer が 10MB で、50000 行の SGR 込みテキスト(実測 274B/行 ≒ 13MB)はこれを超えて throw するため、50000 行の深部はそもそもアプリから読めなかった(アプリが読む最深は既定 10000 行、他の呼び出しは 1000 行以下)。根拠は src/config/tmux-pane-config.ts の定数 doc コメントに実測値つきで残してある。既存の稼働セッションには適用されない(pane を作り直さない限り 2000 のまま): 稼働中 pane の再生成は実行中のエージェントプロセスを kill するため自動適用は行わず、次回のセッション作成時から適用する。今すぐ深い履歴が必要な場合はセッションを停止して作り直すこと
  • worktree の ID 変更・削除が FK 宣言の無い tasks / verification_runs を取りこぼし孤児行を残していた問題を修正し、既存の孤児を migration v52 で掃除(#1621)
  • Codex が承認プロンプトで止まっている間に wait が完了扱いになる経路を塞いだ (#1628): codex は承認要求(Would you like to run the following command?)を /model メニューと同じ "Press enter to confirm" フッタで描くため、#622 の selection-list 分岐が先に掴んで hasActivePrompt:false を返しており、wait --on-prompt agent は exit 10 を上げられなかった(実 codex 0.146.0 の 120 フレーム実測。detectPrompt 自体は常に検出できていたので Auto-Yes だけが応答できていた)。あわせて wait の isRunning=false が「終了した」と「一度も動いていない」を同一視していた問題を直し(未観測なら Completed ではなく exit 21)、arrow-key メニュー(codex pager・agy 権限メニュー等)を exit 10 として上げるようにした。work-evidence には commits=0 uncommitted=1 を不合格にする opt-in options.requireCommit を追加(既定 false)
  • send --instance <id> が roster の CLI_TOOL を引かず worktree 既定のツールでセッションを起動していた問題を修正(--instance codex で mcbd-claude-…-codex が立っていた)。respond / capture / auto-yes の同型経路も併せて解決するようにした(#1629)