v0.7.0 4c16dd8

README.md RawHistoryFolder

Demo and sandbox scripts

  • run.sh, demo.tape, smoke.tape, compose.demo.yaml: VHS demo recording (make demo). One remote container, remote-a.
  • sandbox-run.sh: automated acceptance. Client and two remotes all run in containers on an internal network.
  • test-remotes.sh: two containerised remotes for manual testing from your own terminal.

All of them build build/vev and bake it into the scripts/demo/Dockerfile image, so local and remote vev are the same binary. Docker must be rootless.

Manual remote testing

scripts/demo/test-remotes.sh up       # build, start remote-a/remote-b, register both hosts
scripts/demo/test-remotes.sh shell    # print the client command
scripts/demo/test-remotes.sh status   # containers, ports, vev host list, vev ls --all
scripts/demo/test-remotes.sh broker-restart  # stop only the test broker; the next vev call respawns it
scripts/demo/test-remotes.sh down     # stop the test broker/daemon, remove containers and keys

Run the printed command from a real terminal, or scripts/demo/test-remotes.sh shell --exec [vev args]. It sets:

  • VEV_ENV=test and VEV_ENV_ROOT=<checkout>/.dev: all vev state lives in .dev/test/, apart from your installed vev.
  • PATH=.dev/test/bin:$PATH: vev runs ssh from PATH and has no ssh config option, so .dev/test/bin/ssh wraps the real client with -F .dev/test/ssh/config. The key, known_hosts and config are generated in .dev/test/ssh/. ~/.ssh and your agent are never used.
  • vev host add --transport ssh: hosts are registered with the SSH-only carriage. QUIC cannot work here. The remote proxy listens on a random UDP port, and the client dials that port on the SSH target name (remote-a), which does not resolve to the loopback port mapping.
  • -u VEV: a client started from a pane of your real vev is not treated as nested.

sshd is published on 127.0.0.1:2222 (remote-a) and 127.0.0.1:2223 (remote-b). Override the ports with VEV_TEST_SSH_PORT_A and VEV_TEST_SSH_PORT_B, and the environment name with VEV_TEST_ENV. Plain shell access: .dev/test/bin/ssh remote-a.

up is idempotent: it recreates the containers, reinstalls the key and skips hosts that are already registered. A VEV_ENV=test broker started by an older build keeps running until it is stopped, and up warns when it finds one. Run down then up after a rebuild. down stops every VEV_ENV=test daemon of this checkout, including sessions you opened there by hand.

Remote sessions live in the containers and disappear on down.

Checklist

Open a few sessions first, with at least two tabs in one of them, local and on each remote: vev new work, vev new ra remote-a, vev new rb remote-b (each run with the environment above).

  • Picker over a session (Alt+Space, SSP): opens over the live session; Esc returns to the same session, tab and pane.
  • Move pane (MFP) and move tab (MAT): the destination picker lists local and remote sessions and tabs; the move lands where you chose.
  • x in the picker kills the selected session (local and remote); the row disappears and vev ls --all agrees.
  • Tab rows: expand a session and see one row per tab, with the right names and active marker. Selecting a tab row lands on that tab.
  • MRU order: switch A → B → C, reopen the picker, and check the order is C, B, A.
  • Bell icons: in a background tab or session run sleep 2; printf '\a', switch away, and check that the bell icon shows on that session and tab row. It clears once you visit it. Try it on a remote session too.
  • Live preview: moving the cursor over a local session, then over a remote one, shows its current screen. Run ticker there to check that the preview updates live.
  • Remote attach and switch: vev attach demo@remote-a:<session> from the shell (this also adds the learned target demo@remote-a), then switch between local, remote-a and remote-b sessions from the picker without dropping input or output.
  • Broker restart: scripts/demo/test-remotes.sh broker-restart stops only the test broker. Reopen the picker from a running client and check that hosts and sessions come back.
source
1# Demo and sandbox scripts
2
3- `run.sh`, `demo.tape`, `smoke.tape`, `compose.demo.yaml`: VHS demo recording
4  (`make demo`). One remote container, `remote-a`.
5- `sandbox-run.sh`: automated acceptance. Client and two remotes all run in
6  containers on an internal network.
7- `test-remotes.sh`: two containerised remotes for manual testing from your own
8  terminal.
9
10All of them build `build/vev` and bake it into the `scripts/demo/Dockerfile`
11image, so local and remote vev are the same binary. Docker must be rootless.
12
13## Manual remote testing
14
15```sh
16scripts/demo/test-remotes.sh up       # build, start remote-a/remote-b, register both hosts
17scripts/demo/test-remotes.sh shell    # print the client command
18scripts/demo/test-remotes.sh status   # containers, ports, vev host list, vev ls --all
19scripts/demo/test-remotes.sh broker-restart  # stop only the test broker; the next vev call respawns it
20scripts/demo/test-remotes.sh down     # stop the test broker/daemon, remove containers and keys
21```
22
23Run the printed command from a real terminal, or `scripts/demo/test-remotes.sh
24shell --exec [vev args]`. It sets:
25
26- `VEV_ENV=test` and `VEV_ENV_ROOT=<checkout>/.dev`: all vev state lives in
27  `.dev/test/`, apart from your installed vev.
28- `PATH=.dev/test/bin:$PATH`: vev runs `ssh` from `PATH` and has no ssh config
29  option, so `.dev/test/bin/ssh` wraps the real client with
30  `-F .dev/test/ssh/config`. The key, `known_hosts` and config are generated in
31  `.dev/test/ssh/`. `~/.ssh` and your agent are never used.
32- `vev host add --transport ssh`: hosts are registered with the SSH-only carriage.
33  QUIC cannot work here. The remote proxy listens on a random UDP port, and
34  the client dials that port on the SSH target name (`remote-a`), which does
35  not resolve to the loopback port mapping.
36- `-u VEV`: a client started from a pane of your real vev is not treated as
37  nested.
38
39sshd is published on `127.0.0.1:2222` (remote-a) and `127.0.0.1:2223`
40(remote-b). Override the ports with `VEV_TEST_SSH_PORT_A` and
41`VEV_TEST_SSH_PORT_B`, and the environment name with `VEV_TEST_ENV`. Plain
42shell access: `.dev/test/bin/ssh remote-a`.
43
44`up` is idempotent: it recreates the containers, reinstalls the key and
45skips hosts that are already registered. A `VEV_ENV=test` broker started by an
46older build keeps running until it is stopped, and `up` warns when it finds
47one. Run `down` then `up` after a rebuild. `down` stops **every**
48`VEV_ENV=test` daemon of this checkout, including sessions you opened
49there by hand.
50
51Remote sessions live in the containers and disappear on `down`.
52
53### Checklist
54
55Open a few sessions first, with at least two tabs in one of them, local and on
56each remote: `vev new work`, `vev new ra remote-a`, `vev new rb remote-b`
57(each run with the environment above).
58
59- [ ] Picker over a session (`Alt+Space`, `SSP`): opens over the live
60      session; `Esc` returns to the same session, tab and pane.
61- [ ] Move pane (`MFP`) and move tab (`MAT`): the destination picker lists
62      local and remote sessions and tabs; the move lands where you chose.
63- [ ] `x` in the picker kills the selected session (local and remote); the
64      row disappears and `vev ls --all` agrees.
65- [ ] Tab rows: expand a session and see one row per tab, with the right names
66      and active marker. Selecting a tab row lands on that tab.
67- [ ] MRU order: switch A → B → C, reopen the picker, and check the order is
68      C, B, A.
69- [ ] Bell icons: in a background tab or session run `sleep 2; printf '\a'`,
70      switch away, and check that the bell icon shows on that session and tab
71      row. It clears once you visit it. Try it on a remote session too.
72- [ ] Live preview: moving the cursor over a local session, then over a remote
73      one, shows its current screen. Run `ticker` there to check that the
74      preview updates live.
75- [ ] Remote attach and switch: `vev attach demo@remote-a:<session>` from
76      the shell (this also adds the learned target `demo@remote-a`), then
77      switch between local, remote-a and remote-b sessions from the picker
78      without dropping input or output.
79- [ ] Broker restart: `scripts/demo/test-remotes.sh broker-restart` stops only
80      the test broker. Reopen the picker from a running client and check that
81      hosts and sessions come back.

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 12

Tags 11

↑↓ moveenter openesc close