sshkeeper/docs/superpowers/specs/2026-08-13-tui-forward-digi...

2.4 KiB

TUI Port Forward Digit Input Design

Problem

The port-forward form displays 1, 2, and 3 as shortcuts for Local, Remote, and SOCKS. Its Update method currently handles those runes before it routes the event to the focused textinput, regardless of which control has focus. As a result, typing any of those digits into a name, description, address, or port field changes the forward type and drops the character.

Scope

  • Preserve the existing 1/2/3 type-selection shortcuts while focus is on any of the three type selector rows.
  • Treat 1, 2, and 3 as ordinary input everywhere else in the form.
  • Add focused regression coverage for digit entry and shortcut preservation.
  • Do not change form navigation, validation, persistence, or unrelated TUI behavior.

Design

Gate the existing digit shortcut block on the type selector focus range: focusIdx >= 2 && focusIdx < 2+len(forwardTypes). When that condition is false, processing falls through to the existing focused-input routing. No new state, helper, or dependency is needed.

The type selector itself remains keyboard-accessible through Tab/arrow navigation, Enter, and direct 1/2/3 selection. The footer remains accurate.

Regression Coverage

  1. Focus the listen-port input, send separate Bubble Tea key messages for 1, 2, and 3, and assert that the field contains 123 and the forward type remains Local.
  2. For every type selector row, assert that each direct digit still selects the corresponding Local, Remote, or SOCKS type and index, starting from a deliberately different type so no case can pass from the default state.

Similar-Error Audit

All tea.KeyRunes branches and all textinput.Model.Update call sites under internal/tui were inspected. The server form's / shortcut is explicitly limited to the Auth Method and Group selector fields. Search, tag, and template forms do not intercept printable shortcut keys before their text inputs. The remaining rune shortcuts are confined to non-input screens (lists, help, confirmation, and mode selection). No second instance of this bug class was found.

Verification

  • Demonstrate that the new regression test fails against the current code.
  • Apply the one-condition production fix and demonstrate that the focused tests pass.
  • Run go test ./..., go vet ./..., and ./build.sh.
  • Confirm the final binary exists at /home/mirivlad/git/sshkeeper/bin/sshkeeper and report its metadata.