Operator CLI UX: FormRunner, huh pickers, Lipgloss chrome#73
Merged
Conversation
Operators pick Agent kind on Init and confirm/reorder Tickets on Queue via keyboard-friendly forms; tests stub FormRunner without a live TUI. Co-authored-by: Cursor <cursoragent@cursor.com>
Brand Usage/Flags/Config headings and render each flag as name, meaning, and default on one aligned row. Co-authored-by: Cursor <cursoragent@cursor.com>
Print a once-per-Run agent/branch header, queue-remaining throbber hint, compact tools/in/out success dump, and louder Abort framing; gate color on stderr TTY and keep the two-line throbber from scrolling. Co-authored-by: Cursor <cursoragent@cursor.com>
maxBRT
force-pushed
the
ship/20260721-201914.210129954
branch
from
July 21, 2026 21:25
d309037 to
c21cf98
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Lands the Charm/huh operator UX slice: a
FormRunnerseam with shared Lipgloss theme tokens, huh Agent picker on Init, huh Queue multi-select with Shift+↑/↓ reorder, styledship --help, and Lipgloss Run chrome (header, denser Phase observe strip, louder Abort). Color/ANSI for Run chrome, throbber, and observe is gated on stderr being a TTY so redirected logs stay plain.Linked issues
RISK
script, or weird PTYs can mis-detect and either skip the picker (ErrNonInteractive/ default Agent) or hang waiting for input. Operators pipingshipoutput or running under automation are most affected..ship/config.yaml; cancel on Queue confirmation must abort the Run before Claim. A regression would leave a half-written config or claim Tickets the operator never confirmed.WriteUsage/ship --helpstill emits Lipgloss color unconditionally; only Run chrome/observe/throbber are TTY-gated. Log scrapers or screenshots of--helpmay show escape codes.huh,lipgloss) can break builds if module resolve fails or Charm APIs change; limited to this CLI binary, not agent Phase adapters.QA — stress-test plan for a human
1. Happy path
ghauth and at least two GitHub issues labeledship, runship initon a real TTY: confirm the huh Agent single-select (blurbs + keyhints), pick an Agent kind, and verify.ship/config.yamlgets thatagent:.ship(orship --helpthen a full Run): confirm styled Usage/Flags/Config sections and aligned flag columns.2. Edges / failure cases
ship init </dev/null(or pipe stdin closed) — should default Agent tocursorwithout a TUI and still write config (or fail cleanly per existing non-TTY Init rules); must not hang on huh.ship </dev/nullwith candidates present — expectErrNonInteractive/ no Claim; no hang.ship init, Esc/cancel before accept — no.ship/config.yamlwrite (or no overwrite of agent if you staged a dry run carefully).ship, Esc on Queue confirmation — Run stops; Tickets must not be Claimed / moved to In Progress.--timeout) — stderr shows loud red Abort, report path under.ship/runs/…, last tools; redirected stderr (ship 2>run.log) should be plain text without ANSI.3. Out of scope
TypedLinesFormRunner beyond the production huh path (tests may still stub it).Made with Cursor