dev-bubble 0.7.5__tar.gz → 0.7.6__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 (131) hide show
  1. {dev_bubble-0.7.5/dev_bubble.egg-info → dev_bubble-0.7.6}/PKG-INFO +1 -1
  2. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/__init__.py +1 -1
  3. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/images/scripts/tools/gh.sh +10 -0
  4. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/images/scripts/tools/vscode.sh +44 -10
  5. {dev_bubble-0.7.5 → dev_bubble-0.7.6/dev_bubble.egg-info}/PKG-INFO +1 -1
  6. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/.claude/CLAUDE.md +0 -0
  7. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/.github/workflows/ci.yml +0 -0
  8. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/.github/workflows/publish.yml +0 -0
  9. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/.gitignore +0 -0
  10. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/CHANGELOG.md +0 -0
  11. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/LICENSE +0 -0
  12. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/README.md +0 -0
  13. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/SPEC.md +0 -0
  14. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/__main__.py +0 -0
  15. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/auth_proxy.py +0 -0
  16. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/automation.py +0 -0
  17. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/claude.py +0 -0
  18. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/clean.py +0 -0
  19. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/cli.py +0 -0
  20. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/clone.py +0 -0
  21. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/cloud.py +0 -0
  22. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/cloud_types.py +0 -0
  23. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/commands/__init__.py +0 -0
  24. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/commands/cloud_cmd.py +0 -0
  25. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/commands/completion.py +0 -0
  26. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/commands/doctor.py +0 -0
  27. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/commands/images.py +0 -0
  28. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/commands/infrastructure.py +0 -0
  29. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/commands/lifecycle.py +0 -0
  30. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/commands/list_cmd.py +0 -0
  31. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/commands/relay_cmd.py +0 -0
  32. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/commands/remote_cmd.py +0 -0
  33. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/commands/security_cmd.py +0 -0
  34. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/commands/settings.py +0 -0
  35. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/commands/status_cmd.py +0 -0
  36. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/config.py +0 -0
  37. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/container_helpers.py +0 -0
  38. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/data/skill.md +0 -0
  39. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/default_repos.json +0 -0
  40. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/finalization.py +0 -0
  41. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/git_store.py +0 -0
  42. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/github_token.py +0 -0
  43. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/graphql_validator.py +0 -0
  44. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/hooks/__init__.py +0 -0
  45. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/hooks/lean.py +0 -0
  46. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/hooks/python.py +0 -0
  47. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/image_management.py +0 -0
  48. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/images/__init__.py +0 -0
  49. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/images/builder.py +0 -0
  50. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/images/scripts/base.sh +0 -0
  51. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/images/scripts/cloud-init.sh +0 -0
  52. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/images/scripts/lean-toolchain.sh +0 -0
  53. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/images/scripts/lean.sh +0 -0
  54. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/images/scripts/python.sh +0 -0
  55. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/images/scripts/tools/claude.sh +0 -0
  56. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/images/scripts/tools/codex.sh +0 -0
  57. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/images/scripts/tools/elan.sh +0 -0
  58. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/images/scripts/tools/emacs.sh +0 -0
  59. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/images/scripts/tools/neovim.sh +0 -0
  60. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/images/scripts/tools/pins.json +0 -0
  61. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/lean.py +0 -0
  62. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/lifecycle.py +0 -0
  63. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/naming.py +0 -0
  64. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/native.py +0 -0
  65. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/network.py +0 -0
  66. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/notices.py +0 -0
  67. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/output.py +0 -0
  68. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/provisioning.py +0 -0
  69. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/relay.py +0 -0
  70. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/remote.py +0 -0
  71. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/repo_registry.py +0 -0
  72. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/runtime/__init__.py +0 -0
  73. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/runtime/base.py +0 -0
  74. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/runtime/colima.py +0 -0
  75. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/runtime/incus.py +0 -0
  76. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/security.py +0 -0
  77. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/setup.py +0 -0
  78. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/skill.py +0 -0
  79. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/spinner.py +0 -0
  80. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/target.py +0 -0
  81. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/token_store.py +0 -0
  82. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/tools.py +0 -0
  83. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/tunnel.py +0 -0
  84. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/bubble/vscode.py +0 -0
  85. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/config/com.bubble.git-update.plist +0 -0
  86. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/config/com.bubble.image-refresh.plist +0 -0
  87. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/config/com.bubble.relay-daemon.plist +0 -0
  88. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/conftest.py +0 -0
  89. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/dev_bubble.egg-info/SOURCES.txt +0 -0
  90. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/dev_bubble.egg-info/dependency_links.txt +0 -0
  91. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/dev_bubble.egg-info/entry_points.txt +0 -0
  92. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/dev_bubble.egg-info/requires.txt +0 -0
  93. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/dev_bubble.egg-info/top_level.txt +0 -0
  94. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/pyproject.toml +0 -0
  95. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/setup.cfg +0 -0
  96. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/conftest.py +0 -0
  97. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_auth_proxy.py +0 -0
  98. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_branch_no_target.py +0 -0
  99. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_build_lock.py +0 -0
  100. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_claude.py +0 -0
  101. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_claude_projects_symlink.py +0 -0
  102. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_cloud.py +0 -0
  103. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_completion.py +0 -0
  104. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_config.py +0 -0
  105. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_customize.py +0 -0
  106. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_editor.py +0 -0
  107. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_git_store.py +0 -0
  108. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_github_token.py +0 -0
  109. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_graphql_validator.py +0 -0
  110. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_hooks.py +0 -0
  111. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_integration.py +0 -0
  112. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_lifecycle.py +0 -0
  113. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_list_columns.py +0 -0
  114. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_list_remote.py +0 -0
  115. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_mounts.py +0 -0
  116. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_multi_target.py +0 -0
  117. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_naming.py +0 -0
  118. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_native.py +0 -0
  119. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_network.py +0 -0
  120. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_notices.py +0 -0
  121. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_relay.py +0 -0
  122. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_remote.py +0 -0
  123. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_repo_registry.py +0 -0
  124. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_security.py +0 -0
  125. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_skill.py +0 -0
  126. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_spinner.py +0 -0
  127. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_status.py +0 -0
  128. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_target.py +0 -0
  129. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_tools.py +0 -0
  130. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_tunnel.py +0 -0
  131. {dev_bubble-0.7.5 → dev_bubble-0.7.6}/tests/test_vscode.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dev-bubble
3
- Version: 0.7.5
3
+ Version: 0.7.6
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
@@ -1,3 +1,3 @@
1
1
  """bubble: Containerized development environments."""
2
2
 
3
- __version__ = "0.7.5"
3
+ __version__ = "0.7.6"
@@ -31,4 +31,14 @@ http_unix_socket: /bubble/gh-proxy.sock
31
31
  GHCONF
32
32
  chown 1001:1001 /etc/bubble/gh/config.yml
33
33
 
34
+ # Tell gh that github.com is a known host. Without this, overriding
35
+ # GH_CONFIG_DIR wipes the default host list and gh can't resolve repos
36
+ # from git remotes ("none of the git remotes ... point to a known GitHub
37
+ # host"). GH_TOKEN handles auth; this just registers the host.
38
+ cat > /etc/bubble/gh/hosts.yml <<'GHHOSTS'
39
+ github.com:
40
+ git_protocol: https
41
+ GHHOSTS
42
+ chown 1001:1001 /etc/bubble/gh/hosts.yml
43
+
34
44
  echo "gh installed: $(gh --version 2>/dev/null | head -1 || echo 'unknown version')"
@@ -28,12 +28,19 @@ import json, urllib.request, os, sys, subprocess, tempfile, glob, shutil
28
28
  EXTENSIONS_DIR = "/home/user/.vscode-server/extensions"
29
29
  EXTENSIONS = ["leanprover.lean4", "tamasfe.even-better-toml"]
30
30
 
31
+ # Determine VS Code target platform from container architecture
32
+ _arch = subprocess.check_output(["dpkg", "--print-architecture"]).decode().strip()
33
+ TARGET_PLATFORM = {"amd64": "linux-x64", "arm64": "linux-arm64"}.get(_arch, "")
34
+
31
35
  manifest_entries = []
32
36
 
33
37
  for ext_id in EXTENSIONS:
34
38
  # Query marketplace for the latest VSIX download URL
39
+ criteria = [{"filterType": 7, "value": ext_id}]
40
+ if TARGET_PLATFORM:
41
+ criteria.append({"filterType": 8, "value": TARGET_PLATFORM})
35
42
  query = json.dumps({
36
- "filters": [{"criteria": [{"filterType": 7, "value": ext_id}]}],
43
+ "filters": [{"criteria": criteria}],
37
44
  "flags": 914,
38
45
  }).encode()
39
46
  req = urllib.request.Request(
@@ -51,13 +58,23 @@ for ext_id in EXTENSIONS:
51
58
  print(f"Warning: could not query marketplace for {ext_id}: {e}", file=sys.stderr)
52
59
  continue
53
60
 
54
- # Find the VSIX URL and version
61
+ # Find the VSIX URL and version, preferring our target platform
55
62
  vsix_url = None
56
63
  version = None
57
64
  for ext in data["results"][0]["extensions"]:
58
- for ver in ext["versions"][:1]:
59
- version = ver["version"]
60
- for f in ver["files"]:
65
+ best_ver = None
66
+ for ver in ext["versions"]:
67
+ tp = ver.get("targetPlatform", "")
68
+ if tp == TARGET_PLATFORM:
69
+ best_ver = ver
70
+ break
71
+ if best_ver is None and (not tp or tp == "universal"):
72
+ best_ver = ver
73
+ if best_ver is None and ext.get("versions"):
74
+ best_ver = ext["versions"][0]
75
+ if best_ver:
76
+ version = best_ver["version"]
77
+ for f in best_ver["files"]:
61
78
  if f["assetType"] == "Microsoft.VisualStudio.Services.VSIXPackage":
62
79
  vsix_url = f["source"]
63
80
  break
@@ -194,9 +211,16 @@ import json, urllib.request, os, sys, subprocess, tempfile, glob, shutil
194
211
  EXTENSIONS_DIR = "/home/user/.vscode-server/extensions"
195
212
  EXT_ID = "anthropic.claude-code"
196
213
 
214
+ # Determine VS Code target platform from container architecture
215
+ _arch = subprocess.check_output(["dpkg", "--print-architecture"]).decode().strip()
216
+ TARGET_PLATFORM = {"amd64": "linux-x64", "arm64": "linux-arm64"}.get(_arch, "")
217
+
197
218
  # Query marketplace for the latest VSIX download URL
219
+ criteria = [{"filterType": 7, "value": EXT_ID}]
220
+ if TARGET_PLATFORM:
221
+ criteria.append({"filterType": 8, "value": TARGET_PLATFORM})
198
222
  query = json.dumps({
199
- "filters": [{"criteria": [{"filterType": 7, "value": EXT_ID}]}],
223
+ "filters": [{"criteria": criteria}],
200
224
  "flags": 914,
201
225
  }).encode()
202
226
  req = urllib.request.Request(
@@ -214,13 +238,23 @@ except Exception as e:
214
238
  print(f"Warning: could not query marketplace for {EXT_ID}: {e}", file=sys.stderr)
215
239
  sys.exit(0)
216
240
 
217
- # Find the VSIX URL and version
241
+ # Find the VSIX URL and version, preferring our target platform
218
242
  vsix_url = None
219
243
  version = None
220
244
  for ext in data["results"][0]["extensions"]:
221
- for ver in ext["versions"][:1]:
222
- version = ver["version"]
223
- for f in ver["files"]:
245
+ best_ver = None
246
+ for ver in ext["versions"]:
247
+ tp = ver.get("targetPlatform", "")
248
+ if tp == TARGET_PLATFORM:
249
+ best_ver = ver
250
+ break
251
+ if best_ver is None and (not tp or tp == "universal"):
252
+ best_ver = ver
253
+ if best_ver is None and ext.get("versions"):
254
+ best_ver = ext["versions"][0]
255
+ if best_ver:
256
+ version = best_ver["version"]
257
+ for f in best_ver["files"]:
224
258
  if f["assetType"] == "Microsoft.VisualStudio.Services.VSIXPackage":
225
259
  vsix_url = f["source"]
226
260
  break
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dev-bubble
3
- Version: 0.7.5
3
+ Version: 0.7.6
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
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes