jailbee 1.0.0rc1__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 (93) hide show
  1. jailbee-1.0.0rc1/.gitignore +33 -0
  2. jailbee-1.0.0rc1/CHANGELOG.md +283 -0
  3. jailbee-1.0.0rc1/LICENSE +674 -0
  4. jailbee-1.0.0rc1/PKG-INFO +178 -0
  5. jailbee-1.0.0rc1/README.md +147 -0
  6. jailbee-1.0.0rc1/docs/skills/jailbee-repo-setup/SKILL.md +309 -0
  7. jailbee-1.0.0rc1/docs/skills/jailbee-repo-setup/references/config-schema.md +626 -0
  8. jailbee-1.0.0rc1/docs/skills/jailbee-usage/SKILL.md +463 -0
  9. jailbee-1.0.0rc1/docs/skills/jailbee-usage/references/commands.md +483 -0
  10. jailbee-1.0.0rc1/pyproject.toml +87 -0
  11. jailbee-1.0.0rc1/src/jailbee/__init__.py +12 -0
  12. jailbee-1.0.0rc1/src/jailbee/__main__.py +8 -0
  13. jailbee-1.0.0rc1/src/jailbee/apply.py +400 -0
  14. jailbee-1.0.0rc1/src/jailbee/autostart.py +324 -0
  15. jailbee-1.0.0rc1/src/jailbee/background.py +299 -0
  16. jailbee-1.0.0rc1/src/jailbee/branch_config.py +425 -0
  17. jailbee-1.0.0rc1/src/jailbee/chrome_pool.py +336 -0
  18. jailbee-1.0.0rc1/src/jailbee/claude_skills.py +63 -0
  19. jailbee-1.0.0rc1/src/jailbee/cli.py +6170 -0
  20. jailbee-1.0.0rc1/src/jailbee/completion.py +268 -0
  21. jailbee-1.0.0rc1/src/jailbee/config.py +2146 -0
  22. jailbee-1.0.0rc1/src/jailbee/config_init.py +357 -0
  23. jailbee-1.0.0rc1/src/jailbee/dashboard.py +740 -0
  24. jailbee-1.0.0rc1/src/jailbee/db/__init__.py +130 -0
  25. jailbee-1.0.0rc1/src/jailbee/db/gui_state.py +55 -0
  26. jailbee-1.0.0rc1/src/jailbee/db/models.py +143 -0
  27. jailbee-1.0.0rc1/src/jailbee/destroy_guard.py +189 -0
  28. jailbee-1.0.0rc1/src/jailbee/device_groups.py +86 -0
  29. jailbee-1.0.0rc1/src/jailbee/docker_daemon.py +131 -0
  30. jailbee-1.0.0rc1/src/jailbee/doctor.py +648 -0
  31. jailbee-1.0.0rc1/src/jailbee/egress.py +160 -0
  32. jailbee-1.0.0rc1/src/jailbee/egress_pool.py +533 -0
  33. jailbee-1.0.0rc1/src/jailbee/entry.py +22 -0
  34. jailbee-1.0.0rc1/src/jailbee/git.py +938 -0
  35. jailbee-1.0.0rc1/src/jailbee/git_status.py +494 -0
  36. jailbee-1.0.0rc1/src/jailbee/global_config.py +178 -0
  37. jailbee-1.0.0rc1/src/jailbee/golden.py +393 -0
  38. jailbee-1.0.0rc1/src/jailbee/gui.py +166 -0
  39. jailbee-1.0.0rc1/src/jailbee/hosts.py +177 -0
  40. jailbee-1.0.0rc1/src/jailbee/incus.py +597 -0
  41. jailbee-1.0.0rc1/src/jailbee/init_command.py +365 -0
  42. jailbee-1.0.0rc1/src/jailbee/jobs.py +169 -0
  43. jailbee-1.0.0rc1/src/jailbee/lifecycle.py +2091 -0
  44. jailbee-1.0.0rc1/src/jailbee/loose_revert.py +148 -0
  45. jailbee-1.0.0rc1/src/jailbee/macos.py +191 -0
  46. jailbee-1.0.0rc1/src/jailbee/maintenance.py +155 -0
  47. jailbee-1.0.0rc1/src/jailbee/migrate.py +818 -0
  48. jailbee-1.0.0rc1/src/jailbee/mounts.py +29 -0
  49. jailbee-1.0.0rc1/src/jailbee/network.py +199 -0
  50. jailbee-1.0.0rc1/src/jailbee/paths.py +88 -0
  51. jailbee-1.0.0rc1/src/jailbee/pr.py +474 -0
  52. jailbee-1.0.0rc1/src/jailbee/pr_ai.py +267 -0
  53. jailbee-1.0.0rc1/src/jailbee/profiles.py +353 -0
  54. jailbee-1.0.0rc1/src/jailbee/provision/__init__.py +0 -0
  55. jailbee-1.0.0rc1/src/jailbee/provision/ensure-claude.sh +65 -0
  56. jailbee-1.0.0rc1/src/jailbee/provision/install.d/05-extra-apt.sh +14 -0
  57. jailbee-1.0.0rc1/src/jailbee/provision/install.d/10-locale.sh +11 -0
  58. jailbee-1.0.0rc1/src/jailbee/provision/install.d/15-prompt.sh +39 -0
  59. jailbee-1.0.0rc1/src/jailbee/provision/install.d/60-gui-libs.sh +25 -0
  60. jailbee-1.0.0rc1/src/jailbee/provision/install.d/75-github-cli.sh +23 -0
  61. jailbee-1.0.0rc1/src/jailbee/provision/install.d.available/20-corretto.sh +16 -0
  62. jailbee-1.0.0rc1/src/jailbee/provision/install.d.available/20-openjdk.sh +11 -0
  63. jailbee-1.0.0rc1/src/jailbee/provision/install.d.available/30-nodejs.sh +38 -0
  64. jailbee-1.0.0rc1/src/jailbee/provision/install.d.available/40-python.sh +13 -0
  65. jailbee-1.0.0rc1/src/jailbee/provision/install.d.available/50-docker.sh +47 -0
  66. jailbee-1.0.0rc1/src/jailbee/provision/install.d.available/80-ecr-helper.sh +10 -0
  67. jailbee-1.0.0rc1/src/jailbee/provision/install.d.available/90-registry-mirror-ca.sh +16 -0
  68. jailbee-1.0.0rc1/src/jailbee/provision/install.sh +183 -0
  69. jailbee-1.0.0rc1/src/jailbee/provision/registry-mirror/install.sh +43 -0
  70. jailbee-1.0.0rc1/src/jailbee/provision/registry-mirror/jailbee-registry-proxy.container +18 -0
  71. jailbee-1.0.0rc1/src/jailbee/qtui/__init__.py +1 -0
  72. jailbee-1.0.0rc1/src/jailbee/qtui/actions.py +96 -0
  73. jailbee-1.0.0rc1/src/jailbee/qtui/app.py +404 -0
  74. jailbee-1.0.0rc1/src/jailbee/qtui/cards.py +469 -0
  75. jailbee-1.0.0rc1/src/jailbee/qtui/flow_layout.py +89 -0
  76. jailbee-1.0.0rc1/src/jailbee/qtui/model.py +167 -0
  77. jailbee-1.0.0rc1/src/jailbee/qtui/refresh.py +129 -0
  78. jailbee-1.0.0rc1/src/jailbee/qtui/terminal.py +71 -0
  79. jailbee-1.0.0rc1/src/jailbee/qtui/window.py +299 -0
  80. jailbee-1.0.0rc1/src/jailbee/registry.py +602 -0
  81. jailbee-1.0.0rc1/src/jailbee/retry.py +113 -0
  82. jailbee-1.0.0rc1/src/jailbee/runtime_mounts.py +195 -0
  83. jailbee-1.0.0rc1/src/jailbee/snapshots.py +37 -0
  84. jailbee-1.0.0rc1/src/jailbee/ssh_seed.py +52 -0
  85. jailbee-1.0.0rc1/src/jailbee/submodules.py +851 -0
  86. jailbee-1.0.0rc1/src/jailbee/sync.py +2513 -0
  87. jailbee-1.0.0rc1/src/jailbee/table_format.py +196 -0
  88. jailbee-1.0.0rc1/src/jailbee/templates/__init__.py +1 -0
  89. jailbee-1.0.0rc1/src/jailbee/templates/systemd/__init__.py +1 -0
  90. jailbee-1.0.0rc1/src/jailbee/templates/systemd/jailbee-net-refresh.service +10 -0
  91. jailbee-1.0.0rc1/src/jailbee/templates/systemd/jailbee-net-refresh.timer +12 -0
  92. jailbee-1.0.0rc1/src/jailbee/tmux.py +242 -0
  93. jailbee-1.0.0rc1/src/jailbee/tui.py +573 -0
@@ -0,0 +1,33 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ .Python
7
+ .venv/
8
+ venv/
9
+ env/
10
+ .pytest_cache/
11
+ .mypy_cache/
12
+ .ruff_cache/
13
+ *.egg-info/
14
+ dist/
15
+ build/
16
+
17
+ # Editor
18
+ .idea/
19
+ .vscode/
20
+ *.swp
21
+ *.swo
22
+
23
+ # OS
24
+ .DS_Store
25
+ Thumbs.db
26
+
27
+ # Project
28
+ .local/
29
+ .superpowers/
30
+ # Internal planning artifacts (specs/plans written by the planning skills).
31
+ # They are working notes, not project documentation — keep them out of the tree.
32
+ docs/superpowers/
33
+ ai-local/
@@ -0,0 +1,283 @@
1
+ # Changelog
2
+
3
+ ## Unreleased
4
+
5
+ ### Added: first public release
6
+
7
+ **JailBee** runs isolated, per-branch development environments in Incus system
8
+ containers. Each branch gets a full system container — its own services,
9
+ Docker daemon, IDE and browser — cloned copy-on-write from one golden image,
10
+ so several stacks run in parallel on a single host without port, Docker-name
11
+ or database collisions. Every repo configures itself through
12
+ `.jailbee/config.yaml`; the golden image ships stack-neutral, with language
13
+ toolchains available as opt-in stacks. The CLI is `jailbee`, or `jb` for short.
14
+
15
+ The release covers:
16
+
17
+ - **Container lifecycle** — `jailbee new/shell/tmux/exec/start/stop/restart/destroy`,
18
+ snapshots, optional mounts, background create/destroy with `jailbee job`
19
+ inspection, and interactive pruning of stale containers. `jailbee new --tmux`
20
+ (or `--shell`) lands straight in the new container once it is ready.
21
+ - **Host↔container git bridge** — the container is a git remote:
22
+ `jailbee git push/pull/fetch/checkout/diff/retarget`, base-branch-aware
23
+ merges, stacked-PR maintenance, submodule placement.
24
+ - **GitHub integration** — `jailbee pr` creates and updates PRs (AI-generated
25
+ head name and description when Claude is enabled), `jailbee new --pr` builds a
26
+ review container from a PR, and `gh` works inside containers via scoped PATs.
27
+ - **Networking** — per-container egress allowlist with `strict` and `loose`
28
+ (auto-reverting) modes, a shared Docker registry mirror, and `/etc/hosts`
29
+ pinning.
30
+ - **Desktop integration** — JetBrains IDE (`jailbee ide`) and Chrome
31
+ (`jailbee chrome`) passthrough to the host Wayland session, plus a live TUI
32
+ dashboard (`jailbee dashboard`) and an optional Qt dashboard (`jailbee gui`) that
33
+ span every repo on the host.
34
+ - **Host tooling** — `jailbee init`/`apply` for profiles, ACLs and shared state,
35
+ `jailbee base build/prune/usage` for the golden image, `jailbee doctor`,
36
+ `jailbee disk-usage`, and shell completion for containers, branches and tags.
37
+ - **Experimental macOS support** — drive a Linux VM (Colima/Lima) from an
38
+ Apple Silicon Mac with the repo shared from macOS.
39
+
40
+ ### Fixed: a submodule created in the container kept a container-bound `origin` on the host
41
+
42
+ Pulling a submodule that was added *inside* a container already worked —
43
+ `transport_submodules_to_host` clones a sub-repo the host is missing — but the
44
+ clone came over `ext::incus exec … git upload-pack …`, and git recorded that as
45
+ its `origin`. `git submodule update --init` does not repair it (only
46
+ `git submodule sync` would), so the host was left with a submodule whose remote
47
+ pushed into a container and broke as soon as that container was destroyed.
48
+
49
+ The clone's origin is now set to the URL the container's `.gitmodules` records
50
+ for that path — the same upstream any other clone of the superproject gets, and
51
+ the mirror of what the host → container direction does. Nested submodules read
52
+ their own level's `.gitmodules`. An existing host sub-repo is untouched: its
53
+ remotes are the user's. A failure to rewrite the remote warns instead of
54
+ failing the pull, since the objects are already across by then.
55
+
56
+ ### Fixed: `jailbee git push` with a submodule the container doesn't have yet
57
+
58
+ Adding a submodule on the host and pushing broke the transport: the container
59
+ has no repo at that path, so `git receive-pack <repo_dir>/<path>` failed with
60
+ "does not appear to be a git repository" and the push died on an unhandled
61
+ `GitError` traceback — after some submodules had already been transported.
62
+
63
+ `transport_submodules_to_container` now creates the missing sub-repo first
64
+ (`git init`, `origin` seeded from the host sub-repo's upstream) and leaves it
65
+ on the pushed tip, so the container-side `submodule update --init` finds a
66
+ current revision and needs no network. This mirrors the container → host
67
+ direction, which already cloned sub-repos the host was missing. An existing
68
+ container sub-repo is only pushed into — its HEAD and working tree, which may
69
+ carry in-container work, are never touched. `jailbee git push` also exits 1 with
70
+ the message on any other git failure instead of printing a traceback.
71
+
72
+ ### Added: `jailbee git checkout --as`, and a real error for a branch the container lacks
73
+
74
+ `jailbee git checkout` can now land the container's work on a differently named
75
+ host branch: `jailbee git checkout compose-4 --as compose-4-1`. The host name was
76
+ previously not choosable at all — it was the container's branch name, or its
77
+ `user.jailbee.pr_branch` label when set (`--as` outranks that label). `-b/--branch`
78
+ keeps its meaning on every bridge command: it selects the branch read *inside
79
+ the container*, never the host-side name.
80
+
81
+ Passing `-b` for a branch the container doesn't have used to reach `git fetch`
82
+ and surface as an unhandled `GitError` traceback ("couldn't find remote ref").
83
+ It is now caught before the fetch, with the container's actual branch names
84
+ listed, and `jailbee git fetch`/`checkout` exit 1 on any other git failure instead
85
+ of printing a traceback (`jailbee git pull` already did).
86
+
87
+ ### Changed: dropped the `offline` network mode; `jailbee net loose` gains a TTL override
88
+
89
+ The third network mode, `offline` (no network device attached), is gone.
90
+ `strict` (default-deny egress allowlist) already covers "no unexpected
91
+ egress" without a second, harder deny-all mode alongside it. `jailbee net
92
+ offline` no longer exists, and `defaults.network` /
93
+ `autostart.steps[].network` accept only `strict | loose` (the step field
94
+ stays nullable); loading a config that still says `offline` fails with
95
+ `network mode 'offline' was removed — use 'strict' (default-deny egress
96
+ allowlist)`.
97
+
98
+ Containers created by an older `jailbee` and still carrying the stale
99
+ `<prefix>-net-offline` profile are migrated automatically: `jailbee apply`
100
+ moves them onto `<prefix>-net-strict` and deletes the now-unused profile.
101
+
102
+ **Upgrade note:** that migration only touches container profiles, not
103
+ config files. If `.jailbee/config.yaml` or `~/.config/jailbee/global.yaml` still
104
+ has `defaults.network: offline` (or an autostart step with `network:
105
+ offline`), `jailbee` refuses to load it at all — `jailbee apply` never gets a
106
+ chance to run and migrate anything. Edit that line to `strict` by hand
107
+ *before* upgrading.
108
+
109
+ Separately, `jailbee net loose <name>` now takes `--for <duration>` (e.g.
110
+ `30s`, `45m`, `4h`; capped at 24h; `never` disables the auto-revert for
111
+ this switch, same as `--no-revert`). Omit both `--for` and `--no-revert`
112
+ on a TTY and jailbee prompts for how long to stay loose, defaulting to the
113
+ configured `loose_auto_revert.after`; the Qt dashboard asks via its own
114
+ dialog since its detached actions have no stdin to prompt on. With
115
+ `loose_auto_revert.enabled: false`, jailbee schedules no TTL of its own and
116
+ asks nothing — but an explicit `--for` is still honoured and still
117
+ auto-reverts.
118
+
119
+ ### Added: `LOCAL ±`/`L↑` columns, remembered column preferences, and a destroy guard
120
+
121
+ `jailbee ls` and both dashboards can now show **LOCAL ±** (`local_diff`) and
122
+ **L↑** (`local_count`) — the diff/commit-count between a container's HEAD
123
+ and the host's *currently checked-out* branch, as opposed to `AHEAD ±`/`↑`,
124
+ which is measured against the container's pinned base branch. Both are off
125
+ by default (opt in with `--fields` or the new `ls:`/`dashboard:` config
126
+ block). The underlying probe is opportunistic and read-only: it never
127
+ fetches or writes a ref, so a `?` in either column just means neither side
128
+ happened to already hold the other's tip as a commit object — a `jailbee git
129
+ pull` resolves it by putting the container's tip on the host.
130
+
131
+ New `ls:`/`dashboard:` config blocks (in `~/.config/jailbee/global.yaml` — the
132
+ normal home, since column choice is personal — and per-repo
133
+ `.jailbee/config.yaml`, merged field-by-field: a repo block that sets only
134
+ `hide` still inherits the global `fields`, and vice versa) let a column set
135
+ be remembered: `fields` picks an explicit ordered list (naming a column
136
+ always shows it, even one that's off by default or would otherwise be
137
+ hidden), `hide` subtracts from the built-in default set. `hide` *replaces*
138
+ the list it is set in rather than extending it, so `dashboard: {hide: [ip]}`
139
+ brings REPO / FULL NAME / GIT STATUS / CREATED / TTL back into the table —
140
+ copy the documented default list and append if you meant "one more". Both
141
+ apply to table output only — `jailbee ls --format json` keeps its built-in field
142
+ set regardless, so a personal preference can't silently narrow a script's
143
+ expected shape — and an explicit `--fields` flag beats both in every format.
144
+ The dashboards resolve `dashboard:` against the repo you launched from,
145
+ falling back to the global file, since they render one shared table across
146
+ every repo; the Qt dashboard's Compact card style renders a hardcoded field
147
+ selection and ignores `fields`. An unknown column name, `fields: []`, or a
148
+ name repeated in `fields` is never fatal at load time, in either file: a
149
+ column choice is a personal display preference, and a typo in it must not
150
+ break an unrelated command. Both `global.yaml` and a repo's
151
+ `.jailbee/config.yaml` recover from it the same way (the bad name dropped, or
152
+ `fields` reset to the built-in default set) and print a warning naming the
153
+ file it came from; `jailbee config validate` is where all three are still
154
+ reported as errors, for both files, with the allowed names listed for an
155
+ unknown one.
156
+
157
+ `jailbee destroy` (and, now, `jailbee git pull`'s post-merge cleanup destroy) warns
158
+ before discarding anything a fresh probe shows is at risk — a dirty working
159
+ tree, a changed submodule (named as `(added)`, `(committed +n -m)` and/or
160
+ `(uncommitted +n -m)`, never as a bare `+0 -0`), or commits held on neither
161
+ the host nor a remote — with a summary and a second confirmation defaulting
162
+ to No. Unknown never reads as safety: an unmeasurable commit count still
163
+ warns ("commits not on the host (count unknown)") when the container's HEAD
164
+ is on neither the host nor a remote-tracking ref, and a container whose git
165
+ status could not be read at all gets a "could not inspect the container"
166
+ reason. A container that was never probed (the normal case for a stopped
167
+ one) gets a note instead of silence, with no extra prompt — except in mount
168
+ mode, where the working tree *is* the host's directory and survives the
169
+ destroy, so there is nothing to warn about. `--force` skips the guard
170
+ entirely on every path, matching the existing confirmation skip. The Qt
171
+ dashboard (`jailbee gui`) runs the identical assessment, with the identical
172
+ wording, in its own dialog, since its destroy launches as a detached,
173
+ already-`--force`d background process that has no terminal to prompt on.
174
+
175
+ ### Fixed: `jailbee registry up` repairs a half-provisioned mirror
176
+
177
+ `jailbee registry up` provisioned the `jailbee-registry-mirror` container exactly
178
+ once, on the run that created it. If that run died partway — a network drop
179
+ during `apt-get install podman` is enough — the container still existed and
180
+ still booted, so every later `jailbee registry up` merely started it, waited 60
181
+ seconds for a proxy service that had never been installed, and failed.
182
+ Recovery meant reaching past `jailbee` to `incus delete jailbee-registry-mirror`.
183
+
184
+ `up` now reinstalls the proxy when the container is missing its Quadlet unit
185
+ file (the signature of an interrupted install), and once more if the service
186
+ still doesn't come up. Reinstalling no longer truncates
187
+ `/etc/jailbee-registry-proxy.env`, so per-repo upstreams survive the repair. For
188
+ damage a reinstall can't fix, `jailbee registry up --recreate` deletes the
189
+ container and rebuilds it from the image; the host-side cache and CA
190
+ directories are preserved, so no user container loses its trust in the
191
+ mirror's CA.
192
+
193
+ ### Added: `jailbee new` provisions with the target branch's own autostart config
194
+
195
+ In clone mode, `jailbee new <branch>` now reads the `autostart` block from the
196
+ target branch's committed `.jailbee/config.yaml`, at the exact commit it clones —
197
+ so a container runs the startup steps its branch actually ships, instead of
198
+ whatever the operator's checkout happened to have. Every other config key
199
+ (mounts, network defaults, resource limits, `container_prefix`, host-level
200
+ keys) still comes from the operator's checkout; a branch cannot change how
201
+ containers are run.
202
+
203
+ A deviation from the checkout prints a compact diff naming the ref or commit it
204
+ read (added/removed/changed steps, `step_timeout`/`env` changes).
205
+
206
+ Whether the branch *gains* anything is a separate comparison, made against the
207
+ repo's reviewed baseline — `refs/remotes/origin/<default_branch>` — rather than
208
+ the checkout, which is only ever one snapshot of one branch and may lag origin,
209
+ run ahead of it, or carry local edits. It prints its own `branch autostart
210
+ widens privileges beyond …` block, and falls back to comparing against the
211
+ checkout when that ref has no usable config.
212
+
213
+ Two kinds of widening are reported, weighed differently. A step attaching an
214
+ `optional_mounts` entry the baseline's same-named step does not **always** asks
215
+ for confirmation before anything is created, defaulting to no: those are
216
+ typically personal credential directories (`~/.aws`, `~/.m2`), the step's
217
+ command line comes from the same branch, and attaching the mount is what
218
+ creates the asset. A step widening network access from `strict` to `loose` asks
219
+ only for an untrusted head — `jailbee new --pr N` where the PR's head lives in a
220
+ **fork**, i.e. code nobody with push access to the repo has vouched for.
221
+ Everything else warns and proceeds, since once the container runs the branch's
222
+ code `strict` is an egress allowlist of registries and forges that all accept
223
+ uploads — no boundary against that code — while `loose` is the ordinary way a
224
+ step installs dependencies. A PR number is not the signal: an internal PR's head
225
+ is a branch in the operator's own origin, byte-identical to what
226
+ `jailbee new <branch>` clones, and gating one spelling and not the other would only
227
+ teach the operator to click through the mount prompt. A new step the baseline
228
+ has no counterpart for counts as widening in both cases.
229
+
230
+ `--yes`/`-y` now covers this prompt too, on top of its existing job of skipping
231
+ the "branch already exists" confirmation, and `--no-autostart` skips the branch
232
+ config entirely — none of its steps run, so there is nothing to diff or confirm.
233
+
234
+ With `jailbee new --background`, the ref resolution (including autofetch) and the
235
+ whole branch-config check run in the foreground *before* the run detaches, so
236
+ the question is asked in the terminal the operator is still at — a detached
237
+ worker has no stdin and could only ever answer "no". Declining creates no
238
+ container and records no job. The answer is pinned to the commit it was given
239
+ for: if the branch moves between confirmation and provisioning, the worker
240
+ aborts naming the move instead of provisioning a config nobody saw. With no
241
+ terminal at all, `jailbee new` says so and points at `--yes`.
242
+
243
+ A branch with no committed `.jailbee/config.yaml` falls back silently to the
244
+ checkout's autostart; one that fails to validate, or references an
245
+ `optional_mounts` key the checkout doesn't define, warns and falls back the
246
+ same way. `--mount` and `--no-clone` are unaffected — they share the host
247
+ working tree, so there is no distinct target branch. `jailbee start`, `jailbee
248
+ restart`, and `jailbee apply` are unaffected too: only container creation reads
249
+ the branch.
250
+
251
+ ### Deprecated
252
+
253
+ JailBee was called `gie` (`gisgro-incus-env`) before this release. Six
254
+ pieces of pre-1.0 compatibility exist so that an install from before the
255
+ rename keeps working while it migrates, and all six are removed in
256
+ **1.1.0**. See [`docs/migrating-from-gie.md`](docs/migrating-from-gie.md)
257
+ for the full migration guide (what `jailbee migrate` does, what it refuses
258
+ to do, and how to upgrade).
259
+
260
+ - The **`gie` console script** — an alias for the same `jailbee` entry
261
+ point, installed alongside `jailbee` and `jb`.
262
+ - The **`.gie/config.yaml` fallback** — `jailbee` still reads a repo's
263
+ config from `.gie/` if `.jailbee/` doesn't exist, with a one-time
264
+ deprecation warning naming the `git mv` to run.
265
+ - **`claude.install_gie_skills` as a config alias** for
266
+ `claude.install_jailbee_skills`.
267
+ - The **legacy `/etc/hosts` sentinel** — `jailbee net refresh` still
268
+ recognizes the pre-1.0 `# BEGIN/END gie-managed allowlist` markers left
269
+ by containers it hasn't migrated yet, so it replaces the old block
270
+ instead of leaving it behind.
271
+ - The **`<data>/gie` compatibility symlink** — `jailbee migrate` leaves
272
+ `~/.local/share/gie` pointing at `~/.local/share/jailbee` after moving
273
+ it, because Incus disk devices store absolute source paths. `jailbee
274
+ apply` rewrites the profile-level ones; per-container devices are
275
+ attached once at creation and never refreshed, so a container created
276
+ before the rename relies on the symlink for as long as it lives.
277
+ - **`jailbee migrate` itself** — the one-shot command that moves a pre-1.0
278
+ install's host directories, container labels, git refs, systemd units,
279
+ shared bridge, registry mirror, and bundled skills into the `jailbee`
280
+ namespace. It repoints each repo's `<prefix>-net-loose` profile at
281
+ `jailbee-loose` and deletes `gie-loose` (renaming is impossible while a
282
+ profile references it), and refuses — naming both paths — rather than
283
+ skipping a directory move whose target already exists.