Skip to content

feat: PLAN06-2 wrapper cd によるプロジェクト名解決 + トップレベルシノニム#35

Merged
takemi-ohama merged 4 commits into
release/PLAN06from
feature/PLAN06-name-resolution
May 30, 2026
Merged

feat: PLAN06-2 wrapper cd によるプロジェクト名解決 + トップレベルシノニム#35
takemi-ohama merged 4 commits into
release/PLAN06from
feature/PLAN06-name-resolution

Conversation

@takemi-ohama

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

Copy link
Copy Markdown
Contributor

Summary

実装概要

bin/devbase(方針 A の核心)

  • maybe_cd_project を追加。project/container <sub> <name> 及びトップレベルシノニム <sub> <name><name>$DEVBASE_ROOT/projects/<name>実在する場合のみ cd し、COMPOSE_PROJECT_NAME./envcd 後に再設定、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 防御フォールバック)

  • PR1 の「name 解決は未実装」warning を撤去し、_resolve_project_nameprojects/<name> を解決 → os.chdir(wrapper が cd 済みなら冪等 no-op)+ COMPOSE_PROJECT_NAME 上書き。
  • chdir は各 handler に散らさず _dispatch_lifecycle一括実施cmd_down() / cmd_login() / cmd_logs() は project_name 引数を持たず per-handler では救えないため)。
  • 存在しない name はエラー + 候補一覧を提示。

Test plan

  • project up <name> が任意 CWD から対象へ cd(スモーク + wrapper テスト)
  • project build <name> が wrapper cd 依存経路で成立
  • 引数省略時は従来通り CWD ベース
  • 存在しない name でエラー + 候補提示
  • scale <name> <N> の positional 解析が曖昧にならない(scale 3 は N、scale carmo 3 は name+N)
  • login <index> / build <image> が name と曖昧にならない(実在性で判定)
  • logs はトップレベルシノニムを作らない(現状維持)
  • 全 359 テスト pass / bash -n OK / 実起動スモーク(routing・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>
@takemi-ohama takemi-ohama force-pushed the feature/PLAN06-name-resolution branch from ba91ef6 to e3bba69 Compare May 30, 2026 06:21
@takemi-ohama takemi-ohama marked this pull request as ready for review May 30, 2026 06:28

@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

ラッパー (bin/devbase) でのディレクトリ解決と、Python 側でのフォールバックという 2 段構えの実装により、CWD に依存しないプロジェクト操作が堅牢に実現されています。存在性ベースの判定により既存の引数(index/image等)との衝突も回避されており、設計意図通りに動作することを確認しました。

Comment thread bin/devbase
Comment thread lib/devbase/commands/container.py

@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/container wrapper dispatchで、既存positionalを持つサブコマンドとプロジェクト名stripが衝突する経路があります。該当サブコマンドのname解決対象をparser上nameを持つものに限定してください。

Comment thread bin/devbase Outdated
`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>
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

🔧 cross-review round1 fix サマリ

codex (REQUEST_CHANGES) / gemini (APPROVE) のレビュー指摘に対応しました。

修正 (1件)

  • [major] project/container の name 解決と positional 衝突 (bin/devbase:232, codex)
    • project build web / project login webweb が実在プロジェクト名と一致すると image/index positional が strip され別操作に化ける衝突を修正。
    • name 解決対象を parser が name positional を持つサブコマンド (up/down/ps/logs/scale) に限定。login/build は既存 positional としてそのまま委譲。
    • 回帰テスト 2 件追加 (test_wrapper_project_build_keeps_image_positional / test_wrapper_project_login_keeps_index_positional)。
    • トップレベルシノニム (build carmo / login carmo) は shell cmd_build / wrapper cd のみが name 指定手段のため従来どおり存在性ベース cd を維持。

deferred (2件 / minor、本ラウンド未対応・Resolve せず)

  • [minor] maybe_cd_projectsource ./env 副作用 (bin/devbase:212, gemini)
    • wrapper 冒頭の env 読み込みと同一の意図的方針。非対称化を避けるため現状維持。
  • [minor] _report_unknown_project の候補一覧が多数プロジェクトで冗長 (container.py:97, gemini)
    • 表示上限値は UX 仕様判断が必要なため deferred。

rejected

  • なし

品質チェック

  • pytest 全 361 passed (回帰テスト 2 件追加込み)
  • bash -n bin/devbase 構文 OK

CI

  • 当該ブランチに登録された CI チェックなし (no checks reported)

修正コミット: bab05af

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

プロジェクト名解決の wrapper cd 方式への移行と、それに伴う引数衝突の回避ロジックを詳細に確認しました。全体として設計意図(方針 A)が正確に実装されており、テストも非常に網羅的です。Python 側フォールバックと wrapper 側の振る舞いの僅かな差異についてのみ、念のため指摘を残します。

Comment thread lib/devbase/commands/container.py
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 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>
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

cross-review deferred minor 2件 対応 (commit 30d5f53)

approved 収束後、ユーザ判断で対応することになった deferred minor 2件を修正しました。

# 箇所 対応
1 bin/devbase maybe_cd_projectsource ./env subshell 化は採用せず設計判断を注記コメントで明文化。set -a の export を後続 (run_python/cmd_build) へ引き継ぐため subshell 不可。env は信頼境界内かつ既に L24 でも source されており新規リスク増は無い旨を記載。
2 lib/devbase/commands/container.py _report_unknown_project の候補一覧 表示上限 _MAX_PROJECT_CANDIDATES = 20 を導入。超過時は先頭 20 件 + ... 他 M 件 に truncate。
  • 回帰テスト 2件追加 (truncate / 上限内非省略)
  • pytest 全 363 件 green
  • 該当 2 thread は reply 投稿の上 Resolve 済み

--force / --no-verify 未使用。worktree 内のみで作業。

…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>
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

gemini round2 minor 2件 対応 (commit 69087de)

未 Resolve のまま残っていた gemini round2 の minor インラインコメント 2件に対応し、全スレッドを Resolve しました。

1. lib/devbase/commands/container.py — Python フォールバックの env source 整合 [minor / 正確性]

Python 側フォールバック _resolve_project_nameos.chdir のみで env を読み込まず、wrapper を経ない直接起動時に環境変数が欠落する差異がありました。

  • _load_project_env(Path('env')) を追加し、wrapper の source ./env と同等に project の envos.environ へ反映。
  • 単純な KEY=VALUE (export 可) のみ解釈、コメント/空行無視、クォート除去。変数展開/コマンド置換は非サポート (安全側)。
  • COMPOSE_PROJECT_NAME は env 反映後に name で上書きするため name 指定が優先。
  • 回帰テスト 3件追加。

2. bin/devbase — list 同期注記 [minor / メンテナンス性]

_PROJECT_NAME_SUBCOMMANDS / _NAME_RESOLVABLE_SHORTCUTS が cli.py の parser 構造に依存している件について、両側に同期注意コメントを追記。

  • bin/devbase: 2 リスト直前に同期注意コメント。
  • lib/devbase/cli.py: SHORTCUTS 定義直前と _add_project_parser docstring に対の注記。

テスト

uv run pytest: 366 passed (従来 363 + 新規回帰 3件)。

@takemi-ohama takemi-ohama merged commit a532ff8 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-name-resolution branch June 6, 2026 20:12
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