@vibelord/lanes 1.6.0 → 1.6.1

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibelord/lanes",
3
- "version": "1.6.0",
3
+ "version": "1.6.1",
4
4
  "description": "Installer for Lanes: shared agent terminals over SSH with Zellij views, registry sync, uploads and a phone interface.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -1 +1 @@
1
- 1.6.0
1
+ 1.6.1
@@ -46,9 +46,19 @@ def main():
46
46
  inherited.append(line)
47
47
  base.write_text("\n".join(inherited) + "\n")
48
48
 
49
- lines = [line for line in target.read_text().splitlines() if key_of(line) != "config-file"]
50
- lines.extend((f"config-file = {base}",))
51
49
  appearance = lanes / "appearance.ghostty"
50
+ generated = {base.resolve(), appearance.resolve()}
51
+
52
+ def own(line):
53
+ """An include of Lanes' own (the palette chain under ~/.config/lanes) stays; the everyday Ghostty ones are
54
+ replaced by the filtered base below; an earlier run's base/appearance lines are re-added, not kept."""
55
+ value = line.split("=", 1)[1].strip().removeprefix("?").strip().strip('"')
56
+ path = Path(value).expanduser()
57
+ path = (path if path.is_absolute() else lanes / path).resolve()
58
+ return path not in generated and path.is_relative_to(lanes.resolve())
59
+
60
+ lines = [line for line in target.read_text().splitlines() if key_of(line) != "config-file" or own(line)]
61
+ lines.extend((f"config-file = {base}",))
52
62
  if appearance.is_file():
53
63
  lines.append(f"config-file = {appearance}")
54
64
  rendered = "\n".join(lines) + "\n"
@@ -384,6 +384,7 @@ dog_ready=
384
384
  reader=
385
385
  holding=
386
386
  now=
387
+ hold_enter=
387
388
  limit=
388
389
  tree= # set: a timeout or a signal ends the child's whole process tree (kill_tree), not only the child
389
390
  helper_pid=
@@ -528,17 +529,33 @@ kill_tree() {
528
529
  }
529
530
  # hold <seconds> [jitter]: wait, but Enter continues at once. No raw mode, so there is no terminal state to restore
530
531
  # when the window closes mid-wait: a line reader signals this shell instead. End of input (no terminal) is no Enter.
532
+ # The wait is a poll in tenth-second steps, not one `run sleep`: an Enter that landed before a sleep's pid was on
533
+ # record went unserved for the whole wait (DEF-2176), and dash keeps a trap that lands during its blocking `wait`
534
+ # pending until that wait ends — after a foreground step every shell runs it. The reader also leaves a marker, read
535
+ # by the poll, so even a trap not yet run ends the wait. No child is ended by another process: no job notice leaks.
531
536
  trap 'if [ -n "$holding" ]; then now=1; [ -z "$child" ] || { kill -TERM "$child"; wait "$child"; } 2>/dev/null; fi' USR1
537
+ hold_poll() { # hold_poll SECONDS: whole seconds in tenth-second steps; Enter (now, or the reader's marker) ends it
538
+ steps=$(( ${1%%.*} * 10 )) 2>/dev/null || steps=0
539
+ while [ "$steps" -gt 0 ]; do
540
+ if [ -n "$now" ] || [ -e "$hold_enter" ]; then return 0; fi
541
+ sleep .1
542
+ steps=$((steps - 1))
543
+ done
544
+ }
532
545
  hold() {
533
546
  now=; holding=1
547
+ hold_enter=${TMPDIR:-/tmp}/lanes-hold-$$.enter
548
+ rm -f "$hold_enter" 2>/dev/null || :
534
549
  exec 9<&0
535
- ( IFS= read -r line <&9 && kill -USR1 "$$" ) 2>/dev/null &
550
+ ( IFS= read -r line <&9 && { : >"$hold_enter" 2>/dev/null || :; kill -USR1 "$$"; } ) 2>/dev/null &
536
551
  reader=$!
537
552
  exec 9<&-
538
- run sleep "$1" || :
539
- # Jitter is a second sleep: should its number ever be malformed, the whole wait is still served — no tight loop.
540
- if [ -z "$now" ] && [ -n "${2:-}" ]; then run sleep "$2" || :; fi
553
+ hold_poll "$1"
554
+ # Jitter is a second wait: should its number ever be malformed, the whole wait is still served — no tight loop.
555
+ if [ -z "$now" ] && [ ! -e "$hold_enter" ] && [ -n "${2:-}" ]; then hold_poll "$2"; fi
541
556
  holding=
557
+ rm -f "$hold_enter" 2>/dev/null || :
558
+ hold_enter=
542
559
  kill -TERM "$reader" 2>/dev/null || :
543
560
  wait "$reader" 2>/dev/null || :
544
561
  reader=
@@ -40,6 +40,14 @@ elif [ -n "$look" ]; then
40
40
  device=$(head -n 1 "$config/device")
41
41
  file=$config/ghostty.look.conf
42
42
  fi
43
+ # Linux Ghostty: Omarchy's everyday theme sets colours explicitly, which would override the theme pair. The themed
44
+ # launcher rewrites ghostty.conf with those filtered out of the inherited settings; every way in (key binding, desktop
45
+ # entry, this command) prepares it here, before a variant is derived from it (DEF-2175). Without it, the plain config.
46
+ if [ "$(uname -s)" != Darwin ] && command -v ghostty >/dev/null 2>&1 && command -v python3 >/dev/null 2>&1 \
47
+ && [ -x "$HOME/.local/bin/lanes-themed-window" ]; then
48
+ "$HOME/.local/bin/lanes-themed-window" --prepare-only >/dev/null \
49
+ || echo 'lanes-window: the themed Ghostty config did not validate; opening with the plain one' >&2
50
+ fi
43
51
  if [ -n "$device" ]; then
44
52
  device="$device$look"
45
53
  sed "s|^command = .*|command = $launch $device|" "$config/ghostty.conf" > "$file"
@@ -265,9 +265,11 @@ cd bw-tools/lanes
265
265
 
266
266
  OpenSSH is required. Install Ghostty for a dedicated window, or run `lanes-launch` in your existing terminal.
267
267
  Linux also supports Foot, plus optional Omarchy/Hyprland shortcuts. The dedicated Ghostty window defaults to
268
- Catppuccin Latte in light mode and Dracula in dark mode. On Omarchy, its launcher preserves everyday fonts, padding
269
- and shortcuts while excluding inherited theme colors so this pair takes effect; the everyday Ghostty config is left
270
- untouched. Tailscale is required when your profile uses
268
+ Catppuccin Latte in light mode and Dracula in dark mode. On Omarchy, the window's config is prepared by every way of
269
+ opening it — the Super+Shift+L binding, the launcher entry, `lanes-window` — and by the installer itself: everyday
270
+ fonts, padding and shortcuts are inherited, inherited theme colors are excluded so this pair takes effect, and Lanes'
271
+ own includes (an opted-in `--palette`) stay; the everyday Ghostty config is left untouched. A window that is already
272
+ open keeps the config it started with: close it and open it again. Tailscale is required when your profile uses
271
273
  a tailnet address. When the profile's `LANES_SERVER_NAME` ends in `.ts.net`, the installer checks Tailscale before
272
274
  the server: without it, it prints `tailscale: not installed — macOS: brew install --cask tailscale · Linux:
273
275
  https://tailscale.com/download` and exits 4 (the client is installed); on a logged-out machine it prints
@@ -386,6 +386,11 @@ install_client() {
386
386
  if [ "$os" = Darwin ]; then cat "$target/ghostty/macos.conf"; else cat "$target/ghostty/omarchy.conf"; fi
387
387
  } > "$config/ghostty.conf"
388
388
  install_palette
389
+ # Linux Ghostty: write the colour-filtered inherited config now (lanes-window does it again on every open), so a
390
+ # fresh install or update never shows Omarchy's colours over the theme pair (DEF-2175).
391
+ if [ "$os" != Darwin ] && command -v ghostty >/dev/null 2>&1 && command -v python3 >/dev/null 2>&1; then
392
+ "$bin/lanes-themed-window" --prepare-only >/dev/null 2>&1 || warn 'Ghostty: the themed config did not validate; the plain config stands'
393
+ fi
389
394
  }
390
395
 
391
396
  # The Ghostty binary, for its version only: on PATH, else inside the macOS app bundle.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@vibelord/lanes",
3
- "version": "1.6.0",
4
- "commit": "2383319bbb5d43405c98c6743f921e35ad08d3da",
5
- "digest": "sha256:ec6424f998618be4b43db226b3b37c2878b31c4e489a65f21446a0cea9019546",
3
+ "version": "1.6.1",
4
+ "commit": "3f05cdeda5ec54fef372c7b5f44cc6701040d4c6",
5
+ "digest": "sha256:abf3e3c8982ff67bf96b2cf154e840925371550e76a0173db04d66c6afa8e009",
6
6
  "executables": [
7
7
  "bin/lanes",
8
8
  "client/ghostty/lanes-themed-window",