Skip to content

feat: PLAN06-3 project list 一覧表示 + --interactive 選択起動#36

Open
takemi-ohama wants to merge 4 commits into
release/PLAN06from
feature/PLAN06-list
Open

feat: PLAN06-3 project list 一覧表示 + --interactive 選択起動#36
takemi-ohama wants to merge 4 commits into
release/PLAN06from
feature/PLAN06-list

Conversation

@takemi-ohama
Copy link
Copy Markdown
Contributor

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

Summary

$DEVBASE_ROOT/projects/ 配下を NAME / PLUGIN / STATUS で一覧表示する
devbase project list / トップレベルシノニム devbase list を新設。

変更点

  • 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 を抽出し
    共有 (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 解決対象外)。

Test plan

  • devbase project list が NAME/PLUGIN/STATUS を表示 (衝突 suffix 含む) — E2E 確認済
  • devbase list トップレベルシノニムが等価
  • --interactive 選択 → 起動 / 空入力中止 / 非TTY EOF / 範囲外
  • _resolve_plugin_name の repos / --link / 衝突 suffix / 実dir / broken symlink
  • status.py リファクタの回帰 (_container_status_for / _get_container_status)
  • wrapper 経由で list / project list が Python へルーティング
  • pytest: 395 passed (baseline 366 + 29)

@takemi-ohama takemi-ohama marked this pull request as ready for review May 30, 2026 07:25
`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>
@takemi-ohama takemi-ohama force-pushed the feature/PLAN06-list branch from f90c991 to 918249e Compare May 30, 2026 13:20
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

project list (および list シノニム) の実装、および status モジュールのリファクタリングを確認しました。概ね良好ですが、プロジェクト数が多い環境でのパフォーマンスに懸念があります。

Comment thread lib/devbase/commands/project.py Outdated
Comment thread lib/devbase/commands/project.py Outdated
Comment thread lib/devbase/commands/project.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 | codex | REQUEST_CHANGES

トップレベル prefix 解決の後方互換を戻してください。詳細は inline の 1 件です。

Comment thread bin/devbase
- [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>
@takemi-ohama
Copy link
Copy Markdown
Contributor Author

🤖 cross-review fix | round 1 対応完了

レビュー指摘 4 件すべてに対応しました (deferred / rejected なし)。

# 重要度 (再判定) 箇所 対応
1 major / 互換性 bin/devbase + cli.py list 追加で ambiguous になった devbase llogin に維持 (top-level prefix preference)。lilist のまま
2 major / 性能 commands/project.py list_projectsdocker compose psThreadPoolExecutor で並列化 (cwd= 完結でスレッド安全)
3 minor / 堅牢性 commands/project.py _resolve_plugin_name/projects/proj 等で /.. を返さず None
4 minor / UX commands/project.py _interactive_select_and_up を誤入力で再入力ループ化

サマリ

  • 対応: 4 件 (major=2, minor=2)
  • deferred: 0 / rejected: 0
  • 回帰テスト: 6 件追加
  • pytest: 402 passed
  • CI: このブランチに登録 checks なし (NONE)
  • commit: 915bc1b

@takemi-ohama 再レビューをお願いします。

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

修正必須の指摘はありません。

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

(Test without comments to verify connectivity)

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

PLAN06 Task 3 の実装(プロジェクト一覧・対話型起動)お疲れ様です。非常に丁寧にテストされており、堅牢な作りになっています。

一点、設計上の懸念として、env ファイルのパース処理において Python 側のフォールバック実装(lib/devbase/commands/container.py_load_project_env)と Shell Wrapper 側の挙動に乖離がある点が気になりました。Shell 側は source するためコメントや変数展開を解釈しますが、Python 側は単純な文字列分割のため、これらが値に含まれてしまう、あるいは意図しない挙動になります。

本 PR で導入された --interactive モードは Python 経由で起動するため、この乖離の影響を受けます。将来的にパース仕様を統一するか、少なくとも制約を明確にドキュメント化することを推奨します。

Comment thread lib/devbase/commands/project.py
Comment thread lib/devbase/cli.py
… 同期テスト

- _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>
@takemi-ohama
Copy link
Copy Markdown
Contributor Author

🤖 cross-review fix | round 2 対応完了

今 round の未対応 inline thread 2 件に対応しました。

# 重要度 (再判定) 箇所 対応
1 major / 正確性 lib/devbase/cli.py:72 TOP_PREFIX_PREFERENCESbin/devbaseresolve_command preference と乖離しないよう、両者の対応表が完全一致することを検証する同期テストを追加 (bash/Python は単一ソース化困難のため)
2 minor / 堅牢性 lib/devbase/commands/project.py:135 _interactive_select_and_upKeyboardInterrupt (Ctrl+C) を捕捉し traceback を出さず中止 (rc=0)

サマリ

  • 対応: 2 件 (major=1, minor=1)
  • deferred: 1 件 / rejected: 0
  • 回帰テスト: 2 件追加 (test_top_prefix_preferences_synced_with_cli / test_cmd_project_list_interactive_keyboard_interrupt_aborts)
  • pytest: 404 passed
  • CI: このブランチに登録 checks なし (NONE)
  • commit: ef3ec7d

deferred

  • gemini round2 review-body (env パース乖離): Python _load_project_env と shell source の env パース仕様乖離の指摘。「制約をドキュメント化する」推奨に対しては、_load_project_env の docstring に既に制約 (単純 KEY=VALUE のみ解釈・変数展開/コマンド置換は意図的に非サポート・安全側) が明記済みのため、本 round では追加変更なし。パース仕様の完全統一は将来課題として deferred。

@takemi-ohama 再レビューをお願いします。

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

PLAN06 Task 3 の実装を詳細に確認しました。project list の一覧表示および --interactive 起動のロジックは堅牢であり、docker compose ps の並列実行による高速化も適切に行われています。

特に bin/devbase (bash) と cli.py (Python) の間での prefix 解決 (特に l -> login の後方互換性) の同期がテストによって保証されている点は、メンテナンス性の観点から非常に高く評価できます。

修正が必要な重大な問題は見当たりませんでした。

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

追加の修正指摘はありません。

…の仕様乖離を明文化

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>
@takemi-ohama
Copy link
Copy Markdown
Contributor Author

deferred nit 対応: _load_project_env と shell source の仕様乖離を明文化

gemini round2 review-body の将来課題推奨(Python _load_project_env と wrapper の source ./env で env パース仕様が乖離し得る)への対応です。完全な仕様統一は影響範囲が大きくリスクがあるため、制約のドキュメント化 + 乖離挙動の回帰テスト固定 を採りました。

変更内容

  • lib/devbase/commands/container.py _load_project_env の docstring に .. note:: を追記。shell source との具体的な乖離ケースを明示:
    • 変数展開 FOO=$BAR → リテラル $BAR
    • コマンド置換 FOO=$(cmd) → リテラル $(cmd)
    • 行中クォート FOO=a"b"c → 除去せず a"b"c
    • インラインコメント FOO=bar # x → 値は bar # x(行頭 # のみコメント扱い)
    • いずれも wrapper を経ない直接起動のフォールバック時のみ影響し、通常の wrapper 経路では差異が生じない旨も明記。
  • tests/cli/test_project_name_resolution.py に上記乖離挙動を pin する回帰テスト test_load_project_env_diverges_from_shell_source を追加。

commit

5b666e0b436d3cb5bf1e6516895a84ca72a271fd

テスト結果

uv run pytest -q405 passed

@takemi-ohama
Copy link
Copy Markdown
Contributor Author

deferred nit 対応報告 — _load_project_env の仕様乖離ドキュメント化

gemini round2 review-body の将来課題推奨(Python _load_project_env と shell source の env パース仕様が乖離し得る → 「仕様統一」または「制約のドキュメント化」を推奨)について対応しました。

対応方針

完全な仕様統一(shell source との一致)は影響範囲が大きくリスクがあるため避け、制約のドキュメント化で対応済みです。

対応内容(commit 5b666e0

  • lib/devbase/commands/container.py_load_project_env docstring に、shell source との具体的な乖離ケースを .. note:: ブロックで明記:
    • FOO=$BAR(変数展開せずリテラル)
    • FOO=$(cmd)(コマンド置換せずリテラル)
    • FOO=a"b"c(行中クォートは除去しない)
    • FOO=bar # x(行頭以外の # はコメント扱いしない)
    • いずれも wrapper を経ない直接起動のフォールバック時のみ影響し、通常運用の wrapper 経路では shell が env を解釈するため差異は生じない旨を明記。
  • 上記乖離挙動を pin する回帰テスト test_load_project_env_diverges_from_shell_source を追加。

確認結果

  • commit SHA: 5b666e0b436d3cb5bf1e6516895a84ca72a271fd(origin/feature/PLAN06-list に push 済み)
  • pytest: 全 405 件 passeduv run pytest

なお本件は inline thread が存在しない review-body 推奨のため、resolveReviewThread は不要です。

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