Skip to content

feat(PLAN59): 再起動なしで VS Code だけ開き直す devbase open を足し、devbase list の起動中メニュー先頭へ置く (#197) - #199

Merged
takemi-ohama merged 7 commits into
mainfrom
feat/issue-197
Sep 18, 2026
Merged

takemi-ohama merged 7 commits into
mainfrom
feat/issue-197

Conversation

@takemi-ohama

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

Copy link
Copy Markdown
Contributor

Summary

閉じた VS Code の窓を、コンテナを再起動せずに開き直す devbase open を足す。設計は #198 でマージ済み。

  • devbase open [name] / devbase project open [name] / devbase container open(--open-index N / --context NAME)
    • dev コンテナが動いていれば、コンテナに触らずに窓を開く
    • 1 つも動いていなければ devbase up --open と同じく起動してから開く
    • 指定した番号が動いていない・状態を取得できないときは、起動せずに終了コード 1
  • devbase list の起動中の操作メニューの先頭に「エディタを開く (open)」を置く(Enter 1 回で決まる項目が再起動から変わる)
  • 起動中の判定は env token が持っていた列挙を utils/docker.running_dev_instances へ移して共有する
  • bin/devbase の name 解決・bash / zsh 補完・CLI リファレンス・CHANGELOG を揃える

確定仕様: docs/specifications/editor-open.md(要求仕様・設計・実装計画をこの PR の最後のコミットで取り込み、issues/PLAN59_* は削除した)

Closes #197

Test plan

head 3af259b に対して実行した(受け入れ条件との対応は 9b5caf6 の issues/PLAN59_editor-open-impl.md「検証結果」。確定仕様の「テスト観点」へ引き継いだ)。

  • uv run pytest -q → 2682 passed, exit=0
  • uvx ruff check --select=E9,F63,F7,F82 lib → exit=0 / bash -n bin/devbase・zsh -n etc/_devbase → exit=0 / CI 5 件 pass
  • 実機(nyle-dx が起動中、非 TTY): open → 非 TTY のため skip で exit=1 / open --open-index 3 → dev-3 は起動していません。起動中: 1 で exit=1 / open --context no-such-ctx → docker ps の失敗で止まり up は走らず exit=1 / open --open 2 → usage エラーで exit=2。前後で nyle-dx-dev-1 の ID と StartedAt は変わらない
  • cross-refactoring: テスト整備 4 件(24207cf)、構造改善は採用 0 件(minor の重複 1 件は fabb77d で解消)
  • cross-review: 3 ラウンドで収束、未解決 0 件(範囲外 1 件を container / ct グループのサブコマンドが wrapper 経由で [name] を受け付けてしまう #200 に起票)
  • TTY の端末から devbase open で窓が開くこと(リリース後の実機確認で行う)
  • devbase list の起動中の行で先頭が「エディタを開く (open)」であること(リリース後の実機確認で行う)

🤖 Generated with Claude Code

…中メニュー先頭へ置く (#197)

- cmd_open: dev が動いていればコンテナに触らず開き、動いていなければ up --open へ委譲する
- 起動中の判定は env token の列挙を utils/docker.running_dev_instances へ移して共有する
- open / project open [name] / container open と、bin/devbase・補完・CLI リファレンスを揃える
- TUI の起動中メニューの先頭を「エディタを開く (open)」にする

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@takemi-ohama
takemi-ohama marked this pull request as draft September 18, 2026 07:48
Add characterization coverage for open index resolution, project open dispatch, menu continuation after open, and Docker output parsing.

Item-Id: R1-001
Round: 1
Impl-Runtime: codex
Impl-Model: default
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

改修計画 — devbasex/devbase #199

/ndf:cross-refactoring が提案し、適用した改善項目の記録である。
理由と手順は提案の時点でしか残らないため、公開の直前に書き出している。

  • 対象範囲: lib/devbase/commands/container.py, lib/devbase/cli.py, lib/devbase/utils/docker.py, lib/devbase/tui/actions_project.py, tests/commands/test_container_open.py, tests/cli/test_open_command.py, tests/utils/test_running_dev_instances.py, tests/cli/tui/test_open_menu.py
  • 着手前のテスト: uv run pytest -q -p no:cacheprovider

ラウンド 1(実装 codex / レビュー agy / kiro)

R1-001 — lib/devbase/commands/container.py#cmd_open

兆候・経路 手法・階層 重要度 提案元 状態 コミット
branch unit — codex / agy / kiro 検証中 1

なぜ: cmd_open は open_index の解決に _explicit_open_index を通す。DEVBASE_OPEN_INDEX が整数の経路 (test_index_from_env_is_used) と明示値の経路 (test_index_beyond..., test_index_below_one...) は固定済みだが、env が非整数のときの except ValueError -> 1 のフォールバックは固定されていない。_resolve_open_index 側 (up の [6/6]) には env 非整数の固定があるが、cmd_open が使う _explicit_open_index には無く、両者は別関数である。

手順: 1. 既存の Harness を使い、起動中を [(1, "proj-dev-1"), (3, "proj-dev-3")] にする。公開入口 cmd_open だけを呼ぶ。
2. DEVBASE_OPEN_INDEX=3 と open_index=1 を同時に与える例、および環境変数が空文字・非数値で引数を省略する例を個別に実行し、現行の終了コードとエディタに渡った index を採取する。現在はいずれも終了コード 0、index=1 となる。
3. 環境変数を未設定にして open_index=3 と open_index=2 をそれぞれ実行する。現行の前者は 0 で index=3 を開き、後者は 1 でエディタ起動も up への委譲も行わない結果を採取する。
4. 採取した戻り値と接続先・起動要求の有無を、入力ごとに分けたテストの期待値として固定する。private 関数や表示全文は検証しない。

R1-002 — lib/devbase/cli.py#_dispatch

兆候・経路 手法・階層 重要度 提案元 状態 コミット
branch integration — agy 検証中 1

なぜ: _dispatch においてトップレベルショートカット open のディスパッチは固定されているが、推奨コマンドである project open(cmd == 'project' かつ args.subcommand == 'open')が cmd_project 経由で cmd_open へディスパッチされる分岐が固定されていない。

手順: 1. _parse('project', 'open', 'carmo', '--open-index', '2') で引数をパースする
2. container._enter_project と container.cmd_open をモックして呼び出し引数を記録する
3. cli._dispatch('project', ns) を実行する
4. cmd_open に project_name='carmo' と open_index=2 が渡されたことを検証する

R1-003 — lib/devbase/tui/actions_project.py#handle_row

兆候・経路 手法・階層 重要度 提案元 状態 コミット
branch unit — codex 検証中 1

なぜ: 既存の3テストは定数表とハンドラを直接確認しており、公開入口 handle_row から open を選び、実行後も同じサブメニューで次の操作を選べる経路は通していない。特に open が非ゼロで終わった場合もメニューが継続する現在の振る舞いが固定されていない。

手順: 1. running 状態のプロジェクト行を用意し、プロファイル照会、メニュー選択、出力確認の入力、dispatch_lifecycle を外部依存としてスタブ化する。private な操作関数は直接呼ばず、handle_row を入口にする。
2. メニュー入力を open → ps → MENU_BACK に固定し、dispatch の代替は受け取った操作と対象名を記録する。open の戻り値が 0 と 1 の場合を別々に実行する。
3. 現状で両方とも同じ対象への open、続く ps の要求まで到達し、最後に handle_row が MENU_BACK を返すことを採取する。
4. その操作結果と戻り値を期待値として固定する。内部ハンドラの呼び出し回数、定数表の構造、表示文字列の完全一致は検証しない。

R1-004 — lib/devbase/utils/docker.py#running_dev_instances

兆候・経路 手法・階層 重要度 提案元 状態 コミット
branch unit — codex 検証中 1

なぜ: 既存テストは dev というサービス名で通常行・別サービス・番号 0 を確認しているが、区切りやコンテナ名が欠ける行と、正規表現の特殊文字を含むサービス名は未固定である。Docker 出力の解析を整理したときの誤検出を戻り値で検出できる。

手順: 1. runner に CompletedProcess を返すスタブを渡し、タブなしの行、空のコンテナ名を持つ行、通常の有効行を混ぜて running_dev_instances を実行する。
2. 別の例では dev_service_name="dev.app" とし、ラベル dev.app-2 の有効行、devXapp-1 の紛らわしい行、dev.app-01 の行を与える。
3. 実行して現状の戻り値を採取する。前者は有効行だけ、後者は dev.app-2 の組だけが残ることを確認して期待値にする。
4. 入力例を分けて戻り値の番号とコンテナ名を比較する。内部の正規表現や解析関数そのものには依存しない。

見送った項目

(なし)

cross-refactoring の提案ラウンドで kiro / codex が挙げた重複 (minor のため閾値で見送り) を解消する。

Co-Authored-By: Claude Opus 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 | kiro | APPROVE

PLAN59 の devbase open 実装をレビューした。CLI 登録・lifecycle 分岐・TUI メニュー・bin/devbase wrapper・bash/zsh 補完・docs/CHANGELOG がすべて同期しており、open の追加箇所に漏れはない。起動中の経路はコンテナに触れず _open_editor_at のみを呼び、running_dev_instances の None(状態取得失敗)と [](停止中)を取り違えず、失敗時は up へ委譲しない設計になっている(決定 2・8 と一致)。_open_index_from_env の共有で up と open の env 読解が揃い、opener.open_editor の返す launch/print_command/skip に対する終了コードの写像も正しい。テスト 92 件が通過し、境界(index<1・飛び番号・先頭ゼロ・正規表現特殊文字・状態取得失敗)を網羅している。修正を要する指摘なし。

@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 | agy | APPROVE

要求仕様 (PLAN59_editor-open.md) の受け入れ条件 1〜20 および設計 (PLAN59_editor-open-design.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 2 | kiro | APPROVE

PLAN59 の受け入れ条件 1〜20 と実装・テストの対応を確認した。起動中経路が up のパイプライン部品を呼ばないこと、状態取得失敗 (None) と停止中 ([]) の区別、context の 2 経路への伝播、cli.py / bin/devbase / 補完の open 同期はいずれも実装とテストで固定されている。修正必須の問題は無い。ドキュメント文言の軽微な不一致を 1 件インラインで指摘した (振る舞いには影響しない)。

Comment thread lib/devbase/utils/docker.py Outdated

@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 2 | codex | REQUEST_CHANGES

仕様適合: 受け入れ条件 11 の禁止オプション拒否を、値を伴う入力でも保証してください。

Comment thread lib/devbase/cli.py Outdated
takemi-ohama and others added 2 commits September 18, 2026 17:36
- open サブパーサーを allow_abbrev=False で作り、--open 2 / --open=2 が
  --open-index に吸われないようにする (受け入れ条件 11)
- running_dev_instances の docstring をラベルと正規表現の役割分担に合わせて直す

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 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 3 | codex | REQUEST_CHANGES

仕様適合: container open の名前引数の扱いを、シェル入口・parser・設計の間で一致させてください。

Comment thread bin/devbase

@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 3 | agy | APPROVE

PLAN59の受け入れ条件1〜20、CLI・bin/devbase・補完の同期、起動中・停止中・状態取得失敗時の各分岐およびテスト網羅を確認しました。修正を要する問題はありません。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@takemi-ohama
takemi-ohama marked this pull request as ready for review September 18, 2026 08:51
issues/PLAN59_editor-open*.md を docs/specifications/editor-open.md の as-is 仕様へ書き直し、計画・設計の作業記録を削除する。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@takemi-ohama
takemi-ohama merged commit 3d4072f into main Sep 18, 2026
5 checks passed
@takemi-ohama
takemi-ohama deleted the feat/issue-197 branch September 18, 2026 10:02
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

リリース後テスト

対象の版: main @ 3d4072f(2026-09-18 10:00 UTC にマージ。タグは切らず [Unreleased] に溜める)
導入経路: 利用者と同じく PATH 上の devbase(~/devbase/bin/devbase、主ディレクトリを git pull --ff-only で 3d4072f へ更新)

受け入れ条件 実行したこと 実行時刻 結果
1(起動中は窓を開きコンテナに触らない) 非 TTY: devbase open / devbase o(nyle-dx) 2026-09-18 19:02 起動中と判定し非 TTY のため skip、exit=1。nyle-dx-dev-1 の ID と StartedAt は不変
1(TTY で窓が開く) 利用者が端末で devbase open 2026-09-18 窓は開いた。ただし up で開いたときと違うプロファイルになる場合がある → #201 に起票
5 devbase open --open-index 3 2026-09-18 19:02 dev-3 は起動していません。起動中: 1、exit=1
9 devbase project open nyle-dx --open-index 2 2026-09-18 19:02 名前を解決して検査、dev-2 は起動していません、exit=1
11 devbase open --open 2 2026-09-18 19:02 usage エラー、exit=2
17 bash 補完 devbase o<TAB> 2026-09-18 19:02 open
12〜14(TUI) — — 保留(devbase list の目視は利用者の確認待ち。次に devbase list を使うときに確かめる)

合否: 不合格 1 件(プロファイルの食い違い、#201)、保留 1 件(TUI の目視)。ほかは合格
起票したもの: #201(プロファイルの食い違い)、#200(container / ct の名前解決。レビュー中に起票)

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: 再起動なしで VS Code だけ開き直すコマンドを新設し、devbase list の起動中メニュー先頭へ置く

1 participant