Skip to content

v0.2.2 wow pass: branded header, per-type accents, count bars, share hint - #15

Merged
AnobleSCM merged 2 commits into
mainfrom
wow-pass-022
Aug 3, 2026
Merged

AnobleSCM merged 2 commits into
mainfrom
wow-pass-022

Conversation

@AnobleSCM

@AnobleSCM AnobleSCM commented Aug 3, 2026 •

Copy link
Copy Markdown
Owner

What this is

A presentation-only pass on the default npx devcat-cli report, aimed at the bar Andrew set: a developer runs it, sees the report, and wants to screenshot it.

No scanner, data, or network change. --json and --markdown are byte-identical to main apart from the cli_version bump (verified below).


Before / after — populated stack

Both captured from the same fixture machine (23 tools), main vs this branch.

Before (main, v0.2.1):

✓ Your AI-coding stack — 23 tools

Claude Code · 18 tools
    6 mcp      context7, github, linear, playwright, sentry, supabase
    3 plugin   pr-review-toolkit, superpowers, typescript-lsp
    6 skill    brainstorming, deep-research, handoff, research-notes, tdd,
               writing-plans
    3 subagent code-reviewer, debugger, test-engineer

Codex · 3 tools
    3 mcp      exa, node-repl, serena

Cursor · 2 tools
    2 mcp      figma, postgres

23 tools in Claude Code, Codex, and Cursor · 13 locations checked
2 project-scoped · 21 user-wide

After (this branch, v0.2.2):

devcat v0.2.2

✓ Your AI-coding stack — 23 tools

Claude Code · 18 tools
  ██████   6 mcp      context7, github, linear, playwright, sentry, supabase
  ███      3 plugin   pr-review-toolkit, superpowers, typescript-lsp
  ██████   6 skill    brainstorming, deep-research, handoff, research-notes,
                      tdd, writing-plans
  ███      3 subagent code-reviewer, debugger, test-engineer

Codex · 3 tools
  ███      3 mcp      exa, node-repl, serena

Cursor · 2 tools
  ██       2 mcp      figma, postgres

23 tools in Claude Code, Codex, and Cursor · 13 locations checked
2 project-scoped · 21 user-wide

Share it — npx devcat-cli --markdown

In a real terminal the bars and their labels carry the per-type accent — see the regenerated assets/devcat-report.svg in 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):

✓ No AI tooling detected on this machine yet.

Looked in:
  - /private/tmp/devcat-demo/my-project/.mcp.json
  - /private/tmp/devcat-demo/my-project/.claude/skills
  - /private/tmp/devcat-demo/my-project/.claude/agents
  - /private/tmp/devcat-demo/my-project/.codex/config.toml
  - /private/tmp/devcat-demo/my-project/.cursor/mcp.json
  - ~/.claude.json
  - ~/.claude/settings.json
  - ~/.claude/plugins/installed_plugins.json
  - ~/.claude/skills
  - ~/.claude/agents
  - ~/.codex/config.toml
  - ~/.codex/skills
  - ~/.cursor/mcp.json

Add an MCP server to Claude Code, Codex, or Cursor and run this again.

After (this branch):

devcat v0.2.2

✓ No AI tooling detected on this machine yet.

Looked in:
  - ./.mcp.json
  - ./.claude/skills
  - ./.claude/agents
  - ./.codex/config.toml
  - ./.cursor/mcp.json
  - ~/.claude.json
  - ~/.claude/settings.json
  - ~/.claude/plugins/installed_plugins.json
  - ~/.claude/skills
  - ~/.claude/agents
  - ~/.codex/config.toml
  - ~/.codex/skills
  - ~/.cursor/mcp.json

Add an MCP server to Claude Code, Codex, or Cursor and run this again.

What changed

# Change Where
1 devcat vX.Y.Z masthead — bold wordmark, dim version — on both the populated and the empty report src/ui/report.ts
2 One accent per tool type, on its label and its bar: mcp cyan, plugin magenta, skill green, subagent blue src/ui/colors.ts, src/ui/report.ts
3 Proportional count bars, one global scale src/ui/report.ts
4 Dim Share it — npx devcat-cli --markdown footer src/ui/report.ts
5 Empty state prints cwd-scoped locations ./-relative (.\ on win32) src/ui/report.ts
6 Name column 15 → 22, derived from its parts so it cannot drift src/ui/report.ts

Colour 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/black are invisible on half of all themes and yellow is poor on light. red and yellow are 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

Gate Result
npm run lint pass
npm run build pass
npm test 288 passed, 33 files
CI — all six lanes ubuntu/macos/windows x node 20/22: 6/6 pass
npm pack --dry-run 67 files — identical file list to main; nothing outside dist/, README.md, LICENSE, package.json. No assets/, src/, test/, or tarball leaked

Hard constraints, verified

  • --markdown byte-identical to main — diffed on a populated and an empty scan: no diff.
  • --json byte-identical to main except "cli_version": "0.2.1" → "0.2.2", which is the version bump itself (the same nuance the 0.2.1 entry recorded).
  • Strip-invariant — extended from one shape to three (populated, empty, truncated) × four colour modes (TTY, non-TTY, 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.
  • Zero new dependencies, no new flags, no new commands.
  • Version parity — package.json, src/version.ts, and both package-lock.json version lines at 0.2.2; the lockfile diff is exactly those two lines.
  • Platform-aware fixtures — every new path test builds fixtures from node:path join/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:

  1. Build a fixture machine reproducing the documented 23-tool demo.
  2. HOME=<fixture-home>, cwd <fixture-project>, run dist/bin/devcat.js.
  3. Splice that capture into the README block programmatically.
  4. Render the SVG from the colored capture.

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, every y and textLength) when fed main'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

  1. No cat glyph. Optional in the brief. Every candidate either read childish (emoji, kaomoji, /\_/\) or sat outside CP437 and was risky on legacy Windows consoles. The wordmark carries the brand instead. Easy to add later.
  2. Share hint omitted from the empty state. Item 4 did not scope it and item 5 explicitly scoped only the header there. Inviting someone to share an empty stack felt wrong, and that state already ends on a better next step ("Add an MCP server…"). Say the word and it goes in.
  3. The SVG generator is not committed. It lives in scratch; the recipe is above. This follows the precedent of docs: report-first README polish #12, which also generated the asset without committing a script. Committing it would add an untested, lint-surfaced script to six CI lanes for a once-per-release job — but it would make the asset reproducible without archaeology. Happy to add it under scripts/ if review prefers that.
  4. TYPE_WIDTH left at 9. That leaves subagent one space from its names while mcp gets six. Widening to 10 costs a column of name width and more wrapping, and it is pre-existing behaviour, so I left it.
  5. No panel second opinion. The brief said "your taste decides details", which I read as an explicit delegation. Flagging it, since taste-driven work normally gets one.

🤖 Generated with Claude Code

…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.
@gemini-code-assist

Copy link
Copy Markdown

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.
@AnobleSCM
AnobleSCM marked this pull request as ready for review August 3, 2026 20:13
@AnobleSCM
AnobleSCM merged commit 6f49ea2 into main Aug 3, 2026
6 checks passed
@gemini-code-assist

Copy link
Copy Markdown

Caution

The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread src/ui/report.ts
Comment on lines +225 to +227
if (fold(cwd, caseSensitivity) !== fold(home, caseSensitivity)) {
const relative = toCwdRelative(path, cwd, caseSensitivity);
if (relative !== path) return relative;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

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.

1 participant