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