Conversation
webcmd has a logo but no character. Nothing greets a fresh `npm install -g @agentrhq/webcmd`, and `--help` shows block-letter wordmark art with no personality. Weaver is a chunky block spider: webcmd crawls a site once and weaves what it learns into local memory, so the character draws the product's own pitch — explore once, execute forever. - src/mascot.ts holds the art, the frames, and the renderer. - The sprite joins the --help banner as a third column, 73 display columns in total, inside the 80-column budget. - postinstall animates it on a global install; setup greets first run. - docs/webcmd-weaver.svg is a vector twin generated from the same sprite, for docs and merch. The art is drawn with filled block glyphs rather than box-drawing outlines so the silhouette survives with color stripped. Color is layered on top and stays purely additive, which is what keeps the existing command-presentation invariant that stripping ANSI from a colored help screen yields the plain one byte for byte. All 14 existing banner tests pass untouched. Animation is gated on the output stream being a TTY — not on prompting being possible — so piped installs and scripted setup runs get a single static frame with no escapes, and CI gets nothing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013dvZ6uiCdQmpUTTiQ2XJZL
Contributor
🟠 Maintainer review suggested — low confidenceThe automated review could not reach a fully supported conclusion. This review is advisory and does not block merging. |
10 tasks
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.
Description
Gives webcmd a mascot: Weaver, a chunky block spider who drops in on a thread when you install webcmd, and stands beside the wordmark in the help banner.
The character argues for itself on product grounds, not only on taste — a spider that crawls a site once and weaves what it learns into its web is sitemap memory, so it draws "explore once, execute forever" without a sentence of explanation.
Related issue: #510
What changed
src/mascot.ts(new) — the art, seven frames, renderer, animator. Pure; no I/O beyond an injected writer.src/brand.ts—ACCENT_RGB/SHADE_RGBmove here so#56C5FFis declared once and shared with the help banner rather than a fourth copy.src/command-presentation.ts—ROOT_HELP_BANNER_PARTSgains a third column for the sprite. Banner width becomes 73 display columns (wordmark 52 + 2 gutter + mascot 18), inside the 80 budget. The Hangul-filler spacer row is left exactly as wide as it was.scripts/postinstall.js— animates the drop on a global install, above the existing "Next step" block.src/hosted/setup.ts— greets first-run setup.docs/webcmd-weaver.svg(new) — vector twin, generated from the same sprite so the terminal character and the illustrated one cannot drift.Two constraints worth calling out for review
The art is filled block glyphs, not box-drawing outlines. Each part of Weaver is a different character (
█body,▓legs,●eyes) rather than one character recolored. That keeps color purely additive, which is what preserves the invariant atcommand-presentation.test.ts:170— stripping ANSI from a colored help screen returns the plain one byte for byte. All 14 existing banner tests pass untouched, including the local/hosted byte-identity assertions inhosted/runner.test.ts.Animation is gated on the output stream being a TTY, not on prompting being possible.
setup.ts's existingcanPrompt()returns true whenever aquestionfn is injected, even with no terminal attached; animating on that brokedoes not resolve until all caller-owned output writes complete, which asserts exact write counts. A separatecanAnimate()checks the stream instead — the more correct condition, since an injected prompt says nothing about whether a cursor can be moved. Every existing setup test passes unmodified.Escape hatches: piped installs get one static frame with no escapes, CI gets nothing (the existing
process.env.CIguard),NO_COLORdrops color, andWEBCMD_NO_MASCOT=1opts out entirely.Type of Change
Checklist
skill-src/, I ranmake buildand committedskills/— n/a, no skill changesVerification
npm run typecheckclean.npm run buildclean.14 new tests in
src/mascot.test.tscover:\x1b[<n>Aredraw tears mid-animationscripts/postinstall.jsmatchWEAVER_FRAMES— that script must run with no build step, so it cannot import the module, and this is the guard against the copies driftingNote on the wider suite:
npm testshows unrelated pre-existing failures on Windows (EBUSYunlinkingchrome_debug.login the browser runner tests, plus temp-dir contention). I reproduced 28 of them on a clean checkout ofmainwith this branch stashed, so they are environmental rather than introduced here.Screenshots / Output
webcmd --help:Final frame of the install greeting:
Blink frame —
●becomes─, and the leg rows shift one column as he lands:Happy to change the character, the palette, or drop any of the three surfaces — the art lives behind one module, so placement is easy to trim.
🤖 Generated with Claude Code
https://claude.ai/code/session_013dvZ6uiCdQmpUTTiQ2XJZL