@vibelord/lanes 1.1.1 → 1.2.0
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/README.md +36 -5
- package/bin/lanes-install.mjs +166 -13
- package/lib/plan.mjs +113 -3
- package/package.json +1 -1
- package/payload/lanes/README.md +45 -22
- package/payload/lanes/VERSION +1 -1
- package/payload/lanes/bin/lanes +2459 -164
- package/payload/lanes/client/ghostty/lanes-palette-light.conf +19 -19
- package/payload/lanes/client/ghostty/lanes-palette.conf +19 -19
- package/payload/lanes/client/lanes-launch +289 -40
- package/payload/lanes/client/lanes-window +15 -3
- package/payload/lanes/container/hooks/claude-settings.json +1 -0
- package/payload/lanes/container/lane +106 -92
- package/payload/lanes/container/lane-edit +100 -0
- package/payload/lanes/container/lane-mcp +1091 -0
- package/payload/lanes/container/lane-signal +109 -29
- package/payload/lanes/container/lane_core.py +1140 -0
- package/payload/lanes/container/vimrc +31 -0
- package/payload/lanes/docs/ARCHITECTURE.md +618 -13
- package/payload/lanes/docs/DESIGN.md +122 -44
- package/payload/lanes/docs/INSTALL.md +157 -17
- package/payload/lanes/docs/RUNBOOK.md +603 -72
- package/payload/lanes/docs/SHARING.md +3 -2
- package/payload/lanes/docs/USERGUIDE.md +777 -136
- package/payload/lanes/install/enable-web.sh +2 -0
- package/payload/lanes/install/host-install.sh +163 -7
- package/payload/lanes/install/services.py +148 -18
- package/payload/lanes/install.sh +68 -7
- package/payload/lanes/libexec/agent_state.py +74 -1
- package/payload/lanes/libexec/cursor_sync.py +6 -0
- package/payload/lanes/libexec/device_sync.py +47 -10
- package/payload/lanes/libexec/economy_poll.py +1 -0
- package/payload/lanes/libexec/enrold.py +41 -22
- package/payload/lanes/libexec/keys.py +54 -23
- package/payload/lanes/libexec/lanes_lib.py +620 -22
- package/payload/lanes/libexec/members.py +16 -2
- package/payload/lanes/libexec/notify.py +104 -24
- package/payload/lanes/libexec/registrations.py +216 -18
- package/payload/lanes/libexec/session_actions.py +182 -14
- package/payload/lanes/libexec/sidebar +11 -3
- package/payload/lanes/libexec/sidebar.py +2135 -361
- package/payload/lanes/libexec/statusd.py +137 -10
- package/payload/lanes/libexec/studio_host.py +8 -1
- package/payload/lanes/libexec/tokens.py +121 -30
- package/payload/lanes/libexec/tokens.sh +86 -2
- package/payload/lanes/libexec/update.py +972 -0
- package/payload/lanes/libexec/users.py +614 -0
- package/payload/lanes/libexec/view.sh +34 -6
- package/payload/lanes/systemd/lanes-ensure.service +3 -0
- package/payload/lanes/systemd/lanes-gc.service +1 -1
- package/payload/lanes/systemd/lanes-update.service +17 -0
- package/payload/lanes/systemd/lanes-update.timer +17 -0
- package/payload/lanes/web/README.md +83 -24
- package/payload/lanes/web/browser.js +3 -5
- package/payload/lanes/web/mobile.css +17 -17
- package/payload/lanes/web/mobile.js +44 -32
- package/payload/lanes/workspaces.example/README.md +3 -1
- package/payload/lanes/zellij/config.kdl +106 -56
- package/payload/manifest.json +5 -3
|
@@ -24,7 +24,9 @@ A lane is whatever the registry says it is: `lanes sync` (every two minutes, rea
|
|
|
24
24
|
terminal into a lane with a stable id `<board>--<slug of the terminal name>` (with the repository `prefix`). A
|
|
25
25
|
`displayNames` entry, which the sidebar `R` key and `lanes rename <lane-id> <name>` write into the repository's block
|
|
26
26
|
of `workspaces.<board>.json` (first write keeps a `.bak-<UTC>` copy beside it), changes only the shown name, never the
|
|
27
|
-
id.
|
|
27
|
+
id. The repository can also name a lane itself with `lanes.terminals[<name>].displayName` in its `terminals.json`;
|
|
28
|
+
the manifest's `displayNames` entry wins over it, and a `displayName` another lane on the board already answers to is
|
|
29
|
+
ignored (the lane keeps its title). Add a terminal to `.vscode/terminals.json` for an editor-defined lane.
|
|
28
30
|
Alternatively, use **+** beside a discovered session to register its existing binding and ID in a workspace
|
|
29
31
|
using the same container. Sync includes these local registrations; they never run a create command.
|
|
30
32
|
Repository declarations take precedence when they declare the same binding. Legacy Docker shells cannot be adopted.
|
|
@@ -194,15 +194,48 @@ keybinds clear-defaults=true {
|
|
|
194
194
|
height "1%"
|
|
195
195
|
}
|
|
196
196
|
}
|
|
197
|
-
// These two
|
|
198
|
-
//
|
|
199
|
-
// at most 3 viewports)
|
|
200
|
-
//
|
|
201
|
-
//
|
|
202
|
-
//
|
|
203
|
-
|
|
204
|
-
//
|
|
205
|
-
|
|
197
|
+
// These two hand a key to the SIDEBAR (its filter and its upload strip need the keyboard there) and type
|
|
198
|
+
// nothing (cockpit v3 S4). Three MoveFocus "left" first: a workspace tab is [sidebar | view main | view b |
|
|
199
|
+
// view c] (wide views, at most 3 viewports), three lefts reach the sidebar from every viewport and zellij does
|
|
200
|
+
// not wrap at the left edge (tests/view.py). Then `lanes sidebar-key filter|upload --focused`, in a floating
|
|
201
|
+
// pane that closes when it exits (the next/prev block above), writes views/<device>/<ws>.sidebar.cmd for the
|
|
202
|
+
// sidebar of this tab; that sidebar acts on it within a tick, and always before the next key it reads. When
|
|
203
|
+
// the floating pane closes the focus is back on the sidebar. They used to end in WriteChars "/" / "U", which
|
|
204
|
+
// typed into whatever pane held the focus by then: on a tab without a sidebar (Host, Throttle, the phone's
|
|
205
|
+
// view tab) the pane itself, a shell or an agent's input. Such a tab now gets nothing.
|
|
206
|
+
bind "Ctrl Alt /" {
|
|
207
|
+
MoveFocus "left"
|
|
208
|
+
MoveFocus "left"
|
|
209
|
+
MoveFocus "left"
|
|
210
|
+
Run "lanes" "sidebar-key" "filter" "--focused" {
|
|
211
|
+
floating true
|
|
212
|
+
close_on_exit true
|
|
213
|
+
name "Lanes"
|
|
214
|
+
x "0%"
|
|
215
|
+
y "0%"
|
|
216
|
+
width "1%"
|
|
217
|
+
height "1%"
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// Arm the sidebar's upload strip, then drop files anywhere on the window (a drop = a paste into the focused pane).
|
|
221
|
+
bind "Ctrl Alt u" {
|
|
222
|
+
MoveFocus "left"
|
|
223
|
+
MoveFocus "left"
|
|
224
|
+
MoveFocus "left"
|
|
225
|
+
Run "lanes" "sidebar-key" "upload" "--focused" {
|
|
226
|
+
floating true
|
|
227
|
+
close_on_exit true
|
|
228
|
+
name "Lanes"
|
|
229
|
+
x "0%"
|
|
230
|
+
y "0%"
|
|
231
|
+
width "1%"
|
|
232
|
+
height "1%"
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// Focus the sidebar, nothing else (cockpit v3 S4): the same three lefts, so its keys can be used; the footer then
|
|
236
|
+
// says ` ▌ keys go to sidebar · Esc → lane`, and Esc (or any action) gives the keyboard back to the lane.
|
|
237
|
+
// Ctrl-Alt-s stays the session manager below.
|
|
238
|
+
bind "Ctrl Alt l" { MoveFocus "left"; MoveFocus "left"; MoveFocus "left"; }
|
|
206
239
|
bind "Ctrl Alt right" { GoToNextTab; }
|
|
207
240
|
bind "Ctrl Alt s" {
|
|
208
241
|
LaunchOrFocusPlugin "session-manager" {
|
|
@@ -216,6 +249,12 @@ keybinds clear-defaults=true {
|
|
|
216
249
|
// children are the pinned style, and test_ctrl_alt_m_is_the_multi_line_floating_run_block pins them. "lanes"
|
|
217
250
|
// is found on the view server's PATH
|
|
218
251
|
// (bin/lanes clean_env: this checkout's bin/), because this file is read in place, never rendered per host.
|
|
252
|
+
// Quick edit (W9 E1, LNS-95): Ctrl-Alt-e opens the focused lane's AGENTS.md, CLAUDE.md or .env.local in an editor
|
|
253
|
+
// inside its container, in the same floating geometry; the pane closes when the editor exits. Like the preview it
|
|
254
|
+
// is off while locked, so a locked view hands Ctrl-Alt-e to the lane. test_keybinds FloatingRunPanes pins both.
|
|
255
|
+
// Run has no single-instance form (LaunchOrFocus is for plugins only) and this bind fires whichever pane has the
|
|
256
|
+
// focus, so `lanes edit` is its own guard (DEF-1793): when another Edit pane is open it focuses or names that one
|
|
257
|
+
// and opens nothing. Its EDIT_PANE is this `name`; test_server_cli EditWiring pins the two together.
|
|
219
258
|
shared_except "locked" {
|
|
220
259
|
bind "Ctrl Alt m" {
|
|
221
260
|
Run "lanes" "preview" "--focused" {
|
|
@@ -228,6 +267,17 @@ keybinds clear-defaults=true {
|
|
|
228
267
|
height "90%"
|
|
229
268
|
}
|
|
230
269
|
}
|
|
270
|
+
bind "Ctrl Alt e" {
|
|
271
|
+
Run "lanes" "edit" "--focused" {
|
|
272
|
+
floating true
|
|
273
|
+
close_on_exit true
|
|
274
|
+
name "Edit"
|
|
275
|
+
x "10%"
|
|
276
|
+
y "5%"
|
|
277
|
+
width "80%"
|
|
278
|
+
height "90%"
|
|
279
|
+
}
|
|
280
|
+
}
|
|
231
281
|
}
|
|
232
282
|
shared_except "normal" "locked" {
|
|
233
283
|
bind "Alt left" { MoveFocusOrTab "left"; }
|
|
@@ -376,36 +426,36 @@ osc8_hyperlinks true
|
|
|
376
426
|
// BEGIN lanes tokens (generated by libexec/tokens.py --kdl; do not edit by hand)
|
|
377
427
|
themes {
|
|
378
428
|
lanes-dark {
|
|
379
|
-
text_unselected { base "#
|
|
380
|
-
text_selected { base "#
|
|
381
|
-
ribbon_selected { base "#101318"; background "#
|
|
382
|
-
ribbon_unselected { base "#
|
|
383
|
-
table_title { base "#
|
|
384
|
-
table_cell_selected { base "#
|
|
385
|
-
table_cell_unselected { base "#
|
|
386
|
-
list_selected { base "#
|
|
387
|
-
list_unselected { base "#
|
|
388
|
-
frame_selected { base "#
|
|
389
|
-
frame_highlight { base "#
|
|
390
|
-
exit_code_success { base "#
|
|
391
|
-
exit_code_error { base "#
|
|
392
|
-
multiplayer_user_colors { player_1 "#
|
|
429
|
+
text_unselected { base "#f2f5f8"; background "#101318"; emphasis_0 "#ffc233"; emphasis_1 "#5fdc8a"; emphasis_2 "#8fe3a6"; emphasis_3 "#6fb6ff"; }
|
|
430
|
+
text_selected { base "#f2f5f8"; background "#1c3326"; emphasis_0 "#ffc233"; emphasis_1 "#5fdc8a"; emphasis_2 "#8fe3a6"; emphasis_3 "#6fb6ff"; }
|
|
431
|
+
ribbon_selected { base "#101318"; background "#8fe3a6"; emphasis_0 "#7a1a12"; emphasis_1 "#101318"; emphasis_2 "#101318"; emphasis_3 "#101318"; }
|
|
432
|
+
ribbon_unselected { base "#a6b1be"; background "#191e25"; emphasis_0 "#ff7b6e"; emphasis_1 "#f2f5f8"; emphasis_2 "#ffc233"; emphasis_3 "#6fb6ff"; }
|
|
433
|
+
table_title { base "#8fe3a6"; background "#101318"; emphasis_0 "#ffc233"; emphasis_1 "#5fdc8a"; emphasis_2 "#8fe3a6"; emphasis_3 "#6fb6ff"; }
|
|
434
|
+
table_cell_selected { base "#f2f5f8"; background "#1c3326"; emphasis_0 "#ffc233"; emphasis_1 "#5fdc8a"; emphasis_2 "#8fe3a6"; emphasis_3 "#6fb6ff"; }
|
|
435
|
+
table_cell_unselected { base "#f2f5f8"; background "#101318"; emphasis_0 "#ffc233"; emphasis_1 "#5fdc8a"; emphasis_2 "#8fe3a6"; emphasis_3 "#6fb6ff"; }
|
|
436
|
+
list_selected { base "#f2f5f8"; background "#1c3326"; emphasis_0 "#ffc233"; emphasis_1 "#5fdc8a"; emphasis_2 "#8fe3a6"; emphasis_3 "#6fb6ff"; }
|
|
437
|
+
list_unselected { base "#f2f5f8"; background "#101318"; emphasis_0 "#ffc233"; emphasis_1 "#5fdc8a"; emphasis_2 "#8fe3a6"; emphasis_3 "#6fb6ff"; }
|
|
438
|
+
frame_selected { base "#8fe3a6"; background "#101318"; emphasis_0 "#ffc233"; emphasis_1 "#5fdc8a"; emphasis_2 "#6fb6ff"; emphasis_3 "#ff7b6e"; }
|
|
439
|
+
frame_highlight { base "#ffc233"; background "#101318"; emphasis_0 "#ff7b6e"; emphasis_1 "#5fdc8a"; emphasis_2 "#8fe3a6"; emphasis_3 "#6fb6ff"; }
|
|
440
|
+
exit_code_success { base "#5fdc8a"; background "#101318"; emphasis_0 "#5fdc8a"; emphasis_1 "#5fdc8a"; emphasis_2 "#5fdc8a"; emphasis_3 "#5fdc8a"; }
|
|
441
|
+
exit_code_error { base "#ff7b6e"; background "#101318"; emphasis_0 "#ff7b6e"; emphasis_1 "#ff7b6e"; emphasis_2 "#ff7b6e"; emphasis_3 "#ff7b6e"; }
|
|
442
|
+
multiplayer_user_colors { player_1 "#6fb6ff"; player_2 "#ffc233"; player_3 "#5fdc8a"; player_4 "#ff7b6e"; player_5 "#8fe3a6"; player_6 "#c58bff"; player_7 "#3fd9cf"; player_8 "#ffd866"; player_9 "#86f0ad"; player_10 "#ff9a8e"; }
|
|
393
443
|
}
|
|
394
444
|
lanes-light {
|
|
395
|
-
text_unselected { base "#
|
|
396
|
-
text_selected { base "#
|
|
397
|
-
ribbon_selected { base "#ffffff"; background "#
|
|
398
|
-
ribbon_unselected { base "#
|
|
399
|
-
table_title { base "#
|
|
400
|
-
table_cell_selected { base "#
|
|
401
|
-
table_cell_unselected { base "#
|
|
402
|
-
list_selected { base "#
|
|
403
|
-
list_unselected { base "#
|
|
404
|
-
frame_selected { base "#
|
|
405
|
-
frame_highlight { base "#
|
|
406
|
-
exit_code_success { base "#
|
|
407
|
-
exit_code_error { base "#
|
|
408
|
-
multiplayer_user_colors { player_1 "#
|
|
445
|
+
text_unselected { base "#111a14"; background "#f3f5f2"; emphasis_0 "#a04d00"; emphasis_1 "#0d7338"; emphasis_2 "#1f6f3f"; emphasis_3 "#1a56c4"; }
|
|
446
|
+
text_selected { base "#111a14"; background "#e5f0e6"; emphasis_0 "#a04d00"; emphasis_1 "#0d7338"; emphasis_2 "#1f6f3f"; emphasis_3 "#1a56c4"; }
|
|
447
|
+
ribbon_selected { base "#ffffff"; background "#1f6f3f"; emphasis_0 "#ffd3cc"; emphasis_1 "#ffffff"; emphasis_2 "#ffffff"; emphasis_3 "#ffffff"; }
|
|
448
|
+
ribbon_unselected { base "#4a5661"; background "#ffffff"; emphasis_0 "#c41c1c"; emphasis_1 "#111a14"; emphasis_2 "#a04d00"; emphasis_3 "#1a56c4"; }
|
|
449
|
+
table_title { base "#1f6f3f"; background "#f3f5f2"; emphasis_0 "#a04d00"; emphasis_1 "#0d7338"; emphasis_2 "#1f6f3f"; emphasis_3 "#1a56c4"; }
|
|
450
|
+
table_cell_selected { base "#111a14"; background "#e5f0e6"; emphasis_0 "#a04d00"; emphasis_1 "#0d7338"; emphasis_2 "#1f6f3f"; emphasis_3 "#1a56c4"; }
|
|
451
|
+
table_cell_unselected { base "#111a14"; background "#f3f5f2"; emphasis_0 "#a04d00"; emphasis_1 "#0d7338"; emphasis_2 "#1f6f3f"; emphasis_3 "#1a56c4"; }
|
|
452
|
+
list_selected { base "#111a14"; background "#e5f0e6"; emphasis_0 "#a04d00"; emphasis_1 "#0d7338"; emphasis_2 "#1f6f3f"; emphasis_3 "#1a56c4"; }
|
|
453
|
+
list_unselected { base "#111a14"; background "#f3f5f2"; emphasis_0 "#a04d00"; emphasis_1 "#0d7338"; emphasis_2 "#1f6f3f"; emphasis_3 "#1a56c4"; }
|
|
454
|
+
frame_selected { base "#1f6f3f"; background "#f3f5f2"; emphasis_0 "#a04d00"; emphasis_1 "#0d7338"; emphasis_2 "#1a56c4"; emphasis_3 "#c41c1c"; }
|
|
455
|
+
frame_highlight { base "#a04d00"; background "#f3f5f2"; emphasis_0 "#c41c1c"; emphasis_1 "#0d7338"; emphasis_2 "#1f6f3f"; emphasis_3 "#1a56c4"; }
|
|
456
|
+
exit_code_success { base "#0d7338"; background "#f3f5f2"; emphasis_0 "#0d7338"; emphasis_1 "#0d7338"; emphasis_2 "#0d7338"; emphasis_3 "#0d7338"; }
|
|
457
|
+
exit_code_error { base "#c41c1c"; background "#f3f5f2"; emphasis_0 "#c41c1c"; emphasis_1 "#c41c1c"; emphasis_2 "#c41c1c"; emphasis_3 "#c41c1c"; }
|
|
458
|
+
multiplayer_user_colors { player_1 "#1a56c4"; player_2 "#a04d00"; player_3 "#0d7338"; player_4 "#c41c1c"; player_5 "#1f6f3f"; player_6 "#8228c4"; player_7 "#006f73"; player_8 "#a85200"; player_9 "#0e7a3a"; player_10 "#d0221a"; }
|
|
409
459
|
}
|
|
410
460
|
}
|
|
411
461
|
theme_dark "lanes-dark"
|
|
@@ -414,25 +464,25 @@ web_client {
|
|
|
414
464
|
font "monospace"
|
|
415
465
|
theme {
|
|
416
466
|
background "#101318"
|
|
417
|
-
foreground "#
|
|
418
|
-
black "#
|
|
419
|
-
red "#
|
|
420
|
-
green "#
|
|
421
|
-
yellow "#
|
|
422
|
-
blue "#
|
|
423
|
-
magenta "#
|
|
424
|
-
cyan "#
|
|
425
|
-
white "#
|
|
426
|
-
bright_black "#
|
|
427
|
-
bright_red "#
|
|
428
|
-
bright_green "#
|
|
429
|
-
bright_yellow "#
|
|
430
|
-
bright_blue "#
|
|
431
|
-
bright_magenta "#
|
|
432
|
-
bright_cyan "#
|
|
433
|
-
bright_white "#
|
|
434
|
-
selection_background "#
|
|
435
|
-
selection_foreground "#
|
|
467
|
+
foreground "#f2f5f8"
|
|
468
|
+
black "#8792a0"
|
|
469
|
+
red "#ff7b6e"
|
|
470
|
+
green "#5fdc8a"
|
|
471
|
+
yellow "#ffc233"
|
|
472
|
+
blue "#6fb6ff"
|
|
473
|
+
magenta "#c58bff"
|
|
474
|
+
cyan "#3fd9cf"
|
|
475
|
+
white "#a6b1be"
|
|
476
|
+
bright_black "#97a3b1"
|
|
477
|
+
bright_red "#ff9a8e"
|
|
478
|
+
bright_green "#86f0ad"
|
|
479
|
+
bright_yellow "#ffd866"
|
|
480
|
+
bright_blue "#98cbff"
|
|
481
|
+
bright_magenta "#dcb2ff"
|
|
482
|
+
bright_cyan "#7deee6"
|
|
483
|
+
bright_white "#f2f5f8"
|
|
484
|
+
selection_background "#1c3326"
|
|
485
|
+
selection_foreground "#f2f5f8"
|
|
436
486
|
}
|
|
437
487
|
}
|
|
438
488
|
// END lanes tokens
|
package/payload/manifest.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibelord/lanes",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"commit": "
|
|
5
|
-
"digest": "sha256:
|
|
3
|
+
"version": "1.2.0",
|
|
4
|
+
"commit": "d7718161405f7bd8a7ab6144b61a9edb550f4500",
|
|
5
|
+
"digest": "sha256:e67fcdfbd2a64b636d204f007e453989e601231d0c06348a66b066df534d9fee",
|
|
6
6
|
"executables": [
|
|
7
7
|
"bin/lanes",
|
|
8
8
|
"client/install.sh",
|
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
"client/lanes-window",
|
|
12
12
|
"client/omarchy/discover.sh",
|
|
13
13
|
"container/lane",
|
|
14
|
+
"container/lane-edit",
|
|
15
|
+
"container/lane-mcp",
|
|
14
16
|
"container/lane-run",
|
|
15
17
|
"container/lane-signal",
|
|
16
18
|
"holders/exec.sh",
|