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

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

Copy link
Copy Markdown
Contributor

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

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

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

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

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。

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

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

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

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

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。

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

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

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

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 整合性テスト)。

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

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

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テストを確認済みです。

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

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 状況に変更はありません。

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

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)します。

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

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テストと全体テストを確認済みです。

@takemi-ohama takemi-ohama merged commit fb07d5f into release/PLAN06 May 30, 2026
takemi-ohama added a commit that referenced this pull request Jun 6, 2026
* 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>
@takemi-ohama takemi-ohama deleted the feature/PLAN06-project-group branch June 6, 2026 20:11
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