feat: PLAN06-3 project list 一覧表示 + --interactive 選択起動#36
Conversation
`devbase project list` / トップレベルシノニム `devbase list` を新設し、
$DEVBASE_ROOT/projects/ 配下を NAME / PLUGIN / STATUS で一覧表示する。
- lib/devbase/commands/project.py (新規):
- _resolve_plugin_name: symlink 先から plugin 名を解決。PLAN04 の同名衝突
suffix (carmo.takemi) はリンク名のみに付きリンク先 dir は素の <proj> の
ままなので、リンク先を辿ることで suffix 有無に関わらず正しく解決する。
- list_projects: projects/ 配下 (symlink/実dir/broken symlink) を列挙。
status は status._container_status_for を共有 (取得不能は unknown)。
- cmd_project_list: 整列テーブル表示 / --interactive で番号入力選択 →
project up 起動 (新規依存を足さず stdlib input、非TTY は EOFError graceful)。
- lib/devbase/commands/status.py:
- per-entry の _container_status_for を抽出し project list と共有
(cmd_status の挙動は不変)。
- lib/devbase/cli.py:
- project list サブコマンド (--interactive/-i) + トップレベル list シノニム
- SUBCMD_MAP / _expand_argv / dispatch に list を同期 (DEVBASE_ROOT 必須)
- bin/devbase:
- resolve_command 候補 + dispatch case に list を追加 (name 解決対象外)
- tests: test_project_list.py 新規 (25件) + wrapper dispatch に list 経路 4件
pytest: 395 passed (baseline 366 + 29)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
f90c991 to
918249e
Compare
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | gemini | REQUEST_CHANGES
project list (および list シノニム) の実装、および status モジュールのリファクタリングを確認しました。概ね良好ですが、プロジェクト数が多い環境でのパフォーマンスに懸念があります。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | codex | REQUEST_CHANGES
トップレベル prefix 解決の後方互換を戻してください。詳細は inline の 1 件です。
- [major/互換性] `list` 追加で ambiguous になった `devbase l` を `login` に維持 (bin/devbase resolve_command + cli.py TOP_PREFIX_PREFERENCES)。`li` は list のまま。 - [major/性能] list_projects の `docker compose ps` を ThreadPoolExecutor で並列化 (cwd= で完結し global chdir せずスレッド安全)。 - [minor/堅牢性] _resolve_plugin_name が `/projects/proj` 等で `/`・`..` を plugin 名に返さず None に。 - [minor/UX] _interactive_select_and_up を誤入力 (数値以外/範囲外) で再入力ループに。 - 回帰テスト 6 件追加。pytest 402 passed。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
🤖 cross-review fix | round 1 対応完了レビュー指摘 4 件すべてに対応しました (deferred / rejected なし)。
サマリ
@takemi-ohama 再レビューをお願いします。 |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | codex | APPROVE
修正必須の指摘はありません。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | gemini | REQUEST_CHANGES
(Test without comments to verify connectivity)
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | gemini | REQUEST_CHANGES
PLAN06 Task 3 の実装(プロジェクト一覧・対話型起動)お疲れ様です。非常に丁寧にテストされており、堅牢な作りになっています。
一点、設計上の懸念として、env ファイルのパース処理において Python 側のフォールバック実装(lib/devbase/commands/container.py の _load_project_env)と Shell Wrapper 側の挙動に乖離がある点が気になりました。Shell 側は source するためコメントや変数展開を解釈しますが、Python 側は単純な文字列分割のため、これらが値に含まれてしまう、あるいは意図しない挙動になります。
本 PR で導入された --interactive モードは Python 経由で起動するため、この乖離の影響を受けます。将来的にパース仕様を統一するか、少なくとも制約を明確にドキュメント化することを推奨します。
… 同期テスト - _interactive_select_and_up: Ctrl+C (KeyboardInterrupt) を捕捉し traceback を出さず中止 (rc=0) として扱う (minor / 堅牢性) - TOP_PREFIX_PREFERENCES の bin/devbase と cli.py の乖離防止のため、 両者の preference 対応表が一致することを検証する同期テストを追加 (major / 正確性) - 回帰テスト 2 件追加 (keyboard_interrupt_aborts / synced_with_cli) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
🤖 cross-review fix | round 2 対応完了今 round の未対応 inline thread 2 件に対応しました。
サマリ
deferred
@takemi-ohama 再レビューをお願いします。 |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 3 | gemini | APPROVE
PLAN06 Task 3 の実装を詳細に確認しました。project list の一覧表示および --interactive 起動のロジックは堅牢であり、docker compose ps の並列実行による高速化も適切に行われています。
特に bin/devbase (bash) と cli.py (Python) の間での prefix 解決 (特に l -> login の後方互換性) の同期がテストによって保証されている点は、メンテナンス性の観点から非常に高く評価できます。
修正が必要な重大な問題は見当たりませんでした。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 3 | codex | APPROVE
追加の修正指摘はありません。
…の仕様乖離を明文化 gemini round2 review-body の将来課題推奨 (Python パーサと shell source の env 解釈が乖離し得る) に対し、仕様統一はリスクが大きいため制約のドキュメント化で 対応する。 - _load_project_env docstring に shell ``source`` との具体的な乖離ケース (変数展開 / コマンド置換 / 行中クォート / インラインコメント) を note 追記。 いずれも wrapper を経ない直接起動のフォールバック時のみ影響する旨を明記。 - 乖離挙動を pin する回帰テスト test_load_project_env_diverges_from_shell_source を追加。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
deferred nit 対応:
|
deferred nit 対応報告 —
|
* chore: release/PLAN06 ブランチ初期化 (Draft release PR 用) plan: issues/PLAN06_project-subcommand.md Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat: PLAN06-1 project サブコマンド group + ハンドラ共有 + container 非推奨委譲 (#34) * chore: feature/PLAN06-project-group Draft PR 作成 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat: PLAN06-1 project サブコマンド group + 共有ハンドラ + container 非推奨委譲 - cli.py: _add_project_parser を追加し up/down/ps/login/logs/scale/build に 省略可能な [name] positional を付与 - cli.py: SUBCMD_MAP / _expand_argv / _dispatch に project を追加(prefix 解決対応) - cli.py: ショートカット (up 等) は非推奨の container ではなく共有 cmd_project へ委譲 - container.py: cmd_container 本体を _dispatch_lifecycle に抽出し cmd_project (推奨) / cmd_container (非推奨 warning + 委譲) で共有 - name は up/scale の project_name へ畳み込み(ディレクトリ解決 / cd は PR2 で実装) - tests/cli/test_project_dispatch.py: parser / scale positional 非曖昧性 / prefix 解決 / dispatch ルーティング / 非推奨 warning を検証 runtime 挙動は従来と同等(リネーム + 委譲のみ、cd なし)。wrapper (bin/devbase) の project ルーティング + name 解決は PR2 (Task 2) に分離。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(cli): project login/build の引数曖昧さ解消 + name 未対応の明示警告 PR #34 round1 レビュー対応 (codex / gemini)。 - project login / build から `[name]` positional を削除し、単一 positional を index / image として扱う (旧 container login <index> / build <image> と一致)。 `project login 2` が name='2' で index=1 にログインしてしまう曖昧さ、 `project build web` が name='web', image=None で image 指定が無視される問題を解消。 - 共有ディスパッチャ _dispatch_lifecycle で、PR1 未対応の name 指定時に 「カレントディレクトリの compose に作用する」旨を warning 出力。 name を黙って無視して意図しない compose に作用するのを防ぐ (up/scale は既に name を受け取る経路のため対象外)。 - name 解決自体は設計どおり PR2 スコープ (docs/plans/PLAN06_project_name.md)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(cli): PLAN06 round2 レビュー対応 (wrapper project 到達不能 + up/scale 警告ほか) - bin/devbase: resolve_command 候補と dispatch case に `project` を追加。 これまで `devbase project ...` が `*)` 節で unknown command になっていた問題を解消。 - _dispatch_lifecycle: name 指定時の未実装警告を up/scale でも出すよう変更。 PR1 では全サブコマンドが CWD の compose に作用し name によるディレクトリ解決を しないため、up/scale だけ無警告だと「指定 project に作用した」と誤解を与えるため。 - SHORTCUTS: 死んだ group 要素 (`('container', sub)`) を除去し subcommand 文字列に簡略化。 - _add_project_parser: login/build が name を取らない設計意図と PR2 での --name 方針を docstring に明記。 - tests: wrapper の project ルーティング (test_wrapper_dispatch.py) と up/scale name 警告のテストを追加。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * test(cli): _dispatch_lifecycle の up/scale name 警告テストを追加 round2 のレビュー対応 (container.py:100) で up/scale も name 指定時に未実装 警告を出すようにしたため、その回帰防止テストを追加する。前 commit の編集が 既存テストの記法不一致で取り込めていなかったため本 commit で補完する。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(cli): top-level build ショートカットを wrapper の実経路 (shell) に揃える bin/devbase は top-level `build` を shell の cmd_build (devbase-base 依存検出 + 2 段ビルド + --no-cache 対応) に委譲しているが、Python 側は `build` を SHORTCUTS / _add_shortcuts / help epilog で `project build` ショートカットとして広告していた。 Python の project build は単純な compose build であり、wrapper 経由の `devbase build` は実際には shell の cmd_build を通る (共有ハンドラ経路にならない) ため、広告と実経路が 乖離していた (codex major)。 Python の project build へ委譲する案 (codex 案1) は shell の base-image ビルド オーケストレーションを失う回帰になるため採らず、codex 案2 を採用: Python 側の SHORTCUTS / _add_shortcuts / help epilog / _expand_argv から top-level `build` を 除外し、実経路 (shell cmd_build) と広告を一致させた。project build / container build サブコマンド自体は維持。整合性回帰テスト 5 件を追加。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(cli): PLAN06 deferred 3 件対応 (parser 共通化 / shortcut name 受理 / 登録順序整理) ユーザ指示により cross-review で deferred としていた 3 件を本 PR で対応する。 1. [minor] _add_container_parser / _add_project_parser の重複 project / container で完全一致する login / build サブコマンド定義を _add_login_subparser / _add_build_subparser に括り出し共有化。分岐する up/down/ps/logs/scale の [name] 構成は呼び出し側に残し可読性を維持。 2. [minor] トップレベルショートタットの [name] 受理と伝播 up/down/ps/scale を project サブコマンドと同様に省略可能な [name] positional を受理するよう _add_shortcuts を更新。ショートカット経由でも name が _dispatch → cmd_project → _dispatch_lifecycle まで伝播する経路を通した (name の実解決は PR2、PR1 では未対応 warning を出す)。 3. [nit] commands リストへの project/container 登録順序 _expand_argv の commands リストの並び (_create_parser 登録順と一致、 group 直後に alias を隣接配置、project=推奨 を container=非推奨 より前) と prefix 解決が順序非依存である旨をコメントで明示。 回帰テスト: shortcut の [name] 受理・伝播、login/build の project/container 一致を test_project_dispatch.py に追加。pytest 全 suite 348 passed。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat: PLAN06-2 wrapper cd によるプロジェクト名解決 + トップレベルシノニム (#35) * feat: PLAN06-2 wrapper cd によるプロジェクト名解決 + トップレベルシノニム 任意の CWD から `devbase project up <name>` / `devbase up <name>` でプロジェクトを 指定操作できるよう、プロジェクト名解決を実装する (PLAN06 Task 2 / 方針 A: wrapper cd)。 bin/devbase (核心): - maybe_cd_project を追加。project/container <sub> <name> 及びトップレベルシノニム <sub> <name> の <name> が $DEVBASE_ROOT/projects/<name> に実在する場合のみ cd し、 COMPOSE_PROJECT_NAME / ./env を cd 後に再設定、argv から name を strip して下流へ。 - 実在性ベースの判定により login <index> / build <image> / scale <N> の既存 positional と曖昧にならない (実在プロジェクト名のときだけ name 扱い)。 - build は shell 実装 (cmd_build) のため、この wrapper cd だけが build の name 解決手段になる (方針 A の核心)。dispatch を name strip 後の _DEVBASE_ARGS 経由に変更。 lib/devbase/commands/container.py (Python 防御フォールバック): - PR1 の「name 解決は未実装」warning を撤去し、_resolve_project_name で projects/<name> 解決 → os.chdir (wrapper が cd 済みなら冪等 no-op) + COMPOSE_PROJECT_NAME 上書き。chdir は _dispatch_lifecycle で一括実施 (down/login/logs は project_name 引数を持たないため per-handler では救えない)。 - 存在しない name はエラー + 候補一覧を提示。 tests: - 新規 test_project_name_resolution.py: wrapper cd / argv strip / 曖昧性回避 / Python 解決 / 候補提示を検証。 - PR1 の未実装 warning 系テストを新挙動 (解決 → handler / 解決失敗 → abort) へ更新。 - build dispatch の文字列アサートを _DEVBASE_ARGS 形式へ追従。 全 359 テスト pass。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(wrapper): project build/login の name 解決を抑止し positional 衝突を回避 `project`/`container` グループの wrapper name 解決を parser が name positional を 持つサブコマンド (up/down/ps/logs/scale) に限定する。従来は全サブコマンドで第3 引数を無条件に project 名解決していたため、`project build web` の image=web や `project login web` の index が実在プロジェクト名と一致した瞬間に strip されて 別操作へ化ける衝突があった (codex round1 major 指摘)。 トップレベルシノニム (build/login 含む) は Python parser を経ず shell cmd_build / wrapper cd だけが name 指定手段であるため、従来どおり「実在 project なら cd」の 存在性ベース判定を維持する。 project build/login グループの衝突回避を固定する回帰テスト 2 件を追加。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(pr35): deferred minor 2件 — env source 方針の注記 + 候補一覧 truncate - bin/devbase: maybe_cd_project の source ./env に設計判断コメントを追記。 set -a の export を後続へ引き継ぐため subshell 化はできず、env は信頼境界内 かつ既に L24 でも source されるため新規リスク増は無いことを明記。 - container.py: _report_unknown_project の候補一覧を先頭 20 件 + 「... 他 M 件」 に truncate (多数プロジェクト環境での 1 行肥大を回避)。 - tests: truncate / 上限内非省略 の回帰テストを追加。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(pr35): gemini round2 minor 2件 — Python フォールバックの env source 整合 + list 同期注記 - container.py: _resolve_project_name に _load_project_env を追加し、wrapper の `source ./env` と同等に project env を os.environ へ反映。wrapper を経ない 直接起動 (`python -m devbase.cli project up <name>`) でも CONTAINER_SCALE 等の project 固有変数が欠落しないようにする。name 指定は env 由来 COMPOSE_PROJECT_NAME より優先 (env 反映後に上書き)。単純な KEY=VALUE のみ解釈し変数展開/コマンド置換は 非サポート (安全側)。 - bin/devbase / cli.py: _PROJECT_NAME_SUBCOMMANDS / _NAME_RESOLVABLE_SHORTCUTS と cli.py の parser 定義 (_add_project_parser / SHORTCUTS) の同期が必要な旨を両側に注記。 - tests: env 反映 / name 優先 / env 不在時の堅牢性 の回帰テスト 3件追加。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat: PLAN06-3 project list 一覧表示 + --interactive 選択起動 (#36) * feat: PLAN06-3 project list 一覧表示 + --interactive 選択起動 `devbase project list` / トップレベルシノニム `devbase list` を新設し、 $DEVBASE_ROOT/projects/ 配下を NAME / PLUGIN / STATUS で一覧表示する。 - lib/devbase/commands/project.py (新規): - _resolve_plugin_name: symlink 先から plugin 名を解決。PLAN04 の同名衝突 suffix (carmo.takemi) はリンク名のみに付きリンク先 dir は素の <proj> の ままなので、リンク先を辿ることで suffix 有無に関わらず正しく解決する。 - list_projects: projects/ 配下 (symlink/実dir/broken symlink) を列挙。 status は status._container_status_for を共有 (取得不能は unknown)。 - cmd_project_list: 整列テーブル表示 / --interactive で番号入力選択 → project up 起動 (新規依存を足さず stdlib input、非TTY は EOFError graceful)。 - lib/devbase/commands/status.py: - per-entry の _container_status_for を抽出し project list と共有 (cmd_status の挙動は不変)。 - lib/devbase/cli.py: - project list サブコマンド (--interactive/-i) + トップレベル list シノニム - SUBCMD_MAP / _expand_argv / dispatch に list を同期 (DEVBASE_ROOT 必須) - bin/devbase: - resolve_command 候補 + dispatch case に list を追加 (name 解決対象外) - tests: test_project_list.py 新規 (25件) + wrapper dispatch に list 経路 4件 pytest: 395 passed (baseline 366 + 29) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(project): PR#36 レビュー対応 — l→login 互換 / status 並列化 / 堅牢性 / 再入力 - [major/互換性] `list` 追加で ambiguous になった `devbase l` を `login` に維持 (bin/devbase resolve_command + cli.py TOP_PREFIX_PREFERENCES)。`li` は list のまま。 - [major/性能] list_projects の `docker compose ps` を ThreadPoolExecutor で並列化 (cwd= で完結し global chdir せずスレッド安全)。 - [minor/堅牢性] _resolve_plugin_name が `/projects/proj` 等で `/`・`..` を plugin 名に返さず None に。 - [minor/UX] _interactive_select_and_up を誤入力 (数値以外/範囲外) で再入力ループに。 - 回帰テスト 6 件追加。pytest 402 passed。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(project): PR#36 round2 — KeyboardInterrupt 中止 / prefix preference 同期テスト - _interactive_select_and_up: Ctrl+C (KeyboardInterrupt) を捕捉し traceback を出さず中止 (rc=0) として扱う (minor / 堅牢性) - TOP_PREFIX_PREFERENCES の bin/devbase と cli.py の乖離防止のため、 両者の preference 対応表が一致することを検証する同期テストを追加 (major / 正確性) - 回帰テスト 2 件追加 (keyboard_interrupt_aborts / synced_with_cli) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs(project): PR#36 deferred nit — _load_project_env と shell source の仕様乖離を明文化 gemini round2 review-body の将来課題推奨 (Python パーサと shell source の env 解釈が乖離し得る) に対し、仕様統一はリスクが大きいため制約のドキュメント化で 対応する。 - _load_project_env docstring に shell ``source`` との具体的な乖離ケース (変数展開 / コマンド置換 / 行中クォート / インラインコメント) を note 追記。 いずれも wrapper を経ない直接起動のフォールバック時のみ影響する旨を明記。 - 乖離挙動を pin する回帰テスト test_load_project_env_diverges_from_shell_source を追加。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat: PLAN06-4 補完 + docs + CHANGELOG + container 非推奨告知 (#37) * feat: PLAN06-4 補完 + docs + CHANGELOG + container 非推奨告知 PLAN06 で導入した project サブコマンド体系をシェル補完・ドキュメント・ CHANGELOG に反映し、container グループの非推奨を告知する。 - etc/devbase-completion.bash / etc/_devbase: - project グループ補完 (up/down/ps/login/logs/scale/build/list) を追加 - プロジェクト名補完 (_devbase_project_names: $DEVBASE_ROOT/projects/ 配下を 列挙) を project up/down/ps/logs/scale とトップレベルシノニム up/down/ps/scale に追加 - project list / top-level list の --interactive / -i 補完 - container は補完候補に残しつつ非推奨マーク (zsh description) - docs/user/cli-reference.md: - コマンド体系図・エイリアス・ショートカットを project 体系に更新 - 「project グループ」節を新設 (name 解決 / project list / --interactive / login・build が name を取らない理由 / 親シェル CWD 非汚染) - 「container グループ (非推奨)」節に置換 - docs/user/container-operations.md: - 冒頭に project 体系への移行注記、scale/logs 例を project 形へ、 project list の横断一覧 vs project ps の単体表示の役割整理を追記 - README.md / docs/user/getting-started.md: 残存する container 直接形を project へ - CHANGELOG.md: Unreleased に PLAN06 (Added: project 群 / Changed: container 非推奨) - tests/cli/test_completion.py 新規 (bash 補完を source した動作検証 8件 + zsh 静的内容/構文チェック。zsh 未インストール環境は skip) pytest: 374 passed, 1 skipped (zsh) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(completion): bash top-level ps の -a フラグ補完を project ps と対称化 軽量レビュー nit 対応。bash 補完の top-level シノニム `devbase ps` は プロジェクト名のみ補完し -a/--all フラグを補完していなかった (zsh / project ps は分岐済み)。$cur が `-*` のときフラグ、それ以外は name を補完するよう project ps (cword 3) と同じ挙動に揃え、回帰テスト2件を追加した。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(docs,completion): PR#37 レビュー指摘3件対応 - README CLI体系セクションを project 主グループ + container 非推奨注記へ更新 (cli-reference.md と整合) - bash 補完に cword>=4 分岐を追加し project ps/logs の name 後フラグ補完に対応 - _devbase_project_names を find -L ... -type d に変更し dir/dir-symlink のみ列挙 (壊れた/ファイル symlink を除外、zsh と整合) - 回帰テスト3件追加 (壊れた symlink 除外 / project ps/logs フラグ補完) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(completion,docs): PR#37 Round3 指摘2件対応 - completion: _devbase_project_names の `xargs -r`(GNU 拡張) を排除し、 find -L ... -type d の各行を POSIX パラメータ展開 ${p##*/} で basename 化。 BSD/macOS でも候補が空にならず移植性を確保 (symlink dir 限定は維持)。 - docs: cli-reference.md のトップレベルシノニム名前解決の記述を正確化。 bin/devbase の _NAME_RESOLVABLE_SHORTCUTS に login が含まれ、login <name> も build <name> 同様に存在性判定で名前解決されるため両方を明記。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs,completion: PR#37 Round4 minor 指摘4件対応 (最終スイープ) - etc/devbase-completion.bash: `list` / `project list` の `-*` ガードを外し 位置引数を取らないサブコマンドで常に --interactive 候補を出す (zsh と整合) - docs/user/cli-reference.md: Mermaid D1 ノードから login [index] / build [image] を分離し [name] を取らないことを明示 - etc/_devbase: `project ps` / `project logs` の name 補完を _arguments の positional (1:name:) に統合し、名前入力済みでも候補が出る問題を解消 - docs/user/cli-reference.md / README.md: `devbase build` が project グループ ではなく bin/devbase の shell 実装 cmd_build へ直接委譲される旨を明記 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(env): プロジェクト切替時に呼び出し元固有 env キーをクリア (codex指摘) 別プロジェクト内から `devbase project up other` 等を実行した際、対象 env を 上書き source するだけだと呼び出し元プロジェクトにしか無い env キー (例: DEV_SERVICE_NAME) が残留し、対象プロジェクトへ誤って引き継がれていた。 - bin/devbase: 起動時に呼び出し元 (初期 CWD) の env キーを env_var_keys() で記録し、 maybe_cd_project の対象 env source 前に unset。共通キーは対象 env が再設定するため 対象側の値が勝つ。 - lib/devbase/commands/container.py: Python フォールバック (_resolve_project_name / _load_project_env) でも同様に、chdir 前の呼び出し元 env キーのうち対象 env に 無いものを unset。 - tests: wrapper / Python 両経路の回帰テストを追加。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(wrapper): ct alias を name 解決経路に統合 + 衝突注意を強化 PR #33 cross-review round2 codex 指摘対応。 - ct alias 修正 (minor, bin/devbase:319): name 解決 case の `project|container)` を `project|container|ct)` に拡張。 `ct up <name>` が container と同じ strip/chdir 経路を通るようにし、 従来 `unrecognized arguments: <name>` になっていた回帰を解消。 alias `ct` 自体は cli.py 側で container へ解決されるため Python へは `ct` のまま渡す。回帰テスト test_wrapper_ct_up_name_cds_and_strips を追加。 - 衝突注意の強化 (major=却下に伴うドキュメント補強): login/build/scale の存在性ベース name 解決は意図的設計のため挙動は維持。 positional 引数 (index/image/service) が実在プロジェクト名と衝突した際に project 解決が優先され引数解釈が変わる footgun を bin/devbase コメントと docs/user/cli-reference.md に明記。回避策 (対象プロジェクト内で実行 / 明示 切り替え) も併記。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Summary
project list一覧表示 +--interactive選択起動$DEVBASE_ROOT/projects/配下を NAME / PLUGIN / STATUS で一覧表示するdevbase project list/ トップレベルシノニムdevbase listを新設。変更点
_resolve_plugin_name: symlink 先 から plugin 名を解決。PLAN04 の同名衝突suffix (
carmo.takemi) はリンク名のみに付きリンク先 dir は素の<proj>のままなので、リンク先を辿ることで suffix 有無に関わらず正しく解決する。
list_projects: projects/ 配下 (symlink / 実dir / broken symlink) を列挙。status は
status._container_status_forを共有。取得不能はunknown。cmd_project_list: 整列テーブル /--interactiveで番号入力選択 →project up起動 (新規依存なし・stdlib
input・非TTY は EOFError graceful)。_container_status_forを抽出し共有 (
cmd_statusの挙動は不変)。project list(--interactive/-i) + トップレベルlistシノニム。SUBCMD_MAP /
_expand_argv/ dispatch にlistを同期 (DEVBASE_ROOT 必須)。resolve_command候補 + dispatch case にlist追加 (name 解決対象外)。Test plan
devbase project listが NAME/PLUGIN/STATUS を表示 (衝突 suffix 含む) — E2E 確認済devbase listトップレベルシノニムが等価--interactive選択 → 起動 / 空入力中止 / 非TTY EOF / 範囲外_resolve_plugin_nameの repos / --link / 衝突 suffix / 実dir / broken symlink_container_status_for/_get_container_status)list/project listが Python へルーティング