Skip to content

feat(PLAN71): prefix S の一覧とメニューをコマンド tmux-menu からも開く (#270) - #274

Merged
takemi-ohama merged 5 commits into
mainfrom
feature/plan71-tmux-menu
Sep 25, 2026
Merged

takemi-ohama merged 5 commits into
mainfrom
feature/plan71-tmux-menu

Conversation

@takemi-ohama

@takemi-ohama takemi-ohama commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

Closes #270

Summary

  • tmux-menu を tmux-session menu の短縮名として足した。menu はセッションも -c も受け取らないときだけ、prefix S と同じセッションの一覧(choose-tree -Zs -O name)を開く(設計の決定 1)
    • tmux の中: TMUX_PANE の pane に一覧を出す(-t "$TMUX_PANE")
    • tmux の外: exec tmux attach-session \; choose-tree …。attach 先は tmux の既定(決定 3)
    • サーバが無い: サーバもセッションも作らず、終了コード 1
  • prefix S を bind-key S run-shell "TMUX_PANE=#{pane_id} tmux-menu" に変えた。一覧の template は tmux-session にだけ置く(決定 2・決定 4)。今の形の tmux-session menu -c 端末 <セッション> は変えていないので、ホストの ~/.tmux.conf に前の行を写した人の prefix S もそのまま動く
  • Dockerfile の symlink に tmux-menu を足した。利用者向け文書(docs/user/environment-variables.md「セッションを名指しで扱う」。ホストの symlink は 5 つ)と CHANGELOG も直した
  • tmux-first / tmux-clean は変えていない
  • 確定仕様 docs/specifications/tmux-named-session.md を今の形(短縮名 4 つ、prefix S は run-shell で tmux-menu を呼ぶ、一覧を開く 3 つの経路、回帰テストの節)に合わせた(実装レビューの指摘)

要求と受け入れ条件(条件 1〜14)と設計(#271)は、確定仕様化で docs/specifications/tmux-named-session.md へ移した(決定の理由・ホストの以前の割り当てとの互換・テストで Enter を端末から送る理由を足した)。issues/PLAN71_tmux-menu.md・issues/PLAN71_tmux-menu-design.md・issues/PLAN71_tmux-menu-measure.py は消した(e847c9f)。

利用者向けの変化

  • コマンド tmux-menu で、prefix S と同じセッションの一覧とメニューを開けるようになった。tmux の中では今の pane に一覧を出し、tmux の外では attach してから一覧を出す(attach 先は tmux の既定。サーバが無ければ何も作らず終了コード 1)
  • prefix S は tmux-menu を呼ぶ形になった。開く一覧とメニューは今までと同じで、tmux-session menu -c 端末 <セッション> の形も変わらない
  • ホストの tmux で使うときは、symlink の 5 つ目(tmux-menu)と ~/.tmux.conf の新しい行を足す(docs/user/environment-variables.md「セッションを名指しで扱う」)
  • 反映には devbase build base --no-cache と派生イメージの建て直し、コンテナの作り直し(devbase down → devbase up)が要る

Test plan

ホスト(macOS、tmux 3.7b)で実行した。tmux のテストは専用のソケットで起動し、利用者の tmux サーバに触れない。

最終の版 9371822 での再実行(2026-09-26)

  • env -u TMUX -u TMUX_PANE uv run --locked pytest tests/ -q → 3233 passed / exit=0(条件 13。実装レビューで足した test_list_inside_without_tmux_pane_opens_tree を含む)
  • env -u TMUX -u TMUX_PANE uv run --locked pytest -q tests/containers/test_tmux_session.py tests/containers/test_tmux_conf.py → 118 passed / exit=0(条件 1〜11)
  • uvx --from shellcheck-py shellcheck containers/base/tmux-first containers/base/tmux-clean containers/base/tmux-session → exit=0、shellcheck --severity=error install.sh → exit=0(条件 13)
  • uvx ruff check --select=E9,F63,F7,F82 lib → exit=0、python3 -m compileall -q lib bin → exit=0
  • git diff --stat origin/main -- containers/base/tmux-first containers/base/tmux-clean が空(条件 12)
  • 継続的統合(run 36159714180、9371822)が success
  • 文書(条件 14): 利用者向け文書「セッションを名指しで扱う」に tmux-menu と symlink の 5 つ目、確定仕様と CHANGELOG に反映。実装レビューで 3 者(claude / codex / kiro)が見て、仕様の指摘 2 件を直した

実装の時点(2390b4f)

  • env -u DEVBASE_ROOT uv run pytest -q(全体)→ 3232 passed(条件 13)
  • uv run --locked pytest -q tests/containers/test_tmux_session.py tests/containers/test_tmux_conf.py → 117 passed(条件 1〜11)。テストを先に足した時点では 22 件が落ちた
  • uvx --from shellcheck-py shellcheck containers/base/tmux-* → exit=0(条件 13)
  • git diff --stat origin/main -- containers/base/tmux-first containers/base/tmux-clean が空(条件 12)
  • uvx ruff check --select=E9,F63,F7,F82 lib(CI と同じ)→ All checks passed。変えたテストファイルに新しい指摘は無い
  • base イメージを建てた。main から --no-cache で建て、この作業ツリーの containers/base で変わった層から先を建て直した(タグ devbase-base:plan71-check)。使い捨てのコンテナ(tmux 3.6)で次の結果を得た(条件 10、条件 1・4・6・11 の実イメージでの確認)
イメージの中の結果
tmux 3.6
/usr/local/bin/tmux-menu
lrwxrwxrwx 1 root root 12 Sep 25 15:55 /usr/local/bin/tmux-menu -> tmux-session
--- tmux-menu -h → exit=0
--- no server(条件 6)
tmux-menu: tmux サーバが起動していません
exit=1
(実行後の tmux ls → サーバ無し)
--- prefix S の割り当て(条件 11)
bind-key -T prefix S run-shell "TMUX_PANE=#{pane_id} tmux-menu"
--- tmux の中: TMUX_PANE=zz-home の pane で tmux-menu(条件 1)→ exit=0
devbase-3:%1:
zz-home:%0:tree-mode
--- tmux の外: a に端末を繋いでから pty で tmux-menu(条件 4)
/dev/pts/2=a
/dev/pts/3=zz-home        ← 端末の繋がっていないセッションへ attach
a:%0:
zz-home:%1:tree-mode      ← attach した画面に一覧
  • tmux の中と外から tmux-menu を打ち、一覧 → メニュー → a / p / k が効くことを見る(条件 2〜5)。リリース後テストで main 5edc75f のイメージ devbase-base:plan71-verify を使い、擬似端末に attach したクライアントへキーを打って 18 項目すべて合格(2026-09-26、PR のコメント「リリース後テスト」)
  • 実際の端末エミュレータでの見た目(メニュー・ポップアップ・確認の問いの描画)。保留。手順は feat: prefix S のセッションの一覧とメニューをコマンド tmux-menu からも開けるようにする #270 のコメントにある

モード: standard / 通した工程: 要求定義 → 設計 → ドキュメントレビュー → 実装計画 → 実装 → 構造改善 → 実装レビュー → 完了判定 → Pull Request

🤖 Generated with Claude Code

- tmux-menu を tmux-session menu の短縮名にし、セッションも -c も受け取らない形で一覧を開く
- tmux の中は TMUX_PANE の pane に、外は attach して一覧を出す。サーバが無ければ終了コード 1
- prefix S は run-shell "TMUX_PANE=#{pane_id} tmux-menu" を呼び、一覧の定義を tmux-session に集める
- Dockerfile に symlink tmux-menu、利用者向け文書と CHANGELOG、回帰テスト

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 1 | codex | APPROVE

修正を要する指摘はありません。

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 1 | kiro | REQUEST_CHANGES

PLAN71 の実装・テスト・利用者文書・CHANGELOG は一貫しており、後方互換 (旧 bind-key S を写した人は tmux-session menu -c 経由で動く) も保たれている。修正提案は 2 点: (1) 確定仕様 docs/specifications/tmux-named-session.md が旧 prefix S 割り当てと短縮名一覧のまま出荷実装と食い違う (PR 本文で先送りと明言しているが、文書内に先送りの断り書きが無い)、(2) tmux 内で TMUX_PANE 空のときの choose-tree フォールバック分岐が未テスト。

差分の外を指す指摘

  • docs/specifications/tmux-named-session.md:45 [minor] [minor / 保守性] 確定仕様の「キーの割り当て」行が旧定義 bind-key S choose-tree … "tmux-session menu …" のままで、本 PR が /etc/tmux.conf を bind-key S run-shell "TMUX_PANE=#{pane_id} tmux-menu" へ変えた実装と食い違う。加えて構成要素表の短縮名行が tmux-menu を欠き、ln -sf 3 つ/サブコマンド 3 操作の記述も 4 と食い違う。PR 本文で「確定仕様化のときに直す」と先送りしているが文書側に断りが無いため、少なくとも当該箇所へ「#270 で prefix S は tmux-menu を呼ぶ形へ変更済み(確定仕様は別途更新)」の注記を入れるか、行を新形へ更新する。
  • tests/containers/test_tmux_session.py:1084 [minor] [minor / テスト] 一覧を開く分岐のうち『TMUX があるが TMUX_PANE が空』で exec tmux choose-tree -Zs -O name(-t なし)へ落ちる中間分岐 (tmux-session:181-183) が未検証。この分岐は直近操作端末に一覧が出る既知の弱点そのものなので、env=inside_env(home) から TMUX_PANE を除いた環境で tmux-menu を実行し、returncode==0 かつ一覧が開くことを確かめるテストを 1 件足すと退行を捕まえられる。

takemi-ohama and others added 2 commits September 26, 2026 01:06
prefix S の割り当てを run-shell "TMUX_PANE=#{pane_id} tmux-menu" に、短縮名と
ln -sf を 4 つに、一覧の定義が tmux-session にあることを書く。呼び出しの形・
終了コード・確かめ方の旧定義も合わせる。

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

🔧 /ndf:fix サマリ | commit 74c93d4

対応件数: critical=0 / major=0 / minor=0(合計 0 件)
決着: 0 件 / 見送り: 0 件 / 却下: 0 件
CI: NONE

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 1 | claude | REQUEST_CHANGES

実装・割り当て・利用者文書は一貫している。確定仕様のテスト節に、本 PR が足した tmux-menu の一覧を開く形の回帰テストが載っていない点のみ修正を求める。

Comment thread docs/specifications/tmux-named-session.md

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 1 | kiro | APPROVE

PLAN71 (#270) の実装・確定仕様・利用者文書・テスト・CHANGELOG は一貫しており、後方互換 (旧 bind-key S choose-tree を写した人も prefix S は動く) も保たれている。修正を要する新たな指摘は無い。

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

🔧 /ndf:fix サマリ | commit 9371822

対応件数: critical=0 / major=0 / minor=0(合計 0 件)
決着: 0 件 / 見送り: 0 件 / 却下: 0 件
CI: NONE

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 1 | claude | APPROVE

修正を要する指摘はありません。

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 1 | codex | APPROVE

修正を要する新たな指摘はありません。

@takemi-ohama

Copy link
Copy Markdown
Contributor Author

🔧 /ndf:fix サマリ | commit (なし)

対応件数: critical=0 / major=0 / minor=0(合計 0 件)
決着: 0 件 / 見送り: 0 件 / 却下: 0 件
CI: NONE

@takemi-ohama

Copy link
Copy Markdown
Contributor Author

実装レビュー(/ndf:cross-review)の経過

駆動が残した上の 3 件の「/ndf:fix サマリ」は、スイープ後の再開で状態が作り直されたため件数がすべて 0 になっています。実際の経過は次のとおりです。

ラウンド 見た版 担当と判定 指摘 対応
1 2390b4f codex APPROVE / kiro REQUEST_CHANGES minor 2 件(確定仕様が旧定義のまま・TMUX_PANE が空の経路のテスト欠け)。codex が 2 件とも支持 8556fe6(仕様)、74c93d4(テスト)
2 74c93d4 claude REQUEST_CHANGES / kiro APPROVE minor 1 件(確定仕様の回帰テストの節に tmux-menu が無い)。kiro が支持 9371822(仕様)。スレッドは返信して resolve
3 9371822 claude APPROVE / codex APPROVE 0 件 収束

未解決の review thread は 0 件。構造改善(/ndf:cross-refactoring)は、assess が本番コードの差分を 0 と判定した(終了コード 3)ため起動していません。

範囲外と判断し、次の issue として残しました(いずれも devbasex/ai-plugins)。

  • #1132 cross-review: スイープ後の再開で state を作り直し、直したスレッドへ返信・resolve しない
  • #1133 cross-review: 支持された指摘が not_run だけで insufficient_evidence になり収束と判定される
  • #1134 cross-refactoring: assess が拡張子の無いシェルスクリプトを本番コードに数えない
  • #476(既存)launch-cli.sh の bash 3.2 の空配列展開。由来を追記

@takemi-ohama
takemi-ohama marked this pull request as ready for review September 25, 2026 16:25
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

確定仕様化の途中で見つけた範囲外の課題(spec-finalize で --design を繰り返すと最後の 1 つしか削除されない)を devbasex/ai-plugins#1136 として起票した。この PR では残った 2 件を手で削除した。

@takemi-ohama
takemi-ohama merged commit 5edc75f into main Sep 25, 2026
7 checks passed
@takemi-ohama
takemi-ohama deleted the feature/plan71-tmux-menu branch September 25, 2026 16:51
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

リリース後テスト

対象の版: main 5edc75f(PR #274 のマージ、2026-09-26 01:50 JST。このリポジトリは main へのマージが配布)
導入経路: main の containers/base から base イメージを建てた(docker buildx build --load。devbase build base と同じ形)。利用者の devbase-base:latest を上書きしないよう、タグは devbase-base:plan71-verify にした。main の containers/base は実装の時点(2390b4f)と差分が 0 行なので、層はキャッシュを使った。確かめたのは本番(main)の版である
確かめ方: 使い捨てのコンテナ(tmux 3.6、利用者 ubuntu)の中で、script(1) で作った擬似端末に本物のクライアントを attach した。キーは tmux send-keys ではなく、その端末へ打った(tmux-menu⏎・矢印・Enter・a/p/k/y・C-b S)。一覧の template の #{q:client_name} は Enter を押した端末で展開されるので、この形でないと条件 2〜5 を確かめたことにならない

課題 受け入れ条件 実行したこと 実行時刻 結果
#270 1. tmux の中の tmux-menu で、その pane に一覧 端末 A(home)のシェルで tmux-menu⏎ → home の pane が tree-mode 2026-09-26 01:55 合格
#270 2. 一覧で Enter → 選んだセッションのメニュー(a/p/k) 矢印で alpha を選んで Enter → メニュー(移る / 中身を見る / 落とす)が出る。C-b S → Enter でも同じメニュー 2026-09-26 01:55 合格
#270 3. メニューの a / p / k が選んだセッションに効く p: ポップアップに session alpha が出て Enter で閉じる。a: A は alpha へ移り、alpha に繋がっていた端末 B は detached で外れ、A は残る。k: beta を落としますか? (y/n) → y で beta だけ落ち、A は alpha のまま 2026-09-26 01:55 合格
#270 4. tmux の外の tmux-menu で attach し、すぐ一覧 端末 C・D を tmux-menu で開く → 端末の繋がっていないセッション(home・gamma)へ attach し、その pane が tree-mode 2026-09-26 01:55 合格
#270 5. 4 の一覧からのメニューの a / p / k C: beta を選び p → session beta。D: alpha を選び a → alpha の端末 B が外れ D だけが残る。E: home を選び k → 問い → y で home が落ちる 2026-09-26 01:55 合格
#270 2〜5 の見た目(実際の端末エミュレータでの描画) — — 保留(理由: 擬似端末では描画を見られない。手順を #270 に残した。利用者が次に base を建て直したときに見る)

コマンド: docker run --rm --user ubuntu --entrypoint bash -v verify.sh:/verify.sh:ro devbase-base:plan71-verify /verify.sh → PASS=18 FAIL=0 / exit=0

出力
=== tmux tmux 3.6 / /usr/local/bin/tmux-menu -> tmux-session
=== 条件 2・3: tmux の中から tmux-menu
clients: /dev/pts/3=alpha /dev/pts/4=home 
PASS: 1: home の pane が tree-mode
PASS: 2: Enter でメニュー (移る/中身を見る/落とす) が出る
PASS: 3(p): 中身を見る が alpha を出す
before a: /dev/pts/3=alpha /dev/pts/4=home 
after  a: /dev/pts/4=alpha 
PASS: 3(a): 押した端末は alpha へ移り、alpha の他の端末は外れる
PASS: 3(a): B の端末は detach されて終わっている
PASS: 3(k): 確認の問いが出る
PASS: 3(k): beta が落ち、alpha・home は残る
PASS: 3(k): 押した端末は alpha に繋がったまま
--- 比較: prefix S から開くメニュー
PASS: 2(比較): prefix S で alpha の pane が tree-mode
PASS: 2(比較): prefix S → Enter で同じメニュー
=== 条件 4・5: tmux の外から tmux-menu
clients: /dev/pts/4=alpha /dev/pts/5=home 
C の attach 先: home
PASS: 4: C は attach し、その画面の pane が tree-mode
PASS: 5: Enter でメニューが出る
PASS: 5(p): 中身を見る が beta を出す
--- 外から 2 回目 (D): a
clients: /dev/pts/4=alpha /dev/pts/5=home /dev/pts/6=gamma 
D の attach 先: gamma
PASS: 4: D の画面が tree-mode
after a: /dev/pts/5=home /dev/pts/6=alpha 
PASS: 5(a): B は外れ、alpha には D だけ
PASS: 5(a): D は alpha にいる
--- 外から 3 回目 (E): k
E の attach 先: gamma / clients: /dev/pts/4=gamma /dev/pts/5=home /dev/pts/6=alpha 
PASS: 5(k): 確認の問いが出る
PASS: 5(k): home が落ちる
sessions: alpha beta gamma  clients: /dev/pts/4=gamma /dev/pts/6=alpha 
=== PASS=18 FAIL=0

合否: 合格(条件 1〜5 を擬似端末で実施し 18 項目すべて合格。実際の端末エミュレータでの見た目の 1 件は保留)
起票したもの: なし
後片付け: 使い捨てのコンテナは --rm で消えた。イメージ devbase-base:plan71-verify は残してある(人手の確認を利用者の latest を触らずに行えるように。要らなければ docker rmi devbase-base:plan71-verify devbase-base:plan71-check)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: prefix S のセッションの一覧とメニューをコマンド tmux-menu からも開けるようにする

1 participant