feat(PLAN59): 再起動なしで VS Code だけ開き直す devbase open を足し、devbase list の起動中メニュー先頭へ置く (#197) - #199
Conversation
…中メニュー先頭へ置く (#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>
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
改修計画 — devbasex/devbase #199
ラウンド 1(実装 codex / レビュー agy / kiro)R1-001 —
|
| 兆候・経路 | 手法・階層 | 重要度 | 提案元 | 状態 | コミット |
|---|---|---|---|---|---|
| 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
left a comment
There was a problem hiding this comment.
🤖 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
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | agy | APPROVE
要求仕様 (PLAN59_editor-open.md) の受け入れ条件 1〜20 および設計 (PLAN59_editor-open-design.md) に沿って実装されており、修正を要する指摘事項はありません。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | kiro | APPROVE
PLAN59 の受け入れ条件 1〜20 と実装・テストの対応を確認した。起動中経路が up のパイプライン部品を呼ばないこと、状態取得失敗 (None) と停止中 ([]) の区別、context の 2 経路への伝播、cli.py / bin/devbase / 補完の open 同期はいずれも実装とテストで固定されている。修正必須の問題は無い。ドキュメント文言の軽微な不一致を 1 件インラインで指摘した (振る舞いには影響しない)。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | codex | REQUEST_CHANGES
仕様適合: 受け入れ条件 11 の禁止オプション拒否を、値を伴う入力でも保証してください。
- 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
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 3 | codex | REQUEST_CHANGES
仕様適合: container open の名前引数の扱いを、シェル入口・parser・設計の間で一致させてください。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 3 | agy | APPROVE
PLAN59の受け入れ条件1〜20、CLI・bin/devbase・補完の同期、起動中・停止中・状態取得失敗時の各分岐およびテスト網羅を確認しました。修正を要する問題はありません。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
issues/PLAN59_editor-open*.md を docs/specifications/editor-open.md の as-is 仕様へ書き直し、計画・設計の作業記録を削除する。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
リリース後テスト対象の版: main @ 3d4072f(2026-09-18 10:00 UTC にマージ。タグは切らず
合否: 不合格 1 件(プロファイルの食い違い、#201)、保留 1 件(TUI の目視)。ほかは合格 |
Summary
閉じた VS Code の窓を、コンテナを再起動せずに開き直す
devbase openを足す。設計は #198 でマージ済み。devbase open [name]/devbase project open [name]/devbase container open(--open-index N/--context NAME)devbase up --openと同じく起動してから開く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=0uvx ruff check --select=E9,F63,F7,F82 lib→ exit=0 /bash -n bin/devbase・zsh -n etc/_devbase→ exit=0 / CI 5 件 passopen→ 非 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は変わらないdevbase openで窓が開くこと(リリース後の実機確認で行う)devbase listの起動中の行で先頭が「エディタを開く (open)」であること(リリース後の実機確認で行う)🤖 Generated with Claude Code