A shared account shouldn't publish launcher changes under its own name.
It now asks for the user name (zenity, like undulator-pointing), checks
it, and runs launcher-editor as that user with become in a terminal (the
password prompt needs one; the terminal stays open if login fails).
--live and --help still run as the shared account. Without
~/network_drives (where the gitea SSH key is) and with a terminal at hand,
it runs setup-network-drives before cloning/pulling.
Without arguments it asks whether to edit the Bernina launcher: a personal
clone of the launcher config repo is created or fast-forwarded and opened,
with Preview running epics_launcher like the consoles do, and Publish
pushing (which deploys to /sf/bernina/config/launcher). Otherwise it opens
the plain editor. --live opens the deployed config read-only; other
arguments go to the editor unchanged.
bpy-default.sh and bpy-dev.sh were saved 'pixi shell-hook' output from
another host, with PIXI_EXE and PATH pointing into a personal home that
doesn't exist on the consoles. bpy-env.sh now runs the hook at runtime
(--as-is, ~0.2 s) for its shared-env fallback instead of sourcing
bpy-default.sh; nothing else used either file.
Scripts that call pixi now prefer the system /usr/bin/pixi and fall back
to /sf/bernina/bin/pixi (e.g. on ra, which has no system pixi).
firefox_as ssh's to localhost, which can start a new session; the old
mkdir -p then ran before mount-user-cifs-shares linked
~/network_drives/home, created a local tmpfs dir there (the mount
script's ln -sf then put its link inside it), and Firefox got a fresh
empty profile - and gopass broke for that session too.
Now: refuse if home is a plain directory (with repair hint), otherwise
wait up to 20s for the link (starting the mount service), and fail
with a message instead of creating a local profile. Also drop the
blank line before the shebang.
- Renamed to create-python-install.
- No longer edits ~/.condarc during the install. Each install ends by
printing the command for you and collaborators to run once on ra:
create-python-install -J <exp|pgroup|path>, which only adds the
folder's conda_envs to envs_dirs in ~/.condarc and lists the kernels.
Replaces -C.
- Re-runs keep the pgroup's own pixi.toml/pixi.lock when they differ
from the shared ones (e.g. packages added), so a colleague running it
to get the JupyterHub kernels no longer resets the env. -u resets to
the shared files explicitly (backups kept).
- -a pkg / -A pkg: add conda-forge / PyPI packages (pixi add, install,
group permissions, pgroup cache).
- -P: only make your own files in the install group-writable.
Local change found uncommitted in the deployed working copy; committed
so the next deploy doesn't overwrite it. The old /opt/gfa call is kept
as a comment.
- Commands lose their .sh extension (create_personal_dir,
gopass_bernina_setup, gopass_bernina_service_setup,
kerberos_ticket_renew, migrate_to_network_drive, pixi_local_sync,
pixi_rebuild_local, sync_personal_config); .sh now only marks files
that are sourced. kerberos_ticket_renew.sh and pixi_local_sync.sh stay
as links, since they are started at login.
- Sourced files gain .sh (bpy-env, anaconda_env, anaconda_bernina_env,
mm_bernina); the old names stay as links.
- All references in scripts, the .desktop file and the docs updated;
cheatsheet.md regenerated via list_bin_commands.
- New pixi_pgroup_install: installs the shared bernina pixi env into a
pgroup work folder (group-shared, with its own package cache) and
makes it visible in JupyterHub as bernina-<exp>-<env>.
- Fix '#/bin/bash' first lines (missing '!') in 11 scripts.
- Stop tracking clutter (.nfs placeholders, __pycache__, vim swap file,
.bak/_bak/~ copies, delme_*, empty 'me'); add .gitignore.
Deletes 9 legacy/alternate eco-launcher scripts superseded by eco and
eco-dev: eco-in, eco-notlazy, eco-test, eco_historic, eco_mm_env,
eco_new, eco_noenv, eco_old, ecotest.
eco_bams_bpms and eco_roman stay (still useful for BAM/BPM and robot
work respectively) but are marked "cheatsheet: hide" and dropped from
list_bin_commands' COMMANDS dict, so they no longer show up in the
generated cheat sheet -- reach for them directly by name instead.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
cheatsheet_to_shortcuts_json now recognizes a markdown link in a table's
first column (e.g. [Admin & Account Setup](cheatsheet_admin.md) in a
Command/Shortcut/Sheet table) and emits it as a navigable entry instead
of a literal shortcut.
cheatsheet_overlay renders such entries as clickable links; clicking one
loads and displays that file in place of the current one (path resolved
relative to the linking file, arbitrary depth, cycle-safe), with a
"< Back" affordance to return. A new "Search all sheets" checkbox
instead discovers and combines every sheet reachable from the root into
one filterable view. Everything reloads fresh from disk at the moment
it's needed (no caching across a click or toggle), so editing any of
these .md files takes effect on the very next use, same as the existing
per-invocation freshness for the root sheet.
Adds cheatsheet_admin.md as the first real sub-sheet: one-time/occasional
account and host setup tasks (personal dirs, gopass onboarding, PSI
home-sync) pulled out of the main operational reference, linked from a
new "Other cheat sheets" section in cheatsheet.md.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Adds a "Window tiling (Tactile)" section (Super+T grid, tile-select
keys, layout switching) alongside gTile's, and updates gTile's own
section: documents the right-hand-block preset set that was missing
from the cheatsheet, and drops the stale "installed/updated on login"
note now that both extensions are served from the shared
/sf/bernina/applications tree via XDG_DATA_DIRS instead.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Tactile's schema supports monitor-0-layout through monitor-5-layout;
only setting 0/1 left consoles with 3+ screens (or a monitor enumerated
at a higher index) stuck on Tactile's own default layout instead of ours.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Bumps Tactile's grid to 4 rows (grid-cols already defaults to 4), remaps
its tile-activation keys to the same "row of keys top to bottom -> row of
screen quarters top to bottom" spatial layout already used for gTile's
right-hand-block preset set (7890 / uiop / jkl; / m,./), disables
maximize-on-select, extends layout-4 to use all 4 rows, and defaults both
monitors to layout-4 so the customized grid shows up without needing to
press 4 first.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Root cause (confirmed via strings on libgnome-shell.so): gnome-shell's
extension directory resolution walks GLib.get_system_data_dirs() (i.e.
XDG_DATA_DIRS) gated by an includeUserDir flag that's false for
extensions on this RHEL9 build -- so ~/.local/share/gnome-shell/extensions
is never scanned at all, no matter how correctly install_gtile/
install_tactile populated it or how correct enabled-extensions was.
Confirmed live on saresb-cons-04 via Looking Glass:
Main.extensionManager.lookup() stayed undefined until
createExtensionObject()+loadExtension() were called by hand.
Fix: serve both extensions from the existing shared
/sf/bernina/applications/{gTile@vibou,tactile@lundal.io} via a new
/sf/bernina/applications/gnome-shell/extensions/ symlink tree, and have
startup_bernina_terminal self-heal a per-account
~/.config/environment.d/98-bernina-extensions.conf that prepends that
tree to XDG_DATA_DIRS. This uses the same (working) system-extension scan
path as gnome-shell's own stock extensions, so no per-account copy step
is needed anymore.
Removes install_gtile/install_tactile/install_gnome_extension (the
now-unnecessary rsync-to-~/.local approach) and the
user-extension-loader@bernina.psi.ch workaround extension explored along
the way, superseded by this simpler fix. Cleaned up the resulting stale
doc entries in list_bin_commands/cheatsheet.md.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
gsettings set/reset against org.gnome.shell.extensions.* schemas fails
with "No such schema" from a plain shell (the schema is bundled inside
the extension, never registered system-wide) -- this was silently
no-op'ing all 16 preset-resize-1..16 keybindings plus the preset-resize-21
self-heal in startup_bernina_terminal on every single run. Switched all of
these to dconf write/reset, which operates on the raw key store and needs
no schema.
Also hardened install_gtile against transient failures at login (no
retry, no logging previously made intermittent skips undiagnosable) by
extracting the shared logic into install_gnome_extension and adding
retries + a log file, then reused it for a new install_tactile, wiring
the Tactile extension (tactile@lundal.io, vetted against gnome-shell 40)
into startup_bernina_terminal alongside gTile.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The 07:44 autodeploy pull of this repo re-cloned from scratch and wiped
everything that wasn't committed. Restored from the 07:05 hourly NFS
snapshot (.snapshot/hourly.2026-09-07_0705), the last one taken before
the wipe:
- eco-status-server, eco-status-server-install-user-service: switch from
tracked copies to symlinks into the canonical eco repo checkout at
/sf/bernina/code/gac-bernina/eco/scripts/, so edits there take effect
immediately without a redeploy step.
- eco-dev-pull-new-version: small helper to update that eco checkout.
- refresh_home_links: interactive helper to clear local files blocking
linux_home_links.yaml link:/copy: targets before restarting
create-automatic-links-in-home.service.
- .vscode/settings.json: restore local Peacock/color-theme customization.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Something in this environment periodically rewrites origin back to an
https URL with an embedded token; this script switches it to SSH
before every push so pushes don't depend on that token.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>