✨ feat(cli): colored startup banner from the whale logo#440
Merged
Conversation
- 🎨 render the master logo (drydock.png) as a truecolor half-block banner on an interactive terminal, followed by a `drydock v<version> · <mode>` identity line - 🔧 art is baked at build time by scripts/gen-banner.mjs (deterministic), so startup decodes no image — app/banner/art.ts is generated - 🔒 written to stderr; auto-suppressed when not a TTY or NO_COLOR is set, keeping logs and piped output clean - ✅ 100% coverage: app/banner/index.test.ts (11 cases) plus entrypoint assertions that renderBanner runs for both controller and agent modes
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
| // --------------------------------------------------------------------------- | ||
| // 1. Dump pixels via ImageMagick | ||
| // --------------------------------------------------------------------------- | ||
| const raw = execSync(`magick ${PNG} -resize ${TARGET_WIDTH}x -depth 8 txt:-`, { |
| // 5. Lint/format the generated file | ||
| // --------------------------------------------------------------------------- | ||
| try { | ||
| execSync(`npx @biomejs/biome check --write ${OUT}`, { |
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
biggest-littlest
approved these changes
Jun 16, 2026
biggest-littlest
left a comment
Member
There was a problem hiding this comment.
Clean TTY-gated banner. Art baked at build time so startup pulls in no image decoder, and it's suppressed for non-TTY/NO_COLOR so logs and pipes stay clean. Coverage is full. LGTM.
ALARGECOMPANY
approved these changes
Jun 16, 2026
ALARGECOMPANY
left a comment
Member
There was a problem hiding this comment.
Generator is deterministic, both controller/agent modes are exercised, and the gate is green. Nice touch. Approving.
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.
What
drydock now renders a compact colored banner of the whale logo on startup when attached to an interactive terminal, followed by a
drydock v<version> · <mode>identity line.How
scripts/gen-banner.mjssamples the master logo (drydock.png) to a 50-cell-wide grid and renders each terminal row as two pixel rows via the▀half-block (upper pixel = foreground, lower = background) using 24-bit truecolor escapes. Transparent cells become spaces; blank top/bottom rows are trimmed. The result is baked intoapp/banner/art.tsso startup decodes no image and pulls in no image library. The generator is deterministic — re-running produces no diff.renderBanner({ mode })writes the art + identity line to stderr, centering it when the terminal is wider than the banner.NO_COLORis set (non-empty), so piped output, log capture, and CI stay clean. Called from the entrypoint for both controller and agent modes.Tests
app/banner/index.test.ts— 11 cases covering TTY gating,NO_COLOR(set / empty / unset), centering vs no-padding vs undefined columns, the stderr/env fallbacks, and identity-line content for both modes.app/index.test.ts— assertsrenderBannerruns with{ mode: 'controller' }and{ mode: 'agent' }.Builds on the new master logo landed in #439.