v1.5.0
The Helm release. A Helm release becomes km8's 27th resource type and
plugs into the same Relatives / drill / breadcrumb / Y popup machinery
every other resource uses — the divergence is that the fetcher shells
out to helm instead of going through client-go. Registered at startup
only when helm is on PATH; otherwise the entire Helm > Releases
sidebar category never renders and an app-log INFO surfaces.
Beyond Helm, this release polishes search semantics across all three
panels (only the source panel's filter clears on focus leave; cursors
restore to last selection) and removes the panel-3 search entirely
(cursor-driven tabs didn't tolerate filter; "find a string in logs"
goes via Y + your editor).
Added
- Helm Releases category —
Helm > Releasesin the sidebar. Lists
every release in the cluster viahelm list -o json, polled every 3s
(no Helm watch API; the poller fakes awatch.Modifiedevent into
the existing watcher loop so externalhelm install/upgrade
surfaces within seconds without busy-spinning the CLI). Columns:
NAME / NAMESPACE / CHART / APP VER / REV / STATUS / UPDATED. Follows
the current namespace selector —helm list -n <ns>when a ns is
picked,-Aotherwise. - Helm doc menu —
Spaceon a Release row. Pops a 5-item picker:
Manifest(rendered chart),Creator Notes(post-install
NOTES.txt),User Values(user-supplied),Merged Values(incl.
chart defaults),Hooks(install/upgrade hook resources).
Enter/Spacefires the correspondinghelm get ...asynchronously
(10s timeout) and routes the stdout into the YAML popup. The menu
stays open behind the YAML so consecutive picks flow without
re-opening — input routing checksyamlPopupfirst while open, the
menu sits idle underneath, then takes input back when YAML closes.
Esc/qdismisses the menu. - Deployed Resources section in Release Relatives.
helm get manifestparsed into per-document{kind, name, namespace}tuples;
each native K8s ref becomes a drillable RelativeRow under a
Deployed Resources (N)section. Drill /Space/Yall work
exactly as on any other Relatives row, so Release → Deployment →
Pod → ConfigMap is a continuous chain. CRD kinds the registry
doesn't recognize are dropped silently — every visible row stays
drillable. The chain[0] entry is the Release itself, so the
breadcrumb popup showsRelease/foo → Deployment/foo → Pod/foo-.... - History tab — Panel 3, Helm releases only. Replaces Events for
releases (a release isn't a K8s object; kubectl events don't apply —
drill into a deployed resource if you want events). Table view:
REV / STATUS / DATE / CHART / DESCRIPTIONfromhelm history. The
current deployed revision is marked with a●glyph.j/k/g/G
move the revision cursor; the cursor auto-lands on the deployed rev
the first time the tab loads. - Rollback —
Spaceon a History row. On any non-current revision,
Spacepops a confirm popup whosedetailrow prints the exact
helm rollback <rel> <rev> -n <ns>that will run.Enterruns it
asynchronously (30s timeout,CombinedOutputso stderr surfaces);
success fires a toastRolled back to rev Nplus an app-log info
line, failure routes to app-log error with helm's stderr. On the
current row,Spaceis a silent no-op (no surprise re-deploy of the
state you're already on). - Rule A — helm-managed read-only guard. Pressing
eon any
resource carryingapp.kubernetes.io/managed-by: Helm(label) or
meta.helm.sh/release-name(annotation) — or on a Release row
itself — surfaces a "Helm-managed (read-only) — use helm upgrade /
rollback" toast instead of openingkubectl edit. Stops users from
editing fields the next helm reconcile would overwrite. - Helm storage secret filter —
.on the Secrets panel. The
per-revisionsh.helm.release.v1.*Secrets that helm uses for
release storage are hidden from the Secrets list by default — they
dominate the list otherwise..on the Secrets table flips
visibility; a.helmchip in the panel-2 bottom-left border
confirms when the filter is OFF (secrets shown). Enricher lookups
bypass the filter so SA → token-Secret links still work regardless.
Changed
- Confirm popup also dismisses on
Space(same asEsc/n/
q). The same key that opens the confirm (Relatives-tab space-jump,
History-tab rollback) re-pressed by reflex now cancels rather than
re-fires. - Search clears only on the source panel when focus moves away —
the panel you're leaving loses its filter, every other panel keeps
whatever filter it had. Sidebar / Table both restore the cursor to
selectedafter dropping the filter so the unfocus highlight lands
on the last picked item, not on whichever row the filtered index
happened to point at. .helmmarker moved to panel-2 bottom-left border. Earlier
iteration during 1.5 development surfaced helm-secret filter state
as.hiddenin the status bar. Final form uses the unused
bottom-left corner of the affected panel + an unambiguous.helm
label, since the marker only matters while looking at the Secrets
list.- Hidden KM8erm chip relabeled
KM8erm(waskm8ermlowercase)
to match the popup border title. - Breadcrumb + helm doc menu popups grew one row of top/bottom
padding so title/hint don't sit flush against the first/last
content row.
Removed
- Panel 3 search. The
/hotkey on the detail panel and all
associated filter rendering are gone. Cursor-driven tabs (Relatives,
History) don't tolerate row filtering — the cursor index becomes
meaningless once rows are hidden. Logs follow-tail breaks under
filter (new lines that don't match silently vanish). Events are
short enough to scroll. For "find this string in logs", pressY
to copy the content and grep / search in your editor.
Fixed
- Helm watcher busy-spin. The first cut returned a permanently-
closedwatch.Interfacefor releases, which made the watcher's
outer loop reconnect-and-re-list as fast as the CPU could go — a
single km8 sitting on the Releases panel would have pegged the
helm CLI. Replaced with a pollingwatch.Interfacethat fires
onewatch.Modifiedevent per interval and properly blocks
between ticks. - History tab cursor lit only on focus. The cursor row picked
the focused/unfocused style atbuildContentLinestime but
SetFocusedonly rebuilt for the Relatives tab. Switching focus
to a panel-3 History view left the cursor in unfocused-dim style
until the next 3s poll forced a rebuild. Fixed by including
History inSetFocused's rebuild list. - History cursor stuck across releases. Cursor-position state
travelled acrosspanel 2row changes; switching from a release
with 5 revs to one with 2 left the cursor on a now-invisible
index.SetDetailnow resetshistoryCursorwhen the underlying
UID changes (panel 2 row swap) but preserves it when the same UID
re-arrives via polling refresh (so user-typedj/ksurvives). - Sidebar search list "1 of 1" but empty.
resetCursorToFirstMatch
setm.cursorto the first matching index but never reset
scrollOffset— a stale offset from the previous wider list
could push the only match off the visible window. Now resets to
0 andensureCursorVisibles after. - Table search filter survived focus leave. Earlier ClearSearch
cleared the flags but didn't recomputem.rowsfromm.allRows,
so the panel could appear filtered after the search box was gone.
Now mirrors the in-panel Esc path: convert filtered cursor to its
unfiltered position, drop the filter, restore the cursor. - Sidebar focus-leave parked the cursor on a stale row. After
ClearSearch the filtered cursor index pointed at an unrelated
row in the now-larger visible list. ClearSearch now calls
SetSelected(m.selected)to put the cursor back on whatever the
user actually picked. - Long Relatives value wrap lost arrow color. A
harbor-registry-htpasswd ↘value that wrapped onto two lines
rendered the arrow as plain text on row 2 —wrapPlaintrimmed
the leading space before↘, so the suffix-match that decided
which chunk owned the arrow style missed. Now the arrow is
stripped before wrapping and re-appended (styled) to the last
chunk, with reserved width in the wrap budget.