v0.7.0 36c429d

ci.yml RawHistoryFolder

1name: CI
2
3on:
4  push:
5    branches: [main]
6    paths:
7      - '**.go'
8      - '**.js'
9      - '**.css'
10      - 'go.mod'
11      - 'go.sum'
12      - 'package.json'
13      - 'package-lock.json'
14      - 'internal/htmlharness/**'
15      - '.golangci.yml'
16      - '.github/workflows/**'
17  pull_request:
18    paths:
19      - '**.go'
20      - '**.js'
21      - '**.css'
22      - 'go.mod'
23      - 'go.sum'
24      - 'package.json'
25      - 'package-lock.json'
26      - 'internal/htmlharness/**'
27      - '.golangci.yml'
28      - '.github/workflows/**'
29
30permissions:
31  contents: read
32
33jobs:
34  ci:
35    permissions:
36      contents: read
37      pull-requests: read
38    uses: bnema/gh-actions/.github/workflows/go-ci.yml@bdc22c9d0e0527bd1c369d4304034cdf2cde9ade # main
39    with:
40      go-version: stable
41      test-flags: '-race -v ./...'
42
43  browser:
44    runs-on: ubuntu-latest
45    timeout-minutes: 20
46    steps:
47      - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
48        with:
49          persist-credentials: false
50      - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
51        with:
52          node-version: '24'
53          cache: npm
54      - run: npm ci
55      - run: npx playwright install --with-deps chromium firefox webkit
56      - run: npm run test:browser
57      - if: always()
58        uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
59        with:
60          name: browser-evidence
61          path: test-results/
62          retention-days: 14
63
64  quality:
65    needs: [ci, browser]
66    runs-on: ubuntu-latest
67    steps:
68      - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
69        with:
70          persist-credentials: false
71      - uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7
72        with:
73          go-version: stable
74      - name: Check production import direction
75        shell: bash
76        run: |
77          if go list -f '{{join .Imports "\n"}}' . | grep -q '/ansi'; then
78            echo 'the VT root must not import the ANSI package'
79            exit 1
80          fi
81          if ! go list -f '{{join .Imports "\n"}}' ./ansi | grep -q '/core'; then
82            echo 'the ANSI package must consume the core model'
83            exit 1
84          fi
85          if ! go list -f '{{join .Imports "\n"}}' ./html | grep -q '/core'; then
86            echo 'the HTML package must consume the core model'
87            exit 1
88          fi
89          if ! go list -f '{{join .Imports "\n"}}' ./html/browser | grep -q '/html'; then
90            echo 'the browser adapter must consume the HTML package'
91            exit 1
92          fi
93          forbidden="$(go list -deps ./html/... | grep -E '^(github\.com/bnema/vev-vt$|github\.com/bnema/vev($|/)|net/http$|.*/websocket($|/))' || true)"
94          if [ -n "$forbidden" ]; then
95            echo "$forbidden"
96            exit 1
97          fi
98      - name: VT fuzz smoke
99        run: go test . -run '^$' -fuzz FuzzVTInputDoesNotPanic -fuzztime=10s
100      - name: ANSI fuzz smoke
101        run: go test . -run '^$' -fuzz FuzzANSIRenderingDoesNotPanic -fuzztime=10s
102      - name: VTH3 fuzz smoke
103        run: go test . -run '^$' -fuzz FuzzHistoryPreflightMatchesUnmarshal -fuzztime=10s
104      - name: HTML event fuzz smoke
105        run: go test ./html/browser -run '^$' -fuzz FuzzDecodeEvent -fuzztime=10s
106      - name: Benchmark smoke
107        run: go test ./... -run '^$' -bench='(VT|History|Snapshot|ANSI|Renderer)' -benchmem -benchtime=1x
108      - name: External consumer smoke
109        run: scripts/consumer-smoke.sh

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 2

Tags 13

↑↓ moveenter openesc close