feat: PLAN06-2 wrapper cd によるプロジェクト名解決 + トップレベルシノニム#35
Conversation
任意の 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>
ba91ef6 to
e3bba69
Compare
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | gemini | APPROVE
ラッパー (bin/devbase) でのディレクトリ解決と、Python 側でのフォールバックという 2 段構えの実装により、CWD に依存しないプロジェクト操作が堅牢に実現されています。存在性ベースの判定により既存の引数(index/image等)との衝突も回避されており、設計意図通りに動作することを確認しました。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | codex | REQUEST_CHANGES
project/container wrapper dispatchで、既存positionalを持つサブコマンドとプロジェクト名stripが衝突する経路があります。該当サブコマンドのname解決対象をparser上nameを持つものに限定してください。
`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>
🔧 cross-review round1 fix サマリcodex (REQUEST_CHANGES) / gemini (APPROVE) のレビュー指摘に対応しました。 修正 (1件)
deferred (2件 / minor、本ラウンド未対応・Resolve せず)
rejected
品質チェック
CI
修正コミット: |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | gemini | APPROVE
プロジェクト名解決の wrapper cd 方式への移行と、それに伴う引数衝突の回避ロジックを詳細に確認しました。全体として設計意図(方針 A)が正確に実装されており、テストも非常に網羅的です。Python 側フォールバックと wrapper 側の振る舞いの僅かな差異についてのみ、念のため指摘を残します。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | codex | APPROVE
round 1 の major 指摘 (project/container の name 解決と positional 衝突) は commit bab05af で対応済み。再レビューの結果、修正必須の新規指摘はありません。
- 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>
cross-review deferred minor 2件 対応 (commit 30d5f53)approved 収束後、ユーザ判断で対応することになった deferred minor 2件を修正しました。
|
…ist 同期注記 - 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>
gemini round2 minor 2件 対応 (commit 69087de)未 Resolve のまま残っていた gemini round2 の minor インラインコメント 2件に対応し、全スレッドを Resolve しました。 1.
|
Summary
issues/PLAN06_project-subcommand.md_dispatch_lifecycleでの chdir フォールバック、トップレベルシノニム整備release/PLAN06へ rebase 済み)実装概要
bin/devbase(方針 A の核心)
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) で CWD 実行されるため、この wrapper cd だけが build の name 解決手段になる。dispatch を name strip 後の_DEVBASE_ARGS経由に変更。lib/devbase/commands/container.py(Python 防御フォールバック)
_resolve_project_nameでprojects/<name>を解決 →os.chdir(wrapper が cd 済みなら冪等 no-op)+COMPOSE_PROJECT_NAME上書き。_dispatch_lifecycleで一括実施(cmd_down()/cmd_login()/cmd_logs()は project_name 引数を持たず per-handler では救えないため)。Test plan
project up <name>が任意 CWD から対象へ cd(スモーク + wrapper テスト)project build <name>が wrapper cd 依存経路で成立scale <name> <N>の positional 解析が曖昧にならない(scale 3は N、scale carmo 3は name+N)login <index>/build <image>が name と曖昧にならない(実在性で判定)logsはトップレベルシノニムを作らない(現状維持)bash -nOK / 実起動スモーク(routing・cd・エラー候補)確認