Skip to content

release: PLAN06 devbase project サブコマンド導入#33

Draft
takemi-ohama wants to merge 3 commits into
mainfrom
release/PLAN06
Draft

release: PLAN06 devbase project サブコマンド導入#33
takemi-ohama wants to merge 3 commits into
mainfrom
release/PLAN06

Conversation

@takemi-ohama
Copy link
Copy Markdown
Contributor

@takemi-ohama takemi-ohama commented May 28, 2026

Summary

個別 PR

依存関係

PR1 (#34) → PR2 (#35) → PR3 (#36) → PR4 (#37)(PR3 の list 部分は PR1 後 mock で先行可)

Test plan (結合観点のみ)

  • PR 間の parser / dispatch / wrapper cd 経路の整合(個別 PR では分断される起動経路の通し確認)
  • トップレベルシノニム (up/down/list/ps/login/build/scale [name]) が project * と等価
  • build の name 解決(wrapper cd 依存経路)が任意 CWD から成立
  • 既存 container * 非推奨 warning + 後方互換の通し確認

plan: issues/PLAN06_project-subcommand.md

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
takemi-ohama and others added 2 commits May 30, 2026 11:25
* 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 によるプロジェクト名解決 + トップレベルシノニム

任意の 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>
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.

1 participant