feat: PLAN06-3 project list 一覧表示 + --interactive 選択起動#36
Conversation
`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>
f90c991 to
918249e
Compare
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | gemini | REQUEST_CHANGES
project list (および list シノニム) の実装、および status モジュールのリファクタリングを確認しました。概ね良好ですが、プロジェクト数が多い環境でのパフォーマンスに懸念があります。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | codex | REQUEST_CHANGES
トップレベル prefix 解決の後方互換を戻してください。詳細は inline の 1 件です。
- [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>
🤖 cross-review fix | round 1 対応完了レビュー指摘 4 件すべてに対応しました (deferred / rejected なし)。
サマリ
@takemi-ohama 再レビューをお願いします。 |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | codex | APPROVE
修正必須の指摘はありません。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | gemini | REQUEST_CHANGES
(Test without comments to verify connectivity)
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 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 経由で起動するため、この乖離の影響を受けます。将来的にパース仕様を統一するか、少なくとも制約を明確にドキュメント化することを推奨します。
… 同期テスト - _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>
🤖 cross-review fix | round 2 対応完了今 round の未対応 inline thread 2 件に対応しました。
サマリ
deferred
@takemi-ohama 再レビューをお願いします。 |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 3 | gemini | APPROVE
PLAN06 Task 3 の実装を詳細に確認しました。project list の一覧表示および --interactive 起動のロジックは堅牢であり、docker compose ps の並列実行による高速化も適切に行われています。
特に bin/devbase (bash) と cli.py (Python) の間での prefix 解決 (特に l -> login の後方互換性) の同期がテストによって保証されている点は、メンテナンス性の観点から非常に高く評価できます。
修正が必要な重大な問題は見当たりませんでした。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 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>
deferred nit 対応:
|
deferred nit 対応報告 —
|
Summary
project list一覧表示 +--interactive選択起動$DEVBASE_ROOT/projects/配下を NAME / PLUGIN / STATUS で一覧表示するdevbase project list/ トップレベルシノニムdevbase listを新設。変更点
_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)。_container_status_forを抽出し共有 (
cmd_statusの挙動は不変)。project list(--interactive/-i) + トップレベルlistシノニム。SUBCMD_MAP /
_expand_argv/ dispatch にlistを同期 (DEVBASE_ROOT 必須)。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_container_status_for/_get_container_status)list/project listが Python へルーティング