Skip to content

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

Open
takemi-ohama wants to merge 5 commits into
mainfrom
release/PLAN06
Open

release: PLAN06 devbase project サブコマンド導入#33
takemi-ohama wants to merge 5 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>
@takemi-ohama takemi-ohama marked this pull request as ready for review June 2, 2026 04:46
takemi-ohama and others added 2 commits June 2, 2026 13:46
* 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 非推奨告知

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