Skip to content

feat(ui): /feedback + version badge in status row#501

Merged
esengine merged 3 commits into
mainfrom
feat/499-version-badge-feedback
May 9, 2026
Merged

feat(ui): /feedback + version badge in status row#501
esengine merged 3 commits into
mainfrom
feat/499-version-badge-feedback

Conversation

@esengine

@esengine esengine commented May 9, 2026

Copy link
Copy Markdown
Owner

Summary

Two small UX papercuts at the prompt-input area, both fixed in one PR:

  • Version is invisible after one screen of activity. The status row now shows a v<VERSION> pill on the right cluster (after wallet, before the rule). Gated to cols ≥ 70 so narrow terminals don't get crowded.
  • No one-step path from "I hit a bug" to "open an issue with diagnostics attached." New /feedback slash command:
    • gathers version + platform + os release + TERM_PROGRAM/TERM + Node + locale + model + session id,
    • writes a paste-ready Markdown block to the clipboard via the existing writeClipboard helper,
    • opens the GitHub new-issue URL in the default browser via a new cross-platform openUrl (cmd /c start / open / xdg-open). No-ops under CI or REASONIX_NO_OPEN.

The diagnostic block contains exactly the seven advertised fields — version / platform / terminal / Node / locale / model / session — and nothing else. tests/feedback.test.ts pins the field set and asserts no API keys, absolute paths, or transcript content can leak through.

Activation surface follows the issue's "be honest about TUI constraints" guidance: ship the slash command first; mouse-clickable chip is a follow-up that can wire into the same handler when the host terminal reports clicks.

Closes #499

Test plan

  • tests/feedback.test.ts — 4 cases: field set + ordering, optional Session line, terminal fallback when TERM_PROGRAM/TERM are absent, no leak of secrets / paths / transcripts.
  • npm run verify (full suite, 2328 tests).

esengine added 2 commits May 8, 2026 22:27
…agnostic clipboard

When a user hits a bug, the first question back is "what version" — and
the only way to find out today is to drop to the shell. Filing the
issue itself means leaving the TUI, finding the repo URL, then either
remembering or re-collecting version / OS / terminal / Node / locale /
model. Both papercuts are easy to fix from the prompt-input surface.

- StatusRow shows a `v<VERSION>` pill on the right cluster, gated to
  cols ≥ 70 so it doesn't crowd narrow terminals.
- New `/feedback` slash: gathers version + platform + os release +
  TERM_PROGRAM/TERM + Node + locale + model + sessionId, writes a
  paste-ready Markdown block to the clipboard via the existing
  `writeClipboard` helper, then opens the GitHub new-issue URL in the
  default browser via a new cross-platform `openUrl` (win32 cmd /c
  start, darwin open, linux xdg-open). No-ops under CI / when
  REASONIX_NO_OPEN is set.
- Diagnostic body contains exactly the seven advertised fields and
  nothing else — `tests/feedback.test.ts` pins the field set and asserts
  no API keys / file paths / transcript content can leak through.

Closes #499
…tus row

Two follow-ups so the affordance actually gets discovered and used:

- The issue page now opens with the diagnostic block already in the
  textarea via `?body=<urlencoded>`. Most users won't notice we copied
  to clipboard; pre-filling the URL is the obvious path. Clipboard
  stays as belt-and-suspenders for when the URL fails to open.
- StatusRow shows a `⚑ /feedback` hint after the version pill at
  cols ≥ 100 so users see the command exists. Narrower terminals (70–99
  cols) still get the version, just without the hint.
- Body length is capped at 6000 chars before encoding so a runaway
  diagnostic can't blow past the URL limit.
Comment thread src/cli/ui/open-url.ts
}

try {
const child = spawn(cmd, args, { detached: true, stdio: "ignore" });
The original block had version + platform + TERM_PROGRAM + Node + locale
+ model + session — fine for "agent ran the wrong tool" reports, but
useless for the rendering / flicker reports we actually field. Adds the
fields that come up first when triaging those:

- terminal size (cols×rows) — lots of repaint bugs only repro at
  specific widths
- env markers that change the rendering pipeline: COLORTERM,
  WT_SESSION, TMUX, SSH_TTY, WSL_DISTRO_NAME — TERM_PROGRAM alone can't
  distinguish cmd / WSL / SSH-tunnelled terminals
- theme name — different themes use different background fills, flicker
  is often theme-dependent
- edit / plan mode — decides which surfaces are mounted, changes
  repaint cadence
- latest version compare — surfaces "you're on an old build" without a
  follow-up question
- reasoning effort + MCP server count — incidentally cheap, occasionally
  load-bearing for cost / latency reports

Still no transcripts, paths, workspace name, or env outside the
hand-picked safe list. New tests pin the exact field set so future
fields can't sneak in unannounced.
@esengine esengine merged commit e205c59 into main May 9, 2026
3 checks passed
@esengine esengine deleted the feat/499-version-badge-feedback branch May 9, 2026 06:07
@esengine esengine mentioned this pull request May 9, 2026
2 tasks
ChasLui pushed a commit to ChasLui/DeepSeek-Reasonix that referenced this pull request May 23, 2026
* feat(ui): version badge in status row + /feedback opens issue with diagnostic clipboard

When a user hits a bug, the first question back is "what version" — and
the only way to find out today is to drop to the shell. Filing the
issue itself means leaving the TUI, finding the repo URL, then either
remembering or re-collecting version / OS / terminal / Node / locale /
model. Both papercuts are easy to fix from the prompt-input surface.

- StatusRow shows a `v<VERSION>` pill on the right cluster, gated to
  cols ≥ 70 so it doesn't crowd narrow terminals.
- New `/feedback` slash: gathers version + platform + os release +
  TERM_PROGRAM/TERM + Node + locale + model + sessionId, writes a
  paste-ready Markdown block to the clipboard via the existing
  `writeClipboard` helper, then opens the GitHub new-issue URL in the
  default browser via a new cross-platform `openUrl` (win32 cmd /c
  start, darwin open, linux xdg-open). No-ops under CI / when
  REASONIX_NO_OPEN is set.
- Diagnostic body contains exactly the seven advertised fields and
  nothing else — `tests/feedback.test.ts` pins the field set and asserts
  no API keys / file paths / transcript content can leak through.

Closes esengine#499

* feat(ui): pre-fill /feedback issue body via URL + surface chip in status row

Two follow-ups so the affordance actually gets discovered and used:

- The issue page now opens with the diagnostic block already in the
  textarea via `?body=<urlencoded>`. Most users won't notice we copied
  to clipboard; pre-filling the URL is the obvious path. Clipboard
  stays as belt-and-suspenders for when the URL fails to open.
- StatusRow shows a `⚑ /feedback` hint after the version pill at
  cols ≥ 100 so users see the command exists. Narrower terminals (70–99
  cols) still get the version, just without the hint.
- Body length is capped at 6000 chars before encoding so a runaway
  diagnostic can't blow past the URL limit.

* feat(ui): expand /feedback diagnostic with flicker-relevant fields

The original block had version + platform + TERM_PROGRAM + Node + locale
+ model + session — fine for "agent ran the wrong tool" reports, but
useless for the rendering / flicker reports we actually field. Adds the
fields that come up first when triaging those:

- terminal size (cols×rows) — lots of repaint bugs only repro at
  specific widths
- env markers that change the rendering pipeline: COLORTERM,
  WT_SESSION, TMUX, SSH_TTY, WSL_DISTRO_NAME — TERM_PROGRAM alone can't
  distinguish cmd / WSL / SSH-tunnelled terminals
- theme name — different themes use different background fills, flicker
  is often theme-dependent
- edit / plan mode — decides which surfaces are mounted, changes
  repaint cadence
- latest version compare — surfaces "you're on an old build" without a
  follow-up question
- reasoning effort + MCP server count — incidentally cheap, occasionally
  load-bearing for cost / latency reports

Still no transcripts, paths, workspace name, or env outside the
hand-picked safe list. New tests pin the exact field set so future
fields can't sneak in unannounced.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ui: surface current version + a one-step feedback affordance in the prompt-input status row

2 participants