Repository navigation
UI polish overhaul: mantis CLI output - #112
Merged
Merged
Conversation
Shared terminal tokens for the mantis CLI's human output: one status mark set with ASCII fallbacks, one timestamp format with a relative age, one label block and one detail heading, verdict lines on status, doctor, hits and list, errors as a message plus a dim hint, grouped --help, a short home launcher, restyled wizard prompts, and a keychain notice that is erased once the read returns. --json, --id-only, --url-only, flags and exit codes are unchanged. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Dim underlined table headers; webhook tokens masked to host plus tail on a terminal (piped and --json output keep the whole target); failure reasons word-wrapped under the target instead of cut; one "nothing" glyph; delivery words that say what happened; agents parsed to one form; doctor marks unconfigured checks as skipped, names network causes and the older side; the ip column no longer repeated in the who cell; x-mantis headers not repeated in hit detail; two-line empty states everywhere. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Tripped gets its own red dot so the warning sign means warning only; one target formatter drops the scheme everywhere and masks only token-bearing paths; instruction lines and state words at full weight with commands in cyan; failure reasons no longer repeat the target named above them; destinations labelled notify, ordered right after status, with the wizard summary drawn by the same renderer; failed-delivery rows flagged in the when cell; a legend entry for the ssh client arrow; honest "Latest N hits" when --limit cut the page; doctor hosts without schemes and a masked key. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Hit detail leads with when, where and whether anyone was told; the typed webhook is redrawn masked; delivery words return to the table so the dash means only an unknown address; stamps from today show the time only and relative ages under ten minutes carry seconds; show marks status and dims identifiers; the no-destination count carries a warning mark; doctor and home name servers without a scheme and hints fit beside the check name; error hints read at full weight; the memo prompt says what it wants. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
One headline grammar on every screen (plain count, bold memo, dim id); the memo column capped on a terminal; the hit source as a tag so the who cell stays short; failed-delivery rows marked at the left edge; the doctor summary colours only the counts that need acting on; wizard choices on their own line before every prompt and a rejected answer redrawn dim; the quiet configuration rows in show dim as one block; one example key name. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The hit id as a dim suffix on each hit headline instead of a UUID row; the echoed prefix in "no key matches prefix" in bold through the SGR-keeping escape; seconds in table ages under ten minutes and the since column in the same form as when; warning and pending marks in bold yellow; the accepted masked webhook redrawn bold; the doctor upgrade hint names the installer in use. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Hit detail: delivery right under the time, a duplicate's headline dim; the fixture now serves hits newest first like the server; show folds both ids onto one dim line; doctor probe rows fit 80 columns and the shared hint says it covers both checks; empty-state hints carry an arrow like the other hints; the wizard echo keeps the https the validation asked for; the wordmark in the wizard title; "hits in the window" without repeating the window length. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The ssh client address in the ip column of hit tables, marked with the arrow the legend explains, so the who column is the identity alone; one spelling for ages under ten minutes on every surface; memo columns sized from the terminal; notify and delivery results aligned; "no destinations" spelled out; masked targets keep their scheme so the wizard echo and the summary match; list status cells carry the same glyphs as show; quiet rows keep their delivery cell at full weight; the upgrade hint names both paths. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
6 of 7 tasks
Round 9 applies the items the user approved from the market comparison and the fixes the resize tests found. Fable was not scored this round: the account hit its Fable usage limit. - Error hints print as an indented → line, like empty states. - URLs and file paths are underlined at the text colour; cyan is kept for commands. - Hits and status tables: a failed delivery keeps a red ✗ in its own column at the left edge, times right-align after it, the ssh arrow sits in a gutter with the ip header over the addresses, and since right-aligns like age. - Failure reasons hang under their row behind a dim └. - The new-key wizard reads as a form: defaults in a dim column, every answer bold and starting in one column, with an inline fallback below 70 columns. - The masked webhook redraw clears every row a wrapped URL used, so no part of a real-length Discord or Slack token stays on screen. - Narrow windows: memos and identities are cut in the middle, the hits headline fits, and times, addresses and delivery are never cut. - status --watch redraws as soon as the window is resized. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
adamXbot
marked this pull request as ready for review
November 10, 2026 06:07
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.
Scored polish hill climb of the
mantisCLI's human-readable output, run with the ui-polish method: eight real screens captured in light and dark at 100 columns against a fixture API with a frozen clock, judged per category by three independent reviewer models against GitHub CLI and Wrangler, fixed where the judges agreed, re-captured and re-judged. The target, 9.0 in every category from every judge in the same round, was never shown to the judges. It cleared in round 8. Round 9 then applied changes the maintainer chose after a comparison against twelve more CLIs and a resize test; Opus and Sonnet re-cleared it, and Fable could not be run that round (usage limit).--json,--id-only,--url-only, flags and exit codes are unchanged. Every change is to text, layout, glyphs and ANSI attributes. 37 test files, 275 tests pass; four tests were added in round 9 for the middle cut and the error-hint arrow, and two assertions were updated to the new wording (asincecell without "ago", the escaped host rather than the source in a table row).Score history (overall per judge)
Round 8 per category: Fable 9.5 in all eight; Opus 9.0 in all eight; Sonnet 9.0 to 9.5. Round 9 per category: Opus and Sonnet 9.0 to 9.5 in all eight, no regressions. References on the same scale, same judges: GitHub CLI 8.0 to 8.5, Wrangler 5.5 to 6.5.
Round 9: the maintainer's picks and the resize fixes
After round 8 the same judges scored mantis beside Homebrew, Ansible, nala, AWS CLI, Azure CLI, fzf, witr, Docker, kubectl, cargo, npm and uv (mantis ranked first at 8.85, ahead of cargo 8.2, uv 8.2 and fzf 8.1). The maintainer picked from what the judges agreed on, and a resize test added three fixes:
→line, the same as empty states (formatError).c.link); cyan is kept for commands.✗in its own column at the left edge (the maintainer's call, given to the judges as a constraint), with times right-aligned after it; the ssh arrow sits in a gutter with theipheader over the addresses;sinceright-aligns likeage.└(childLines).cutMiddle), headlines fit the window, and times, addresses and delivery are never cut.status --watchredraws 150 ms after a resize instead of waiting for its next tick.Changes by category
Hierarchy (
cli/src/lib/out.ts:heading,kv,tripped;status.ts,hits.ts,doctor.ts)● 2 of 6 monitored keys tripped), doctor (⚠ 5 passed, 1 skipped, 3 warnings), hits and list.✗in the when cell; bot, duplicate and disabled rows dim their identity cells.kv, 12-column label gutter) on show, status detail, hit detail and the wizard summary; hit detail leads with who, where and when, then delivery.--helpis grouped.Typography (
out.ts:formatStamp,formatAge,formatAgo,wrapProse,proseWidth,cap,memoWidth)2026-11-06 02:26 UTC, time only for today, seconds only in hit detail; one relative form (4m,3m40s,2h, in prose with "ago").Chrome 141 · Windows,aws-cli 2.31.4 · linux,Googlebot 2.1).Spacing and layout (
out.ts:table,fitMiddle,maskSecretUrl;hit-format.ts,destination-format.ts)https://host/…tailon a terminal (piped and--jsonoutput keep the whole target).Colour and contrast (
out.ts:c,mark,hintLines,formatError)Iconography and controls (
out.ts:mark,arrow,dot,glyph;wizard.ts,prompt.ts)✓ ✗ ⚠ … ● –, with ASCII fallbacks+ x ! ~ ! -; tripped has its own dot so⚠means warning only; legends explain every mark on screen.Consistency (
hit-format.ts,destination-format.ts,hostOnly,withoutRepeat)destinationslabel becamenotify, matching--notify.Clarity (
runner.ts:networkReason;resolve.ts;doctor.ts)error:plus the message plus one hint line; network errors say which server and why (connection refused,host not found); the echoed prefix is bold.delivered on attempt 1,failed after 5 attempts,suppressed,no destinations;Latest N hitswhen--limitcut the page.Character
Beyond polish, for the maintainer to decide
mantis list. All three judges asked for it every round. The list endpoint carries no monitor state and reading it costs one request per monitored key (whatmantis statusdoes), so showing it inlistis a behaviour change. The footer points atmantis status.Latest 2 of 3 hitsunder--limit. The hits endpoint reports no total.--verboseto one line naming the original (all three judges in round 8, Opus and Sonnet again in round 9).→pointer) and relative-first timestamp pairs on show: both round 9 judges' top shared findings, left for a later round.⚠on the warning count itself (single-judge, low).Judges, references, rounds
gh pr --help,gh run list,gh pr list,gh pr view,gh pr checks) and Cloudflare Wrangler (--help,kv namespace --help), captured through the same harness and palette.🤖 Generated with Claude Code