refactor(bottles): move 'list active' onto DockerBottlePlatform
test / run tests/run_tests.py (pull_request) Successful in 14s

Add list_active() abstract method on BottlePlatform; DockerBottlePlatform
implements it with the existing docker ps logic. cli/list.py no longer
calls docker directly — it just dispatches the active branch to the
platform.
This commit is contained in:
2026-05-10 23:19:22 -04:00
parent 18d29fc23f
commit 47b882f634
3 changed files with 33 additions and 23 deletions
+5
View File
@@ -122,6 +122,11 @@ class BottlePlatform(ABC):
def cleanup(self, plan: BottleCleanupPlan) -> None:
"""Remove everything described by the cleanup plan."""
@abstractmethod
def list_active(self) -> None:
"""Print every currently-running bottle on this platform to
stderr (name + status)."""
# Import concrete platform classes AFTER the base types are defined, so
# each platform module can pull BottleSpec / BottlePlan / BottlePlatform
+25
View File
@@ -527,3 +527,28 @@ class DockerBottlePlatform(BottlePlatform):
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
)
# --- List ---
def list_active(self) -> None:
"""Print all running claude-bottle containers (name + status).
Prints a single-line banner if there are none."""
docker_mod.require_docker()
result = subprocess.run(
[
"docker", "ps",
"--filter", "name=^claude-bottle-",
"--format", "{{.Names}}\t{{.Status}}",
],
capture_output=True,
text=True,
)
containers = (result.stdout or "").strip()
if not containers:
info("no active claude-bottle containers")
return
print()
for line in containers.splitlines():
name, _, status = line.partition("\t")
info(f"container: {name} status: {status}")
print()
+3 -23
View File
@@ -1,12 +1,10 @@
"""list: list available agents or active containers."""
"""list: list available agents or active bottles."""
from __future__ import annotations
import argparse
import subprocess
from .. import docker as docker_mod
from ..log import info
from ..bottles import get_bottle_platform
from ..manifest import Manifest
from ._common import PROG, USER_CWD
@@ -22,23 +20,5 @@ def cmd_list(argv: list[str]) -> int:
print(name)
return 0
docker_mod.require_docker()
result = subprocess.run(
[
"docker", "ps",
"--filter", "name=^claude-bottle-",
"--format", "{{.Names}}\t{{.Status}}",
],
capture_output=True,
text=True,
)
containers = (result.stdout or "").strip()
if not containers:
info("no active claude-bottle containers")
return 0
print()
for line in containers.splitlines():
name, _, status = line.partition("\t")
info(f"container: {name} status: {status}")
print()
get_bottle_platform().list_active()
return 0