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
Copy link
Copy Markdown
Contributor

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

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

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

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

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

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

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