feat: add quick install script and packaging (#197)
tracker-policy-pr / check-pr (pull_request) Successful in 7s
test / integration-docker (pull_request) Successful in 13s
test / unit (pull_request) Successful in 37s
lint / lint (push) Successful in 2m37s
test / coverage (pull_request) Has been skipped
test / publish-infra (pull_request) Has been skipped
test / integration-firecracker (pull_request) Failing after 2m39s

Give bot-bottle a real distribution path so new users can install
without cloning the repo:

- pyproject.toml: full project metadata, a `bot-bottle` console-script
  entry point (bot_bottle.cli:main), and package-data for the runtime
  assets (Dockerfiles, egress entrypoint, netpool defaults, macos init).
  Still zero runtime pip dependencies.
- install.sh: POSIX, sudo-free, idempotent bootstrapper — checks Python
  >= 3.11, creates ~/.bot-bottle/{agents,bottles,contrib}, installs via
  pipx (pip --user fallback), then runs `bot-bottle doctor`.
- `bot-bottle doctor`: new store-free subcommand reporting Python
  version, backend availability (reuses is_backend_available rather than
  hardcoding Docker), and config-dir presence. Exits non-zero when a hard
  prerequisite is unmet.
- PRD prd-new-install-script and unit tests for doctor, the packaging
  contract, and the install script.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-25 23:16:50 +00:00
parent a68ee778f1
commit 9b7df6e453
8 changed files with 502 additions and 3 deletions
+5 -2
View File
@@ -1,6 +1,6 @@
"""Main CLI dispatcher.
Commands: active, backend, cleanup, commit, edit, init, list, resume, start, supervise
Commands: active, backend, cleanup, commit, doctor, edit, init, list, resume, start, supervise
"""
from __future__ import annotations
@@ -17,6 +17,7 @@ from .active import cmd_active
from .backend import cmd_backend
from .cleanup import cmd_cleanup
from .commit import cmd_commit
from .doctor import cmd_doctor
from .edit import cmd_edit
from .init import cmd_init
from .login import cmd_login
@@ -31,6 +32,7 @@ COMMANDS = {
"backend": cmd_backend,
"cleanup": cmd_cleanup,
"commit": cmd_commit,
"doctor": cmd_doctor,
"edit": cmd_edit,
"init": cmd_init,
"list": cmd_list,
@@ -45,7 +47,7 @@ COMMANDS = {
# the host (TAP pool, /dev/kvm, firecracker) and never opens the store, so
# gating it on the schema breaks preflight on a fresh CI runner where stdin
# isn't a TTY and the migration prompt can't be answered.
NO_MIGRATION_COMMANDS = frozenset({"backend", "login"})
NO_MIGRATION_COMMANDS = frozenset({"backend", "doctor", "login"})
def usage() -> None:
@@ -55,6 +57,7 @@ def usage() -> None:
sys.stderr.write(" backend set up / check / undo a backend's host prerequisites (setup|status|teardown)\n")
sys.stderr.write(" cleanup stop and remove all active bot-bottle containers\n")
sys.stderr.write(" commit snapshot a running bottle's container state to a Docker image\n")
sys.stderr.write(" doctor check host prerequisites (Python, backend, config dir)\n")
sys.stderr.write(" edit open an agent in vim for editing\n")
sys.stderr.write(" init interactively create a new agent and add it to bot-bottle.json\n")
sys.stderr.write(" list list available agents from bot-bottle.json\n")