spinuptui 0.22.0 → 0.22.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -11,6 +11,16 @@ versions; such changes are called out here.
11
11
 
12
12
  ## [Unreleased]
13
13
 
14
+ ## [0.22.1] - 2026-07-13
15
+
16
+ ### Fixed
17
+ - **`K` (grant/revoke SSH key) is discoverable again.** The v0.22.0 Control-strip
18
+ rebuild dropped it from both Site Control and Server Control's action lists —
19
+ the keybinding itself kept working, but you had to already know it existed.
20
+ It's back in Site Control's Remote group and Server Control's Access group,
21
+ and now also works from the Servers pane (falling back to the server's first
22
+ key-eligible site), matching how `S`/`h` already work from either pane.
23
+
14
24
  ## [0.22.0] - 2026-07-13
15
25
 
16
26
  ### Added
@@ -1166,7 +1176,8 @@ Initial tagged release.
1166
1176
  ### Notes
1167
1177
  - Read-only release: works with a SpinupWP **Read Only** API token.
1168
1178
 
1169
- [Unreleased]: https://github.com/mwender/spinupwp-tui/compare/v0.22.0...HEAD
1179
+ [Unreleased]: https://github.com/mwender/spinupwp-tui/compare/v0.22.1...HEAD
1180
+ [0.22.1]: https://github.com/mwender/spinupwp-tui/compare/v0.22.0...v0.22.1
1170
1181
  [0.22.0]: https://github.com/mwender/spinupwp-tui/compare/v0.21.2...v0.22.0
1171
1182
  [0.21.2]: https://github.com/mwender/spinupwp-tui/compare/v0.21.1...v0.21.2
1172
1183
  [0.21.1]: https://github.com/mwender/spinupwp-tui/compare/v0.21.0...v0.21.1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "spinuptui",
3
- "version": "0.22.0",
3
+ "version": "0.22.1",
4
4
  "description": "SpinupTUI — a terminal dashboard for browsing, monitoring, and managing your SpinupWP servers and sites.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -106,7 +106,7 @@ function serverControlGroups(
106
106
  // Labels stay terse and avoid repeating their group's title — see siteGroups().
107
107
  export const SERVER_CONTROL: ActionGroup[] = [
108
108
  { title: "Clone", items: [["C", "Clone →"]] },
109
- { title: "Access", items: [["S", "Sudo"]] },
109
+ { title: "Access", items: [["S", "Sudo"], ["K", "Grant SSH key"]] },
110
110
  {
111
111
  title: "Manage",
112
112
  items: [
@@ -436,6 +436,7 @@ export function ControlPanel({ heading, groups, layout = "list" }: { heading: st
436
436
  export function siteGroups(isWordpress: boolean, localSync: boolean, isVanity: boolean): ActionGroup[] {
437
437
  const remote: [string, string][] = [
438
438
  ["s", "SSH"],
439
+ ["K", "Grant SSH key"],
439
440
  ["n", "DNS"],
440
441
  ]
441
442
  if (isWordpress) {
@@ -128,12 +128,17 @@ export function Browser({ rows }: { rows: number }) {
128
128
  }
129
129
  return
130
130
  }
131
- case "K":
132
- // Grant Spinup's machine key to the selected site over SSH (privileged
133
- // write via the server's sudo user — the API can't do this). Capital K
134
- // (like L/V/N) since lowercase k is the vim "move up" binding.
135
- if (focus === "sites" && sites[siteIndex]) setGrantKeySite(sites[siteIndex])
131
+ case "K": {
132
+ // Grant Spinup's machine key to a site over SSH (privileged write via the
133
+ // server's sudo user — the API can't do this). Capital K (like L/V/N)
134
+ // since lowercase k is the vim "move up" binding. Site-anchored (the
135
+ // overlay itself picks the scope: just this site, or every site on the
136
+ // server) but works from either pane like S/h — the Servers pane falls
137
+ // back to the server's first key-eligible site as the anchor.
138
+ const anchor = focus === "sites" ? sites[siteIndex] : server ? sitesForServer(server.id).find((s) => s.site_user) : undefined
139
+ if (anchor) setGrantKeySite(anchor)
136
140
  return
141
+ }
137
142
  case "L":
138
143
  // Link / view the selected site's local working copy (Phase 1).
139
144
  if (focus === "sites" && sites[siteIndex]) setLocalLinkSite(sites[siteIndex])