Skip to content

feat: PLAN06-1 project サブコマンド group + ハンドラ共有 + container 非推奨委譲#34

Merged
takemi-ohama merged 7 commits into
release/PLAN06from
feature/PLAN06-project-group
May 30, 2026
Merged

feat: PLAN06-1 project サブコマンド group + ハンドラ共有 + container 非推奨委譲#34
takemi-ohama merged 7 commits into
release/PLAN06from
feature/PLAN06-project-group

Conversation

@takemi-ohama
Copy link
Copy Markdown
Contributor

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

Summary

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 / _dispatchproject を追加
      (3 箇所のコマンドリストのうち Python 側 2 箇所を同期。prefix 解決対応)
    • トップレベルショートカット(up 等)は非推奨の container ではなく共有
      cmd_project
      へ委譲し、ショートカットで warning が出ないようにした
    • --help epilog を project 体系 + container 非推奨告知に更新
  • lib/devbase/commands/container.py
    • cmd_container 本体を _dispatch_lifecycle に抽出(実装重複の排除)
    • cmd_project(推奨)/ cmd_container(非推奨 warning + 委譲)が共有
    • project <sub> [name]nameproject_name へ畳み込み、
      up / scale へ伝播(down/login/logs/ps/build の名前解決と wrapper cd は
      PR2 / Task 2 で実装)
  • tests/cli/test_project_dispatch.py(新規 14 ケース)

スコープ外(後続 PR)

  • bin/devbaseproject ルーティング + cd によるプロジェクト名解決 → PR2
    bin/devbase は PR2 の対象。本 PR では未変更のため、wrapper 経由の
    devbase project ... は PR2 まで "unknown command" になる。本 PR のテストは
    Python を直接起動して検証)
  • project list / --interactive → PR3、補完・docs → PR4

Test plan

  • project up/down/ps/login/logs/scale/build parser が成立([name] パース含む)
  • project scale 3 / project scale carmo 3 が曖昧にならない
  • container <sub> が非推奨 warning を出しつつ従来通り委譲する
  • project / トップレベルショートカットは warning を出さない
  • prefix 解決(prprojectproject uup)が成立
  • dispatch ルーティング(project→cmd_project / container→cmd_container / shortcut→cmd_project)
  • 全テスト 320 件パス(リグレッションなし)

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 takemi-ohama marked this pull request as ready for review May 29, 2026 22:01
Copy link
Copy Markdown
Contributor Author

@takemi-ohama takemi-ohama left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 1 | codex | REQUEST_CHANGES

未実装の project name 引数が実行時に無視される経路があるため、修正が必要です。

Comment thread lib/devbase/cli.py
Comment thread lib/devbase/cli.py Outdated
Copy link
Copy Markdown
Contributor Author

@takemi-ohama takemi-ohama left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 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.

Comment thread lib/devbase/cli.py Outdated
Comment thread lib/devbase/cli.py
Comment thread lib/devbase/commands/container.py
Comment thread lib/devbase/cli.py
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>
@takemi-ohama
Copy link
Copy Markdown
Contributor Author

🔧 cross-review fix | round 1 対応サマリ

commit: 9795687 (push 済み: feature/PLAN06-project-group, 469c892..9795687)

対応件数

区分 件数
fixed (Resolve 済み) 4 (major 3 / minor 1)
deferred (Resolve せず) 2 (minor 1 / nit 1)
rejected 0

fixed

  • [major] login 引数の曖昧さ (cli.py:113) — project login から [name] を削除し単一 positional を index に。project login 2 が name='2' で index=1 にログインしてしまう旧 container login <index> 非互換を解消。
  • [major] build web が image 指定を無視 (cli.py:132) — project build から [name] を削除し単一 positional を image に。project build webimage='web'
  • [major] name が dispatcher で黙って無視される (cli.py:114) — _dispatch_lifecycle で PR1 未対応の name 指定時 (up/scale 以外) に「CWD の compose に作用する」warning を出力。
  • [minor] name が cmd_down 等に伝播されない (container.py:111) — 上記 warning で明示化。

name の実解決自体は設計どおり PR2 スコープ (PLAN06 Task 2)。

deferred (Resolve せず / 次ラウンド再評価)

  • [minor] container/project parser の重複 (cli.py:95) — login/build の positional 構成が両者で分岐し共通ヘルパ化は複雑化。PR2 で構成安定後に整理予定。
  • [nit] commands リストの登録順序 (cli.py:430) — abbrev 解決は独自 _resolve_prefix の prefix 一致で登録順序に機能的影響なし。

CI / 検証

  • feature/PLAN06-project-group に CI チェック未設定 (gh pr checks: no checks reported)。
  • 全 parser/dispatcher 変更を実機 argparse 検証 + pytest 全 suite (113 passed) で確認済み。test_project_up_accepts_optional_name / test_project_scale_positional_is_unambiguous 等の既存テストも全 PASS。

再レビューをお願いします。

Copy link
Copy Markdown
Contributor Author

@takemi-ohama takemi-ohama left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 2 | gemini | REQUEST_CHANGES

PR1 では project サブコマンドと name 引数のパース構造が整備されました。ディレクトリ解決 (PR2) が未実装な現状において、up / scale コマンドで警告が出ない点は、ユーザーが「指定したプロジェクトに対して正しく操作が行われている」と誤解するリスクがあるため、他サブコマンドと同様に警告を出すか、メッセージを調整することを検討してください。

Comment thread lib/devbase/commands/container.py Outdated
Comment thread lib/devbase/cli.py Outdated
Comment thread lib/devbase/cli.py Outdated
Copy link
Copy Markdown
Contributor Author

@takemi-ohama takemi-ohama left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 2 | codex | REQUEST_CHANGES

projectサブコマンドがインストール済みCLI入口から到達不能なため、wrapper側のdispatch更新が必要です。

Comment thread lib/devbase/cli.py
- 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>
@takemi-ohama
Copy link
Copy Markdown
Contributor Author

🔧 cross-review fix | round 2 対応サマリ

commit: 3f1c9d8 (push 済み: feature/PLAN06-project-group, 9795687..3f1c9d8)

対応件数

区分 件数
fixed (Resolve 済み) 4 (major 2 / minor 2)
deferred (Resolve せず) 0
rejected 0

round 1 で deferred 済みの 2 件 (cli.py:95 parser 重複 / cli.py:430 commands 登録順序) は今回新規指摘が無いため再対応していません (引き続き Resolve せず据え置き)。

fixed

  • [major] wrapper から project が到達不能 (cli.py:400 / bin/devbase) — resolve_command 候補リストと dispatch case の両方に project が無く devbase project --helpunknown command 終了していた。両所に project を追加。env 非依存の wrapper テスト tests/cli/test_wrapper_dispatch.py を新規追加 (project --help / project up / proj up が Python 経路に届くこと + 未知コマンドの error を検証)。
  • [major] up/scale で name 未実装警告が出ない (container.py:100) — PR1 では up/scale も CWD の compose に作用し name によるディレクトリ解決をしないため、_dispatch_lifecycle の警告から up/scale の除外を撤廃し name 指定時は全サブコマンドで警告。test_name_warns_for_up / test_name_warns_for_scale 追加。
  • [minor] SHORTCUTS の死んだ group 要素 (cli.py:21) — ('container', sub) タプルの group 要素は dispatch で未使用だったため subcommand 文字列に簡略化 (行数削減)。
  • [minor] login/build が name 非対応な設計の明記 (cli.py:118) — positional 衝突回避の意図と PR2 での --name 整合方針を docstring に明記。

CI / 検証

  • feature/PLAN06-project-group に CI チェック未設定 (gh pr checks: no checks reported)。
  • pytest 全 suite 191 passed (round1 比 +テスト)。新規 10 テスト (wrapper 6 + up/scale 警告 4) を含め全 PASS。

再レビューをお願いします。

round2 のレビュー対応 (container.py:100) で up/scale も name 指定時に未実装
警告を出すようにしたため、その回帰防止テストを追加する。前 commit の編集が
既存テストの記法不一致で取り込めていなかったため本 commit で補完する。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@takemi-ohama
Copy link
Copy Markdown
Contributor Author

(前 summary の訂正)対応 commit SHA は f8ebb76 (本体修正) + 04cb7f0 (up/scale 警告の回帰テスト追補) が正です。前コメントの 3f1c9d8 は誤りでした。最終 head: 04cb7f0 (feature/PLAN06-project-group に push 済み)。

なお対応内容 (fixed 4 / deferred 0 / rejected 0) と pytest 結果に変更はありません: pytest 全 suite 329 passed (新規テスト wrapper 4 + up/scale 警告 3 を含む)。CI チェックは当ブランチに未設定 (no checks reported)。

@takemi-ohama
Copy link
Copy Markdown
Contributor Author

(SHA 最終訂正・確定版)round2 の対応 commit は以下が正です。直前の訂正で挙げた 04cb7f0 / 3f1c9d8 はいずれも誤りでした。

  • f8ebb76 — 本体修正 (wrapper の project dispatch / up・scale 警告 / SHORTCUTS 簡略化 / docstring 明記 + wrapper テスト)
  • 5c56fbf — up/scale name 警告の回帰テスト追補

最終 head: 5c56fbf (feature/PLAN06-project-group, 9795687..5c56fbf push 済み)。
pytest 全 suite 329 passed。CI チェックは当ブランチに未設定 (no checks reported)。
対応内容に変更なし: fixed 4 (major 2 / minor 2) / deferred 0 (新規) / rejected 0。

Copy link
Copy Markdown
Contributor Author

@takemi-ohama takemi-ohama left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 3 | codex | REQUEST_CHANGES

devbase build の実行経路が project build と一致していないため、ショートカット移行の対象を wrapper まで揃えてください。

Comment thread bin/devbase
Copy link
Copy Markdown
Contributor Author

@takemi-ohama takemi-ohama left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 3 | gemini | APPROVE

project サブコマンドグループの導入と container の非推奨化が、共有のディスパッチャを利用してきれいに実装されています。テストも網羅的で、設計意図通りに動作することを確認しました。

Comment thread lib/devbase/cli.py
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>
@takemi-ohama
Copy link
Copy Markdown
Contributor Author

🔧 cross-review fix | round 3 対応サマリ

commit: de82d06a5fe3a186a8eceab627276c0e14e277fe (push 済み: feature/PLAN06-project-group, 5c56fbf..de82d06a5fe3a186a8eceab627276c0e14e277fe)

対応件数

区分 件数
fixed (Resolve 済み) 1 (major 1)
deferred (Resolve せず) 1 (minor 1, 今回新規)
rejected 0

round 1 で deferred 済みの 2 件 (cli.py:94 parser 重複 / cli.py:431 commands 登録順序) は今回新規指摘が無いため再対応していません (引き続き Resolve せず据え置き)。

fixed

  • [major] devbase build が共有ハンドラ経路にならない (bin/devbase) — wrapper は build を shell の cmd_build (devbase-base 依存検出 + 2 段ビルド + --no-cache 対応) に委譲する一方、Python は buildproject build ショートカットとして広告 (SHORTCUTS / help) しており、広告と実経路が乖離していた。
    • Python の project build は単純な compose build で shell の base-image ビルドと等価でないため、wrapper を Python に委譲する案 (codex 案1) は機能回帰になる。codex 案2 を採用し、Python 側の SHORTCUTS / _add_shortcuts / help epilog / _expand_argv から top-level build を除外して実経路 (shell) と広告を一致させた。project build / container build サブコマンドは維持。
    • 整合性回帰テスト tests/cli/test_build_shortcut_consistency.py (5 件) を追加。

deferred (Resolve せず / 次ラウンド再評価)

  • [minor] トップレベルショートカットの [name] 対応 (cli.py:367, gemini) — PR1 では name 未解決のため動作差が出ず、4 ショートカットへの positional + 伝播 + テストは +30 行超で PR2 の name 解決と密結合するため、PR2 で正式な引数体系と合わせて導入する方針。

CI / 検証

  • feature/PLAN06-project-group に CI チェック未設定 (gh pr checks: no checks reported)。
  • pytest 全 suite 334 passed (round2 比 +5: build 整合性テスト)。

再レビューをお願いします。

Copy link
Copy Markdown
Contributor Author

@takemi-ohama takemi-ohama left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 4 | codex | APPROVE

修正要求なし。PR変更面に対して追加CLIテストと既存CLIテストを確認済みです。

Copy link
Copy Markdown
Contributor Author

@takemi-ohama takemi-ohama left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 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 によるディレクトリ解決が未実装である点に対する明示的な警告

@takemi-ohama
Copy link
Copy Markdown
Contributor Author

🔧 cross-review fix | round 4 対応サマリ

head: de82d06a5fe3a186a8eceab627276c0e14e277fe (変更なし / 新規 push なし)

round 4 レビュー結果

  • codex (round 4 / APPROVE): 修正要求なし。PR 変更面に対する追加 CLI テストと既存 CLI テストを確認済み。
  • gemini (round 4 / APPROVE): project 群導入・container 非推奨化・build ショートカットの shell 委譲整合を確認、テストも十分に網羅と評価。

両 bot とも APPROVE で、round 4 では新規の inline コメント / review thread はゼロでした。

対応件数

区分 件数
fixed (Resolve 済み) 0
deferred (Resolve せず) 3 (minor 2 / nit 1)
rejected 0

新規の actionable 指摘が無いため、本ラウンドはコード変更・コミット・push を行っていません (head 据え置き)。

deferred (Resolve せず / 据え置き継続)

round 1〜3 で deferred とした以下 3 件は round 4 で新規指摘・再提起が無く状況不変のため、各 thread に round 4 ステータス reply を追記のうえ引き続き deferred とします。

  • [minor] container/project parser の重複 (cli.py:98) — login/build の positional 構成が両者で分岐し共通ヘルパ化は複雑化。PR2 で構成安定後に整理。
  • [nit] commands 登録順序 (cli.py:438) — abbrev 解決は独自 _resolve_prefix の prefix 一致で登録順序に機能的影響なし。
  • [minor] トップレベルショートカットの [name] 対応 (cli.py:372) — PR1 では name 未解決で動作差なし、+30 行超で PR2 の name 解決と密結合のため PR2 で整合。

CI / 検証

  • feature/PLAN06-project-group に CI チェック未設定 (gh pr checks: no checks reported)。
  • venv pytest 全 suite 334 passed (round 3 比 不変)。

ユーザ指示により 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>
@takemi-ohama
Copy link
Copy Markdown
Contributor Author

🔧 cross-review fix | deferred 3 件をユーザ指示で対応

これまで deferred (Resolve せず据え置き) としていた 3 件を、ユーザ指示により本 PR で全て対応しました。

最終 commit: 4e3915880ff8c8a44f1d574f0c1cb9e76971ce58 (push 済み: feature/PLAN06-project-group, de82d06..4e39158)

対応概要

# 区分 指摘 対応
1 minor cli.py:98 _add_container_parser / _add_project_parser のサブコマンド定義重複 project/container で完全一致する login/build 定義を共有ヘルパ _add_login_subparser / _add_build_subparser に括り出し。分岐する up/down/ps/logs/scale ([name] 有無) は呼び出し側に残し条件分岐を増やさず可読性維持。
2 minor cli.py:372 トップレベルショートカット (up/down/ps/scale) も [name] を受け付けるべき _add_shortcuts を更新し up/down/ps/scale が省略可能な [name] positional を受理。ショートカット経由でも name が _dispatch → cmd_project → _dispatch_lifecycle まで伝播 (実解決は PR2、PR1 は未対応 warning)。
3 nit cli.py:438 commands リストへの project/container 登録順序 _expand_argvcommands 並びを _create_parser 登録順と一致 (group 直後に alias 隣接、project=推奨 を container=非推奨 より前) させ、prefix 解決が順序非依存である旨をコメントで明示。

検証

3 件とも該当 review thread に reply のうえ Resolve 済みです。

@takemi-ohama
Copy link
Copy Markdown
Contributor Author

(訂正)上記 deferred 対応 reply / summary に記載した commit SHA 4e39158 と pytest 件数 348 passed は誤りでした。正しくは以下です:

  • 最終 commit: 412fa2452f7e07a438a444bd29c07ab1c8bc68d4 (feature/PLAN06-project-group, push 済み de82d06..412fa24)
  • pytest 全 suite: 346 passed (deferred 対応前 334 比 +12)

対応内容 (parser 共通化 / shortcut [name] 受理・伝播 / 登録順序整理の 3 件) と Resolve 状況に変更はありません。

Copy link
Copy Markdown
Contributor Author

@takemi-ohama takemi-ohama left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 1 | gemini | APPROVE

PR1 (PLAN06 Task 1) としての project コマンド群の導入、container の非推奨化、および build ショートカットの shell 委譲への整合対応を確認しました。
以前の指摘事項(login/build の曖昧さ、 dispatcher での警告、wrapper への追加など)が適切に修正され、共通ヘルパーによるリファクタリングも行われています。
テストも網羅的であり、設計通りの動作が担保されていると判断し、承認(APPROVE)します。

Copy link
Copy Markdown
Contributor Author

@takemi-ohama takemi-ohama left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 1 | codex | APPROVE

修正要求なし。PR変更面に対して追加CLIテストと全体テストを確認済みです。

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