From e20f8af05ad1515ee429670062d079df4f5844e9 Mon Sep 17 00:00:00 2001 From: didericis Date: Sun, 10 May 2026 23:25:42 -0400 Subject: [PATCH] refactor(bottles): make docker a package; absorb top-level docker.py - claude_bottle/bottles/docker.py -> claude_bottle/bottles/docker/__init__.py - claude_bottle/docker.py -> claude_bottle/bottles/docker/util.py The host-side Docker primitives (require_docker, slugify, image_exists, container_exists, build_image, build_image_with_cwd) lived at the top of the package as if cross-cutting, but they are Docker-specific. Moving them into bottles/docker/util.py colocates them with the platform that uses them and clears the top-level namespace. Imports in bottles/docker/__init__.py shift to `from . import util as docker_mod` so the existing call sites (`docker_mod.require_docker()`, etc.) keep working unchanged. --- .../bottles/{docker.py => docker/__init__.py} | 18 +++++++++--------- .../{docker.py => bottles/docker/util.py} | 6 ++++-- 2 files changed, 13 insertions(+), 11 deletions(-) rename claude_bottle/bottles/{docker.py => docker/__init__.py} (98%) rename claude_bottle/{docker.py => bottles/docker/util.py} (93%) diff --git a/claude_bottle/bottles/docker.py b/claude_bottle/bottles/docker/__init__.py similarity index 98% rename from claude_bottle/bottles/docker.py rename to claude_bottle/bottles/docker/__init__.py index f08af61..c9470c9 100644 --- a/claude_bottle/bottles/docker.py +++ b/claude_bottle/bottles/docker/__init__.py @@ -27,18 +27,18 @@ from dataclasses import dataclass from pathlib import Path from typing import Iterator -from .. import docker as docker_mod -from .. import network as network_mod -from .. import pipelock -from .. import skills as skills_mod -from .. import ssh as ssh_mod -from ..env_resolve import env_resolve -from ..log import die, info -from . import BottleCleanupPlan, BottlePlan, BottlePlatform, BottleSpec +from ... import network as network_mod +from ... import pipelock +from ... import skills as skills_mod +from ... import ssh as ssh_mod +from ...env_resolve import env_resolve +from ...log import die, info +from .. import BottleCleanupPlan, BottlePlan, BottlePlatform, BottleSpec +from . import util as docker_mod # Where the repo root lives, for `docker build` context. Computed once. -_REPO_DIR = str(Path(__file__).resolve().parent.parent.parent) +_REPO_DIR = str(Path(__file__).resolve().parent.parent.parent.parent) # --- Runtime detection ----------------------------------------------------- diff --git a/claude_bottle/docker.py b/claude_bottle/bottles/docker/util.py similarity index 93% rename from claude_bottle/docker.py rename to claude_bottle/bottles/docker/util.py index 80304ec..1573a79 100644 --- a/claude_bottle/docker.py +++ b/claude_bottle/bottles/docker/util.py @@ -1,4 +1,6 @@ -"""Docker helpers. Build/inspect primitives shared by the CLI.""" +"""Docker host-side primitives used by DockerBottlePlatform: probing +for docker on PATH, slugifying agent names, checking image/container +existence, and building images.""" from __future__ import annotations @@ -7,7 +9,7 @@ import shutil import subprocess from typing import Iterable -from .log import die, info +from ...log import die, info def require_docker() -> None: