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.
- jailbee-1.0.0/.gitignore +32 -0
- jailbee-1.0.0/CHANGELOG.md +285 -0
- jailbee-1.0.0/LICENSE +674 -0
- jailbee-1.0.0/PKG-INFO +179 -0
- jailbee-1.0.0/README.md +147 -0
- jailbee-1.0.0/docs/skills/jailbee-repo-setup/SKILL.md +309 -0
- jailbee-1.0.0/docs/skills/jailbee-repo-setup/references/config-schema.md +626 -0
- jailbee-1.0.0/docs/skills/jailbee-usage/SKILL.md +463 -0
- jailbee-1.0.0/docs/skills/jailbee-usage/references/commands.md +483 -0
- jailbee-1.0.0/pyproject.toml +88 -0
- jailbee-1.0.0/src/jailbee/__init__.py +12 -0
- jailbee-1.0.0/src/jailbee/__main__.py +8 -0
- jailbee-1.0.0/src/jailbee/apply.py +400 -0
- jailbee-1.0.0/src/jailbee/autostart.py +324 -0
- jailbee-1.0.0/src/jailbee/background.py +299 -0
- jailbee-1.0.0/src/jailbee/branch_config.py +425 -0
- jailbee-1.0.0/src/jailbee/chrome_pool.py +336 -0
- jailbee-1.0.0/src/jailbee/claude_skills.py +63 -0
- jailbee-1.0.0/src/jailbee/cli.py +6170 -0
- jailbee-1.0.0/src/jailbee/completion.py +268 -0
- jailbee-1.0.0/src/jailbee/config.py +2146 -0
- jailbee-1.0.0/src/jailbee/config_init.py +357 -0
- jailbee-1.0.0/src/jailbee/dashboard.py +740 -0
- jailbee-1.0.0/src/jailbee/db/__init__.py +130 -0
- jailbee-1.0.0/src/jailbee/db/gui_state.py +55 -0
- jailbee-1.0.0/src/jailbee/db/models.py +143 -0
- jailbee-1.0.0/src/jailbee/destroy_guard.py +189 -0
- jailbee-1.0.0/src/jailbee/device_groups.py +86 -0
- jailbee-1.0.0/src/jailbee/docker_daemon.py +131 -0
- jailbee-1.0.0/src/jailbee/doctor.py +648 -0
- jailbee-1.0.0/src/jailbee/egress.py +160 -0
- jailbee-1.0.0/src/jailbee/egress_pool.py +533 -0
- jailbee-1.0.0/src/jailbee/entry.py +22 -0
- jailbee-1.0.0/src/jailbee/git.py +938 -0
- jailbee-1.0.0/src/jailbee/git_status.py +494 -0
- jailbee-1.0.0/src/jailbee/global_config.py +178 -0
- jailbee-1.0.0/src/jailbee/golden.py +393 -0
- jailbee-1.0.0/src/jailbee/gui.py +166 -0
- jailbee-1.0.0/src/jailbee/hosts.py +177 -0
- jailbee-1.0.0/src/jailbee/incus.py +597 -0
- jailbee-1.0.0/src/jailbee/init_command.py +365 -0
- jailbee-1.0.0/src/jailbee/jobs.py +169 -0
- jailbee-1.0.0/src/jailbee/lifecycle.py +2091 -0
- jailbee-1.0.0/src/jailbee/loose_revert.py +148 -0
- jailbee-1.0.0/src/jailbee/macos.py +191 -0
- jailbee-1.0.0/src/jailbee/maintenance.py +155 -0
- jailbee-1.0.0/src/jailbee/migrate.py +818 -0
- jailbee-1.0.0/src/jailbee/mounts.py +29 -0
- jailbee-1.0.0/src/jailbee/network.py +199 -0
- jailbee-1.0.0/src/jailbee/paths.py +88 -0
- jailbee-1.0.0/src/jailbee/pr.py +474 -0
- jailbee-1.0.0/src/jailbee/pr_ai.py +267 -0
- jailbee-1.0.0/src/jailbee/profiles.py +353 -0
- jailbee-1.0.0/src/jailbee/provision/__init__.py +0 -0
- jailbee-1.0.0/src/jailbee/provision/ensure-claude.sh +65 -0
- jailbee-1.0.0/src/jailbee/provision/install.d/05-extra-apt.sh +14 -0
- jailbee-1.0.0/src/jailbee/provision/install.d/10-locale.sh +11 -0
- jailbee-1.0.0/src/jailbee/provision/install.d/15-prompt.sh +39 -0
- jailbee-1.0.0/src/jailbee/provision/install.d/60-gui-libs.sh +25 -0
- jailbee-1.0.0/src/jailbee/provision/install.d/75-github-cli.sh +23 -0
- jailbee-1.0.0/src/jailbee/provision/install.d.available/20-corretto.sh +16 -0
- jailbee-1.0.0/src/jailbee/provision/install.d.available/20-openjdk.sh +11 -0
- jailbee-1.0.0/src/jailbee/provision/install.d.available/30-nodejs.sh +38 -0
- jailbee-1.0.0/src/jailbee/provision/install.d.available/40-python.sh +13 -0
- jailbee-1.0.0/src/jailbee/provision/install.d.available/50-docker.sh +47 -0
- jailbee-1.0.0/src/jailbee/provision/install.d.available/80-ecr-helper.sh +10 -0
- jailbee-1.0.0/src/jailbee/provision/install.d.available/90-registry-mirror-ca.sh +16 -0
- jailbee-1.0.0/src/jailbee/provision/install.sh +179 -0
- jailbee-1.0.0/src/jailbee/provision/registry-mirror/install.sh +43 -0
- jailbee-1.0.0/src/jailbee/provision/registry-mirror/jailbee-registry-proxy.container +18 -0
- jailbee-1.0.0/src/jailbee/qtui/__init__.py +1 -0
- jailbee-1.0.0/src/jailbee/qtui/actions.py +96 -0
- jailbee-1.0.0/src/jailbee/qtui/app.py +404 -0
- jailbee-1.0.0/src/jailbee/qtui/cards.py +469 -0
- jailbee-1.0.0/src/jailbee/qtui/flow_layout.py +89 -0
- jailbee-1.0.0/src/jailbee/qtui/model.py +167 -0
- jailbee-1.0.0/src/jailbee/qtui/refresh.py +129 -0
- jailbee-1.0.0/src/jailbee/qtui/terminal.py +71 -0
- jailbee-1.0.0/src/jailbee/qtui/window.py +299 -0
- jailbee-1.0.0/src/jailbee/registry.py +602 -0
- jailbee-1.0.0/src/jailbee/retry.py +113 -0
- jailbee-1.0.0/src/jailbee/runtime_mounts.py +195 -0
- jailbee-1.0.0/src/jailbee/snapshots.py +37 -0
- jailbee-1.0.0/src/jailbee/ssh_seed.py +52 -0
- jailbee-1.0.0/src/jailbee/submodules.py +851 -0
- jailbee-1.0.0/src/jailbee/sync.py +2513 -0
- jailbee-1.0.0/src/jailbee/table_format.py +196 -0
- jailbee-1.0.0/src/jailbee/templates/__init__.py +1 -0
- jailbee-1.0.0/src/jailbee/templates/systemd/__init__.py +1 -0
- jailbee-1.0.0/src/jailbee/templates/systemd/jailbee-net-refresh.service +10 -0
- jailbee-1.0.0/src/jailbee/templates/systemd/jailbee-net-refresh.timer +12 -0
- jailbee-1.0.0/src/jailbee/tmux.py +242 -0
- jailbee-1.0.0/src/jailbee/tui.py +573 -0
jailbee-1.0.0/.gitignore
ADDED
|
@@ -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.
|