v0.1.1
Quality, tooling, and documentation hardening. No new features and no behavior
changes (one concurrency bug fixed).
Added
- CI quality gates —
lint(golangci-lint v2),gosec, andgovulncheck
jobs, mirrored locally bymake ci. gosec runs through thesetup-go
toolchain so CI matches local exactly. - Cyclomatic-complexity gate —
gocyclo(min-complexity 15) added to the
lint config; every function is now ≤15 (Go Report Card A+). - CodeQL advanced setup — a workflow + config carrying a query-filter for the
intentional, opt-in--insecurehost-key path. - Coverage tooling —
make cover/make cover-html; aCoverageworkflow
publishing a self-hosted shields badge (no external service); and a CI coverage
report with a 50% regression floor and a sticky per-package PR comment. RELEASING.md— maintainer guide for cutting a release.
Changed
- Reduced every function above cyclomatic complexity 15 to ≤15 via dispatch
tables and helper extraction, with no change in behavior. - Standardized tests — external black-box packages, table-driven, positive-then-
error ordering — and raised total coverage from 35.6% to 66.9%. - Relaxed the
go.moddirective togo 1.26(minor granularity).
Fixed
- License detection — replaced
LICENSEwith the canonical Apache-2.0 text
so pkg.go.dev reports Apache-2.0 instead of "UNKNOWN". - SSH client data race —
sshx.Client.Closereassigned thedonechannel
while the keepalive goroutine read it;Closenow closes the channel once via
sync.Onceand never reassigns it, so it is race-free and idempotent.
Security
- Added audited
//#nosecdirectives for the intentional paths: G106
(--insecureopt-in), G304 (reads from kay's own key/config store), and G306
(world-readable.pub).