v0.2.0 e178e0b

AGENTS.md RawHistoryFolder

Repository rules

  • Go 1.27 only. Normal builds/tests use CGO_ENABLED=0; race tests use CGO_ENABLED=1.
  • Library: return errors, never log. No application policy (shortcuts, which outputs to cover, when to lock).
  • Owner goroutine: only the reader and the epoll waker run concurrently; all state changes happen in Dispatch on the caller's goroutine.
  • Zero allocations in steady state (dispatch, present, release, key). Guard every hot path with a TestAlloc* test using testing.AllocsPerRun; make perf-check runs them.
  • Mockery v3 testify generated mocks only; no handwritten fakes/stubs/spies. Public interfaces get mocks in mocks/; unexported seams get same-package *_mock_test.go. Add .mockery.yml entries and run make mocks-check.
  • Secrets never become string, never reach logs, errors or KeyEvent.Text; scratch buffers are wiped after use.
  • Signed conventional commits only. No push, tag or release without authorization.
  • Local development resolves sibling modules through a gitignored go.work; committed go.mod never contains replace.
source
1# Repository rules
2
3- Go 1.27 only. Normal builds/tests use CGO_ENABLED=0; race tests use CGO_ENABLED=1.
4- Library: return errors, never log. No application policy (shortcuts, which outputs to cover, when to lock).
5- Owner goroutine: only the reader and the epoll waker run concurrently; all state changes happen in `Dispatch` on the caller's goroutine.
6- Zero allocations in steady state (dispatch, present, release, key). Guard every hot path with a `TestAlloc*` test using `testing.AllocsPerRun`; `make perf-check` runs them.
7- Mockery v3 testify generated mocks only; no handwritten fakes/stubs/spies. Public interfaces get mocks in `mocks/`; unexported seams get same-package `*_mock_test.go`. Add `.mockery.yml` entries and run `make mocks-check`.
8- Secrets never become `string`, never reach logs, errors or `KeyEvent.Text`; scratch buffers are wiped after use.
9- Signed conventional commits only. No push, tag or release without authorization.
10- Local development resolves sibling modules through a gitignored `go.work`; committed `go.mod` never contains `replace`.

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 1

Tags 4

↑↓ moveenter openesc close