Releases: mirivlad/sshkeeper
Release list
sshkeeper v0.3.2
Release automation and reproducible packaging. sshkeeper itself behaves exactly
as in v0.3.1 — no functional changes to the TUI or the CLI.
This is also the first release published by GitHub Actions rather than by hand.
In this release
Archives are now reproducible. Rebuilding a tag on a different machine used
to produce different checksums even when every packaged file was byte-identical,
because three host properties leaked into the archives:
| Leak | Effect |
|---|---|
| File modes followed the builder's umask | umask 002 packaged 664/775, umask 022 packaged 644/755 |
sort orders entries by locale |
a ru_RU.UTF-8 host emitted docs/ before LICENSE, a C locale the reverse |
| zip stores DOS local time with no zone | the same commit embedded 19:06 at UTC+08 and 11:06 at UTC |
All three are pinned now. A build on ubuntu-latest and one on a workstation
with a different umask, locale and timezone produce identical checksums for all
five archives. The binaries were always reproducible; only the packaging varied.
CI. The repository previously had no automation. It now runs gofmt,
go vet and go test on Linux and macOS for every push and pull request,
plus a cross-build of all five release targets. macOS is a stated release
target that until now was only ever cross-compiled, never tested.
Releases are automated. Pushing a v* tag runs the release checks, builds
through the same release.sh used locally, and publishes. Nightly builds from
main are published as a separate nightly prerelease, so the Latest badge
always points at a real release.
Everything since v0.2.0
Breaking change: full help moved off F1
Ctrl+H opens full help. F1 no longer has any binding. ? still opens
contextual quick help outside text editors. This landed in v0.3.0.
Ctrl+H is the BS control character (0x08). xterm and most modern emulators
send DEL (0x7F) for Backspace, so help and text editing do not collide. A
terminal configured to send BS for Backspace cannot tell them apart; switch it
to DEL (in xterm, backarrowKey: false).
Nothing else requires action when upgrading. Vaults, server profiles and stored
port forwards are unchanged, and no migration runs.
The TUI was rebuilt around one shell (v0.3.0)
In v0.2.0 only the server dashboard had a real layout. Other screens rendered
free-form strings or the default Bubbles list frame, so they had no shared
width budget, no borders, and footers that floated wherever the content ended.
Every full-screen state now shares one contract: a header with breadcrumb and
truthful vault status, a separator, framed content panels, and a contextual
footer anchored to the last terminal row.
- Actions, search, tag input, confirmations and both help screens render inside
the shell. - The port forward manager and editor use framed, width-budgeted layouts. Column
widths derive from the panel's inner width, so no row consumes the terminal's
last column. - Tag, command template, template picker/mode/results and tunnel managers use
framed lists with a>selection marker, so selection never depends on colour
alone. - Server and template editors use a framed form panel with the title moved into
the breadcrumb. Required markers, validation and dirty-state confirmation are
unchanged.
Responsive layouts. The supported floor is 60x16. Wide (100+ columns)
shows two panels, medium (70–99) stacks them, narrow (60–69) keeps a single
compact panel. Below the floor only the minimum-size message renders. Long
ASCII, Cyrillic, CJK, combining and emoji content truncates by display cells
rather than byte count.
Safety. Destructive actions confirm with Cancel selected first and name the
exact target and its consequence. Status and help context stay truthful to
actual vault and connection state. Form validation prevents silent loss of
edits.
forward add was completely broken (fixed in v0.3.1)
sshkeeper forward add could never succeed in v0.2.0 or v0.3.0. The command
read --local-port and marked it required, but the flag was never registered,
so cobra rejected it as unknown and the value fell back to 0:
$ sshkeeper forward add web --type local --local-port 15432 \
--remote-addr 127.0.0.1 --remote-port 5432
unknown flag: --local-port
No combination of arguments worked. Both documented forms work now:
$ sshkeeper forward add web --name "Local PostgreSQL" --type local \
--local-port 15432 --remote-addr db01.internal.example.com --remote-port 5432
✓ Forward added [1]
$ sshkeeper forward add web --name "SOCKS proxy" --type dynamic --local-port 1080
✓ Forward added [2]
Omitting the flag now reports required flag(s) "local-port" not set instead of
a misleading port-range error. The TUI (Ctrl+W) was never affected.
The command's tests had constructed their own throwaway cobra command and
registered the flags by hand, so the real command's registration was never
exercised and the suite passed against a broken command. Coverage now parses
argv into the actual command. An audit of every other command found no further
flag that is read but never registered.
Also fixed since v0.2.0
- Port forward fields accept digits correctly (
10bcc07). - Platform and repository status are stated accurately in the docs: Linux and
macOS are primary release targets, Windows is experimental.
Release-by-release
| Version | Contents |
|---|---|
| v0.3.0 | Unified TUI shell, responsive layouts, F1 → Ctrl+H |
| v0.3.1 | forward add fix |
| v0.3.2 | Reproducible packaging, CI, automated releases |
Install
tar -xzf sshkeeper_v0.3.2_linux_amd64.tar.gz
sudo install -m 0755 sshkeeper_v0.3.2_linux_amd64/sshkeeper /usr/local/bin/sshkeeperVerify downloads against checksums.txt. Linux and macOS are the primary
release targets; the Windows build is experimental and needs OpenSSH Client
available as ssh.exe on PATH.
To verify a build yourself, check out the tag and run ./release.sh v0.3.2 —
the checksums should match this release exactly, given the same Go version.
sshkeeper v0.3.1
Bug-fix release. No TUI or behaviour changes beyond the fix below.
Fixed: forward add was unusable from the CLI
sshkeeper forward add could never succeed. The command read --local-port
and marked it required, but the flag was never registered, so cobra rejected it
as an unknown option and the value fell back to 0:
$ sshkeeper forward add web --name "Local PostgreSQL" --type local \
--local-port 15432 --remote-addr 127.0.0.1 --remote-port 5432
unknown flag: --local-port
$ sshkeeper forward add web --name "Local PostgreSQL" --type local \
--remote-addr 127.0.0.1 --remote-port 5432
invalid local port 0: must be 1-65535
No combination of arguments worked. Both forms now behave as documented:
$ sshkeeper forward add web --name "Local PostgreSQL" --type local \
--local-port 15432 --remote-addr db01.internal.example.com --remote-port 5432
✓ Forward added [1]
$ sshkeeper forward add web --name "SOCKS proxy" --type dynamic --local-port 1080
✓ Forward added [2]
Omitting the flag now produces required flag(s) "local-port" not set instead
of the misleading port-range error.
This affects v0.2.0 and v0.3.0. If you script port forwards, upgrade. The
TUI (Ctrl+W) was never affected, and stored forwards are untouched — this is
purely a CLI argument-parsing fix, so no migration is needed.
Why it went unnoticed
The command's tests constructed their own throwaway cobra command, registered
the flags on it by hand, and passed that to the real RunE. The actual
command's flag registration was therefore never exercised, and the tests passed
against a completely broken command. This release adds coverage that parses
argv into the real command's own flag set, plus a check pinning the required
annotation; both fail against the unfixed code with unknown flag: --local-port. An audit of the remaining commands found no other flag that is
read but never registered.
Install
tar -xzf sshkeeper_v0.3.1_linux_amd64.tar.gz
sudo install -m 0755 sshkeeper_v0.3.1_linux_amd64/sshkeeper /usr/local/bin/sshkeeperVerify downloads against checksums.txt. Linux and macOS are the primary
release targets; Windows is experimental.
sshkeeper v0.3.0
sshkeeper v0.3.0 brings every TUI screen up to the standard of the server
dashboard, and moves full help off F1.
Changed key binding
Ctrl+H now opens full help. F1 no longer has any binding. ? still
opens contextual quick help outside text editors.
Ctrl+H is the BS control character (0x08). xterm and most modern emulators
send DEL (0x7F) for Backspace, so help and text editing do not collide. A
terminal configured to send BS for Backspace cannot tell the two apart; switch
it to DEL (in xterm, backarrowKey: false).
Unified screen shell
Every full-screen state now shares one vertical contract: a header with
breadcrumb and truthful vault status, a separator, framed content panels, and a
contextual footer anchored to the last terminal row. Screens no longer render
free-form strings or the default Bubbles list frame.
- Actions, help, search, tag input and confirmations render inside the shell.
- Port forward manager and editor use framed, width-budgeted layouts; column
widths derive from panel inner width, so no row consumes the last column. - Tag, command template, template picker/mode/results and tunnel managers use
framed lists with a>selection marker that does not rely on colour alone. - Server and template editors use a framed form panel with the title moved into
the breadcrumb; required markers, validation and dirty-state confirmation are
unchanged.
Responsive layouts
Supported floor is 60x16. Wide (100+ columns) shows two panels, medium
(70-99) stacks them, narrow (60-69) keeps a single compact panel. Below the
floor only the minimum-size message renders. Long ASCII, Cyrillic, CJK,
combining and emoji content truncates by display cells.
Safety and correctness
- Destructive actions confirm with Cancel selected first, naming the exact
target and its consequence. - Status and help context stay truthful to actual vault and connection state.
- Port forward fields accept digits correctly.
- Form validation and edit protection prevent silent loss of changes.
Verification
go test ./... and go vet ./... pass. Layout coverage renders every value of
the screen enum at 120x40, 80x24 and 60x16 and asserts ANSI-aware display
width, exact height, border presence and bottom-anchored footer. Runtime checks
in a real xterm confirm Ctrl+H opens help while Backspace still edits text.
Install
tar -xzf sshkeeper_v0.3.0_linux_amd64.tar.gz
sudo install -m 0755 sshkeeper_v0.3.0_linux_amd64/sshkeeper /usr/local/bin/sshkeeperVerify downloads against checksums.txt. Linux and macOS are the primary
release targets; Windows is experimental.
Known issue
sshkeeper forward add cannot be used from the CLI: the --local-port option
was never registered on the command, so every invocation fails with
invalid local port 0. This also affects v0.2.0. Port forwards can be managed
from the TUI (Ctrl+W) in the meantime.
sshkeeper v0.2.0
sshkeeper v0.2.0
Release artifacts:
- Linux: linux/amd64 and linux/arm64 tar.gz
- macOS: darwin/amd64 and darwin/arm64 tar.gz
- Windows: windows/amd64 zip, experimental
Platform status:
- Primary target: Linux
- macOS builds require the system ssh client
- Windows build is experimental and requires OpenSSH Client available as ssh.exe in PATH
Verify downloads with:
sha256sum -c checksums.txt