|
45 | 45 |
|
46 | 46 | # Subcommand map for prefix resolution: {(aliases...): [subcmds]} |
47 | 47 | SUBCMD_MAP = { |
48 | | - ('project',): ['up', 'down', 'ps', 'login', 'logs', 'scale', 'build'], |
| 48 | + ('project',): ['up', 'down', 'ps', 'login', 'logs', 'scale', 'build', 'list'], |
49 | 49 | ('container', 'ct'): ['up', 'down', 'ps', 'login', 'logs', 'scale', 'build'], |
50 | 50 | ('env',): ['init', 'sync', 'list', 'set', 'get', 'delete', 'edit', 'project', 'export', 'import'], |
51 | 51 | ('plugin', 'pl'): ['list', 'install', 'uninstall', 'update', 'info', 'sync', 'repo', 'migrate'], |
@@ -167,6 +167,20 @@ def _add_project_parser(subparsers): |
167 | 167 |
|
168 | 168 | _add_build_subparser(pj_sub) |
169 | 169 |
|
| 170 | + # `list` は lifecycle ではなく一覧表示 (commands/project.py)。name positional は |
| 171 | + # 取らない (wrapper の _PROJECT_NAME_SUBCOMMANDS にも含めない)。 |
| 172 | + _add_list_subparser(pj_sub) |
| 173 | + |
| 174 | + |
| 175 | +def _add_list_subparser(sub): |
| 176 | + """`list` サブコマンドを登録する (project list / top-level list 共通)。 |
| 177 | +
|
| 178 | + NAME / PLUGIN / STATUS の一覧表示。`--interactive` で選択 → `project up` 起動。 |
| 179 | + """ |
| 180 | + p = sub.add_parser('list', help='List projects (NAME / PLUGIN / STATUS)') |
| 181 | + p.add_argument('--interactive', '-i', action='store_true', |
| 182 | + help='Select a project interactively and start it') |
| 183 | + |
170 | 184 |
|
171 | 185 | def _add_env_parser(subparsers): |
172 | 186 | """Env group parser""" |
@@ -396,6 +410,11 @@ def _add_shortcuts(subparsers): |
396 | 410 | scale_sc.add_argument('name', nargs='?', default=None, help='Project name') |
397 | 411 | scale_sc.add_argument('new_scale', type=int, help='New number of containers') |
398 | 412 |
|
| 413 | + # `list` は `project list` のトップレベルシノニム。lifecycle ではなく一覧表示 |
| 414 | + # のため SHORTCUTS (project lifecycle へ写像) ではなく _dispatch で個別に |
| 415 | + # cmd_project_list へ振り分ける。 |
| 416 | + _add_list_subparser(subparsers) |
| 417 | + |
399 | 418 |
|
400 | 419 | def _create_parser(): |
401 | 420 | """Create command line parser""" |
@@ -477,7 +496,7 @@ def _expand_argv(): |
477 | 496 | # bin/devbase が build を shell 実装に委譲するため Python 側には top-level |
478 | 497 | # build parser が無い。project build / container build は引き続き利用可能。 |
479 | 498 | commands = ['init', 'status', 'shell-rc', 'project', 'container', 'ct', 'env', 'plugin', 'pl', |
480 | | - 'snapshot', 'ss', 'up', 'down', 'login', 'ps', 'scale', 'help'] |
| 499 | + 'snapshot', 'ss', 'up', 'down', 'login', 'ps', 'scale', 'list', 'help'] |
481 | 500 | repo_subcmds = ['add', 'remove', 'list', 'refresh'] |
482 | 501 |
|
483 | 502 | if len(sys.argv) >= 2 and not sys.argv[1].startswith('-'): |
@@ -533,9 +552,20 @@ def _dispatch(cmd, args): |
533 | 552 |
|
534 | 553 | # --- Project group (推奨) --- |
535 | 554 | if cmd == 'project': |
| 555 | + # `project list` は lifecycle ではなく一覧表示 (DEVBASE_ROOT 必須)。 |
| 556 | + if getattr(args, 'subcommand', None) == 'list': |
| 557 | + devbase_root = _require_devbase_root() |
| 558 | + from devbase.commands.project import cmd_project_list |
| 559 | + return cmd_project_list(devbase_root, args) |
536 | 560 | from devbase.commands.container import cmd_project |
537 | 561 | return cmd_project(args) |
538 | 562 |
|
| 563 | + # --- Top-level `list` synonym for `project list` --- |
| 564 | + if cmd == 'list': |
| 565 | + devbase_root = _require_devbase_root() |
| 566 | + from devbase.commands.project import cmd_project_list |
| 567 | + return cmd_project_list(devbase_root, args) |
| 568 | + |
539 | 569 | # --- Container group (非推奨: project へ委譲 + warning) --- |
540 | 570 | if cmd == 'container': |
541 | 571 | from devbase.commands.container import cmd_container |
|
0 commit comments