feat: PLAN06-1 project サブコマンド group + ハンドラ共有 + container 非推奨委譲#34
Conversation
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 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>
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | codex | REQUEST_CHANGES
未実装の project name 引数が実行時に無視される経路があるため、修正が必要です。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | gemini | REQUEST_CHANGES
PR #34 introduces the project command group as a replacement for container. While the structural changes and deprecation warning are well-implemented, there is a significant usability issue with argument ambiguity in project login. Additionally, the parser definition could be refactored to reduce duplication.
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>
🔧 cross-review fix | round 1 対応サマリcommit: 対応件数
fixed
name の実解決自体は設計どおり PR2 スコープ (PLAN06 Task 2)。 deferred (Resolve せず / 次ラウンド再評価)
CI / 検証
再レビューをお願いします。 |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | gemini | REQUEST_CHANGES
PR1 では project サブコマンドと name 引数のパース構造が整備されました。ディレクトリ解決 (PR2) が未実装な現状において、up / scale コマンドで警告が出ない点は、ユーザーが「指定したプロジェクトに対して正しく操作が行われている」と誤解するリスクがあるため、他サブコマンドと同様に警告を出すか、メッセージを調整することを検討してください。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | codex | REQUEST_CHANGES
projectサブコマンドがインストール済みCLI入口から到達不能なため、wrapper側のdispatch更新が必要です。
- 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>
🔧 cross-review fix | round 2 対応サマリcommit: 対応件数
fixed
CI / 検証
再レビューをお願いします。 |
round2 のレビュー対応 (container.py:100) で up/scale も name 指定時に未実装 警告を出すようにしたため、その回帰防止テストを追加する。前 commit の編集が 既存テストの記法不一致で取り込めていなかったため本 commit で補完する。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
(前 summary の訂正)対応 commit SHA は なお対応内容 (fixed 4 / deferred 0 / rejected 0) と pytest 結果に変更はありません: pytest 全 suite 329 passed (新規テスト wrapper 4 + up/scale 警告 3 を含む)。CI チェックは当ブランチに未設定 (no checks reported)。 |
|
(SHA 最終訂正・確定版)round2 の対応 commit は以下が正です。直前の訂正で挙げた
最終 head: |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 3 | codex | REQUEST_CHANGES
devbase build の実行経路が project build と一致していないため、ショートカット移行の対象を wrapper まで揃えてください。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 3 | gemini | APPROVE
project サブコマンドグループの導入と container の非推奨化が、共有のディスパッチャを利用してきれいに実装されています。テストも網羅的で、設計意図通りに動作することを確認しました。
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>
🔧 cross-review fix | round 3 対応サマリcommit: 対応件数
fixed
deferred (Resolve せず / 次ラウンド再評価)
CI / 検証
再レビューをお願いします。 |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 4 | codex | APPROVE
修正要求なし。PR変更面に対して追加CLIテストと既存CLIテストを確認済みです。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 4 | gemini | APPROVE
PR1 (PLAN06 Task 1) としての project コマンド群の導入、container の非推奨化、および build ショートカットの shell 委譲への整合対応を確認しました。設計および実装は妥当であり、テストも十分に網羅されています。
projectグループと[name]positional の導入containerからprojectへの委譲と非推奨警告の追加buildショートカットを Python 側から除外することによる bin/devbase (shell) との整合性確保project_nameによるディレクトリ解決が未実装である点に対する明示的な警告
🔧 cross-review fix | round 4 対応サマリhead: round 4 レビュー結果
両 bot とも APPROVE で、round 4 では新規の inline コメント / review thread はゼロでした。 対応件数
新規の actionable 指摘が無いため、本ラウンドはコード変更・コミット・push を行っていません (head 据え置き)。 deferred (Resolve せず / 据え置き継続)round 1〜3 で deferred とした以下 3 件は round 4 で新規指摘・再提起が無く状況不変のため、各 thread に round 4 ステータス reply を追記のうえ引き続き deferred とします。
CI / 検証
|
ユーザ指示により 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>
🔧 cross-review fix | deferred 3 件をユーザ指示で対応これまで deferred (Resolve せず据え置き) としていた 3 件を、ユーザ指示により本 PR で全て対応しました。 最終 commit: 対応概要
検証
3 件とも該当 review thread に reply のうえ Resolve 済みです。 |
|
(訂正)上記 deferred 対応 reply / summary に記載した commit SHA
対応内容 (parser 共通化 / shortcut [name] 受理・伝播 / 登録順序整理の 3 件) と Resolve 状況に変更はありません。 |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | gemini | APPROVE
PR1 (PLAN06 Task 1) としての project コマンド群の導入、container の非推奨化、および build ショートカットの shell 委譲への整合対応を確認しました。
以前の指摘事項(login/build の曖昧さ、 dispatcher での警告、wrapper への追加など)が適切に修正され、共通ヘルパーによるリファクタリングも行われています。
テストも網羅的であり、設計通りの動作が担保されていると判断し、承認(APPROVE)します。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | codex | APPROVE
修正要求なし。PR変更面に対して追加CLIテストと全体テストを確認済みです。
* 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
issues/PLAN06_project-subcommand.md(Task 1 / PR1)devbase projectサブコマンド group を新設し、既存container系の実装を共有ハンドラに集約して
containerを非推奨委譲に切り替える。本 PR は Pythonレベルのリネーム + 委譲のみで、runtime 挙動は従来と同等(cd / プロジェクト名
解決なし)。
変更内容
lib/devbase/cli.py_add_project_parserを追加。up/down/ps/login/logs/scale/buildに省略可能な
[name]positional を付与(scaleは[name]+ 必須new_scale:intで曖昧にならない順序)
SUBCMD_MAP/_expand_argvの commands /_dispatchにprojectを追加(3 箇所のコマンドリストのうち Python 側 2 箇所を同期。prefix 解決対応)
up等)は非推奨のcontainerではなく共有cmd_projectへ委譲し、ショートカットで warning が出ないようにした--helpepilog をproject体系 +container非推奨告知に更新lib/devbase/commands/container.pycmd_container本体を_dispatch_lifecycleに抽出(実装重複の排除)cmd_project(推奨)/cmd_container(非推奨 warning + 委譲)が共有project <sub> [name]のnameをproject_nameへ畳み込み、up/scaleへ伝播(down/login/logs/ps/buildの名前解決と wrapper cd はPR2 / Task 2 で実装)
tests/cli/test_project_dispatch.py(新規 14 ケース)スコープ外(後続 PR)
bin/devbaseのprojectルーティング + cd によるプロジェクト名解決 → PR2(
bin/devbaseは PR2 の対象。本 PR では未変更のため、wrapper 経由のdevbase project ...は PR2 まで "unknown command" になる。本 PR のテストはPython を直接起動して検証)
project list/--interactive→ PR3、補完・docs → PR4Test plan
project up/down/ps/login/logs/scale/buildparser が成立([name]パース含む)project scale 3/project scale carmo 3が曖昧にならないcontainer <sub>が非推奨 warning を出しつつ従来通り委譲するproject/ トップレベルショートカットは warning を出さないpr→project、project u→up)が成立