v0.2.2 wow pass: branded header, per-type accents, count bars, share hint - #15
Conversation
…hint Presentation-only pass on the terminal stack report. No scanner, data, or network change; --json and --markdown are byte-identical to main apart from the cli_version bump. - Masthead: `devcat vX.Y.Z` above every report, bold wordmark + dim version, so a screenshot says what produced it and which release - One accent per tool type on both its label and its new count bar — mcp cyan, plugin magenta, skill green, subagent blue. Four hues of the standard ANSI 16 that read on light and dark terminals; red and yellow stay reserved for failure and truncation - Proportional count bars scaled against the largest count anywhere in the report, so equal bar lengths mean equal counts in every section. Full and half block are both CP437, so they render in a legacy Windows console - Dim closing hint pointing at `npx devcat-cli --markdown` - Empty state: locations under the current directory print ./-relative (.\ on win32) instead of long absolute paths, and it carries the masthead - Name column moves 15 -> 22 to make room; wrap width follows automatically Colour stays decoration only: the strip-invariant is now asserted across a populated, empty, and truncated scan, and for NO_COLOR set and set-but-empty. Two pre-existing tests pinned the version as a literal; they now read CLI_VERSION, which version.parity.test.ts already ties to package.json. README example text and the demo SVG are regenerated from a real run against a fixture machine — the SVG now shows the actual colours the CLI emits, which the hand-styled previous one did not.
|
Caution The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased. |
A four-digit count in the fixed three-wide column pushed that row's label and names one character right of every other row — and out of line with its own wrapped continuation. The column is now sized from the largest count in the report, so the alignment the derived name column promises actually holds at every data shape. Unreachable on an ordinary machine (a single type needs 1000+ entries), and the same overflow existed before this branch — but the bar column makes the break visible, and the fix is four lines. No change to any report that fits in three digits: the demo capture, the README block, and the demo SVG are byte-identical before and after.
|
Caution The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 53469f5644
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| if (fold(cwd, caseSensitivity) !== fold(home, caseSensitivity)) { | ||
| const relative = toCwdRelative(path, cwd, caseSensitivity); | ||
| if (relative !== path) return relative; |
There was a problem hiding this comment.
Prefer the more specific matching path prefix
When the CLI is launched from an ancestor of the home directory, such as cd / or cd /home, every user-wide location also matches cwd, so this early return renders /home/alice/.claude.json as ./home/alice/.claude.json instead of ~/.claude.json. This defeats the intended distinction between project candidates and user-wide locations in the empty report; choose the more specific matching base (or otherwise let home win when it is nested under cwd) rather than always prioritizing cwd when the two differ.
Useful? React with 👍 / 👎.
What this is
A presentation-only pass on the default
npx devcat-clireport, aimed at the bar Andrew set: a developer runs it, sees the report, and wants to screenshot it.No scanner, data, or network change.
--jsonand--markdownare byte-identical tomainapart from thecli_versionbump (verified below).Before / after — populated stack
Both captured from the same fixture machine (23 tools),
mainvs this branch.Before (
main, v0.2.1):After (this branch, v0.2.2):
In a real terminal the bars and their labels carry the per-type accent — see the regenerated
assets/devcat-report.svgin this diff for the colored rendering.Before / after — empty state
The five project-scoped candidates used to print as full absolute paths — the only place the report leaked the machine into its own output.
Before (
main):After (this branch):
What changed
devcat vX.Y.Zmasthead — bold wordmark, dim version — on both the populated and the empty reportsrc/ui/report.tssrc/ui/colors.ts,src/ui/report.tssrc/ui/report.tsShare it — npx devcat-cli --markdownfootersrc/ui/report.ts./-relative (.\on win32)src/ui/report.tssrc/ui/report.tsColour choices, and why
Four accents were needed, and the standard ANSI 16 has exactly four hues that read on both a light and a dark terminal: cyan, magenta, green, blue.
white/blackare invisible on half of all themes andyellowis poor on light.redandyelloware also deliberately reserved — red for the failure glyph, yellow for the truncation footnote — so seeing either still means something. There is a test asserting a clean report emits neither.The brand mark is bold, not coloured. All four colours are spent on data; bold is the one emphasis that holds in every theme, so the wordmark ends up the most robust element on screen rather than a fifth hue competing with the palette.
Colour is never the only signal. Every row still spells its type out and every bar is a length as well as a hue, so the report survives
NO_COLOR, a pipe, and a reader who cannot distinguish two of the four.Bar scaling
Scaled against the largest single type count anywhere in the report, not per client — local scaling would draw Codex's 3 MCP servers as wide as Claude Code's 12. Any nonzero count keeps at least a half block, so a row that exists is always visible.
█(U+2588) and▌(U+258C) are both in CP437, so they render even in a legacy Windows console with a raster font. The finer eighth-blocks (U+2589–U+258F) are not, and were rejected for that reason.One fix beyond the brief
Edge-case probing turned up a real alignment break: a four-digit count in the
fixed three-wide column pushed that row label and its names one character
right of every other row, and out of line with its own wrapped continuation.
The column is now sized from the largest count in the report.
Unreachable on an ordinary machine (a single type needs 1000+ entries) and the
overflow predates this branch — but the new bar column makes it visible, and
the fix is four lines. Called out because it is the one change here that is
not purely presentational. Every report that fits in three digits is
byte-identical before and after, including the README block and the demo SVG.
Gates
npm run lintnpm run buildnpm testnpm pack --dry-runmain; nothing outsidedist/,README.md,LICENSE,package.json. Noassets/,src/,test/, or tarball leakedHard constraints, verified
--markdownbyte-identical tomain— diffed on a populated and an empty scan: no diff.--jsonbyte-identical tomainexcept"cli_version": "0.2.1"→"0.2.2", which is the version bump itself (the same nuance the 0.2.1 entry recorded).NO_COLOR=1,NO_COLOR=''). ANSI-stripped output equals the plain render byte for byte in every combination, and every new element sits inside those renders.package.json,src/version.ts, and bothpackage-lock.jsonversion lines at 0.2.2; the lockfile diff is exactly those two lines.node:pathjoin/sep, never POSIX literals. That is the specific trap that broke the Windows lanes last round.README and demo SVG
Both regenerated from a real run, not retyped:
HOME=<fixture-home>, cwd<fixture-project>, rundist/bin/devcat.js.Checks that ran: the fixture reproduces the previously committed README block byte-for-byte on
main(proving the fixture is faithful); the new README block is byte-identical to the new capture; every<text>element in the SVG reassembles to exactly its CLI line; and the SVG generator reproduces the old SVG's geometry exactly (693×413, everyyandtextLength) when fedmain's output.One genuine fix landed here: the old SVG was rendered from plain text, so it never showed the v0.2.1 type colours at all. The new one is rendered from the real ANSI stream, so the artwork now shows what the CLI actually emits.
No README claim was touched beyond what this change makes true; no new absolute claims added.
Judgment calls left to review
/\_/\) or sat outside CP437 and was risky on legacy Windows consoles. The wordmark carries the brand instead. Easy to add later.scripts/if review prefers that.TYPE_WIDTHleft at 9. That leavessubagentone space from its names whilemcpgets six. Widening to 10 costs a column of name width and more wrapping, and it is pre-existing behaviour, so I left it.🤖 Generated with Claude Code