dev-bubble 0.6.9__tar.gz → 0.6.17__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/.claude/CLAUDE.md +2 -0
  2. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/CHANGELOG.md +46 -0
  3. {dev_bubble-0.6.9/dev_bubble.egg-info → dev_bubble-0.6.17}/PKG-INFO +1 -1
  4. dev_bubble-0.6.17/SPEC.md +1202 -0
  5. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/__init__.py +1 -1
  6. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/cli.py +56 -18
  7. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/cloud.py +10 -10
  8. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/commands/images.py +54 -3
  9. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/commands/settings.py +6 -6
  10. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/config.py +117 -130
  11. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/container_helpers.py +15 -3
  12. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/finalization.py +1 -0
  13. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/image_management.py +15 -6
  14. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/images/builder.py +47 -8
  15. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/images/scripts/cloud-init.sh +20 -3
  16. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/images/scripts/tools/elan.sh +5 -2
  17. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/images/scripts/tools/vscode.sh +100 -0
  18. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/lifecycle.py +3 -0
  19. dev_bubble-0.6.17/bubble/notices.py +33 -0
  20. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/relay.py +7 -7
  21. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/remote.py +10 -0
  22. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/runtime/base.py +11 -2
  23. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/runtime/incus.py +9 -7
  24. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/security.py +5 -3
  25. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/setup.py +99 -64
  26. {dev_bubble-0.6.9 → dev_bubble-0.6.17/dev_bubble.egg-info}/PKG-INFO +1 -1
  27. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/dev_bubble.egg-info/SOURCES.txt +4 -0
  28. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/pyproject.toml +4 -0
  29. dev_bubble-0.6.17/tests/test_branch_no_target.py +136 -0
  30. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/tests/test_claude_projects_symlink.py +62 -5
  31. dev_bubble-0.6.17/tests/test_cloud.py +396 -0
  32. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/tests/test_config.py +16 -16
  33. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/tests/test_lifecycle.py +12 -0
  34. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/tests/test_mounts.py +47 -47
  35. dev_bubble-0.6.17/tests/test_notices.py +51 -0
  36. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/tests/test_remote.py +26 -0
  37. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/tests/test_security.py +8 -9
  38. dev_bubble-0.6.9/tests/test_cloud.py +0 -202
  39. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/.github/workflows/ci.yml +0 -0
  40. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/.github/workflows/publish.yml +0 -0
  41. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/.gitignore +0 -0
  42. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/LICENSE +0 -0
  43. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/README.md +0 -0
  44. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/__main__.py +0 -0
  45. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/auth_proxy.py +0 -0
  46. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/automation.py +0 -0
  47. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/claude.py +0 -0
  48. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/clean.py +0 -0
  49. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/clone.py +0 -0
  50. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/cloud_types.py +0 -0
  51. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/commands/__init__.py +0 -0
  52. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/commands/cloud_cmd.py +0 -0
  53. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/commands/doctor.py +0 -0
  54. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/commands/infrastructure.py +0 -0
  55. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/commands/lifecycle.py +0 -0
  56. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/commands/list_cmd.py +0 -0
  57. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/commands/relay_cmd.py +0 -0
  58. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/commands/remote_cmd.py +0 -0
  59. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/commands/security_cmd.py +0 -0
  60. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/data/skill.md +0 -0
  61. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/default_repos.json +0 -0
  62. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/git_store.py +0 -0
  63. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/github_token.py +0 -0
  64. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/hooks/__init__.py +0 -0
  65. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/hooks/lean.py +0 -0
  66. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/hooks/python.py +0 -0
  67. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/images/__init__.py +0 -0
  68. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/images/scripts/base.sh +0 -0
  69. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/images/scripts/lean-toolchain.sh +0 -0
  70. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/images/scripts/lean.sh +0 -0
  71. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/images/scripts/python.sh +0 -0
  72. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/images/scripts/tools/claude.sh +0 -0
  73. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/images/scripts/tools/codex.sh +0 -0
  74. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/images/scripts/tools/emacs.sh +0 -0
  75. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/images/scripts/tools/neovim.sh +0 -0
  76. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/images/scripts/tools/pins.json +0 -0
  77. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/naming.py +0 -0
  78. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/native.py +0 -0
  79. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/network.py +0 -0
  80. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/provisioning.py +0 -0
  81. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/repo_registry.py +0 -0
  82. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/runtime/__init__.py +0 -0
  83. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/runtime/colima.py +0 -0
  84. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/skill.py +0 -0
  85. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/target.py +0 -0
  86. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/tools.py +0 -0
  87. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/tunnel.py +0 -0
  88. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/bubble/vscode.py +0 -0
  89. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/config/com.bubble.git-update.plist +0 -0
  90. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/config/com.bubble.image-refresh.plist +0 -0
  91. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/config/com.bubble.relay-daemon.plist +0 -0
  92. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/conftest.py +0 -0
  93. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/dev_bubble.egg-info/dependency_links.txt +0 -0
  94. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/dev_bubble.egg-info/entry_points.txt +0 -0
  95. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/dev_bubble.egg-info/requires.txt +0 -0
  96. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/dev_bubble.egg-info/top_level.txt +0 -0
  97. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/setup.cfg +0 -0
  98. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/tests/conftest.py +0 -0
  99. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/tests/test_auth_proxy.py +0 -0
  100. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/tests/test_build_lock.py +0 -0
  101. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/tests/test_claude.py +0 -0
  102. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/tests/test_customize.py +0 -0
  103. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/tests/test_editor.py +0 -0
  104. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/tests/test_git_store.py +0 -0
  105. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/tests/test_github_token.py +0 -0
  106. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/tests/test_hooks.py +0 -0
  107. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/tests/test_integration.py +0 -0
  108. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/tests/test_list_remote.py +0 -0
  109. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/tests/test_multi_target.py +0 -0
  110. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/tests/test_naming.py +0 -0
  111. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/tests/test_native.py +0 -0
  112. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/tests/test_network.py +0 -0
  113. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/tests/test_relay.py +0 -0
  114. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/tests/test_repo_registry.py +0 -0
  115. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/tests/test_skill.py +0 -0
  116. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/tests/test_target.py +0 -0
  117. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/tests/test_tools.py +0 -0
  118. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/tests/test_tunnel.py +0 -0
  119. {dev_bubble-0.6.9 → dev_bubble-0.6.17}/tests/test_vscode.py +0 -0
@@ -155,6 +155,8 @@ Before committing, run `uv run ruff check --fix . && uv run ruff format .` to en
155
155
 
156
156
  Always use `uv run pytest` to run tests (not bare `pytest` or `python3 -m pytest`).
157
157
 
158
+ **NEVER run `uv pip install -e .` in a worktree.** The `VIRTUAL_ENV` environment variable may point to the main worktree's venv (`~/projects/bubble/.venv`), so `uv pip install` will corrupt it by installing an editable pointing to the wrong directory. Use `uv run` instead — it creates a per-directory `.venv` automatically and ignores mismatched `VIRTUAL_ENV`.
159
+
158
160
  ## How to Add a New Command
159
161
 
160
162
  1. Add a `@main.command()` function in `cli.py`
@@ -1,5 +1,51 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.6.17 — 2026-03-12
4
+ - Use `action.wait_until_finished()` instead of `time.sleep(3)` after `power_on()` in cloud server start (#156)
5
+ - Ensures Hetzner confirms the server is running before fetching IP, preventing stale IP on reassignment
6
+ - Extracted shared `_power_on_and_wait()` helper used by both `start_server()` and `get_cloud_remote_host()`
7
+
8
+ ## 0.6.16 — 2026-03-12
9
+ - Standardize error handling across the codebase (#155)
10
+ - `IncusRuntime.exec()` now raises `IncusError` (a `RuntimeError` subclass) instead of bare `RuntimeError`, matching `_run()`
11
+ - Document `ContainerRuntime` exception contract in `base.py`
12
+ - Wrap bare `check=True` subprocess calls in `setup.py` with try/except for friendly error messages
13
+ - Narrow broad `except Exception` catches in `relay.py` to specific types (`OSError`, `subprocess.SubprocessError`, etc.)
14
+
15
+ ## 0.6.15
16
+
17
+ - Store `project_dir` in registry at creation time instead of guessing via `ls` at reattach (#131)
18
+ - `detect_project_dir` now looks up the registry first, falling back to the `ls` heuristic for pre-existing bubbles
19
+
20
+ ## 0.6.14 — 2026-03-12
21
+ - Fix `symlink-claude-projects`: abort on file conflicts instead of deleting skipped files (#118)
22
+ - Merge now tracks skipped files and aborts if any conflicts remain, preventing data loss
23
+ - Softened messaging from "replace" to "link" to better reflect non-destructive behavior
24
+
25
+ ## 0.6.13 — 2026-03-12
26
+ - Install Claude Code VS Code extension (`anthropic.claude-code`) when both `claude` and `vscode` tools are enabled (#116)
27
+
28
+ ## 0.6.12 — 2026-03-12
29
+ - Fix cloud idle auto-shutdown not working (#12)
30
+ - Fix SSH detection: `dport` (peer port) → `sport` (local port) so incoming connections are detected
31
+ - Fix `ss` header line causing `grep` to always match even with zero connections (add `-H` flag)
32
+ - Use `poweroff` instead of `shutdown -h` for reliable ACPI power-off signal to Hetzner hypervisor
33
+ - Add `/var/log/bubble-idle.log` for debugging idle check behavior
34
+
35
+ ## 0.6.11 — 2026-03-12
36
+ - Forward `--claude-credentials` and `--codex-credentials` flags to remote/cloud bubbles (#106)
37
+ - Fix VS Code server not being pre-baked into container images
38
+ - `build_image()` returned early when the image already existed, so rebuild triggers (tools hash change, VS Code commit drift, customize script change) never actually rebuilt
39
+ - Added `--force` flag to `bubble images build` and `force` parameter to `build_image()` for rebuild paths
40
+ - Fixed wrong lock name (`"base-vscode"` → `"base"`) in VS Code commit drift detection
41
+ - Fixed `exit 0` in `elan.sh` that could terminate the entire combined tool script
42
+
43
+ ## 0.6.10 — 2026-03-12
44
+ - Support `bubble -b branch_name` without explicit target (#99)
45
+ - Infers owner/repo from current directory's git remote when `-b` is used without a target
46
+ - `bubble -b my_branch` now works like `bubble -b my_branch owner/repo`
47
+ - `bubble -b my_branch --base some_branch` also works without an explicit target
48
+
3
49
  ## 0.6.9 — 2026-03-12
4
50
  - Make relay default to on in auto mode (#102)
5
51
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dev-bubble
3
- Version: 0.6.9
3
+ Version: 0.6.17
4
4
  Summary: Containerized development environments powered by Incus
5
5
  Author-email: Kim Morrison <kim@tqft.net>
6
6
  License-Expression: Apache-2.0