skills/beautiful-cli-design/SKILL.md
Expert in making CLI tools visually stunning and delightful — not just functional. Covers ANSI color systems (16/256/truecolor with graceful degradation), Unicode box drawing, progress indicators, tables, animated output, ASCII art, rich text, interactive prompts, and full TUI frameworks (Ink, Bubble Tea, Ratatui, Rich, Clack). Activate on: "make this CLI beautiful", "terminal UI", "CLI design", "pretty output", "progress bar", "spinner", "CLI table", "terminal colors", "TUI framework", "interactive prompts", "command line aesthetics", "CLI polish", "terminal styling". NOT for: web UI design (use web-design-expert), GUI desktop apps (use rust-tauri-development), API design (use api-architect), general shell scripting (use devops-expert).
npx skillsauth add curiositech/windags-skills beautiful-cli-designInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
You are an expert in making command-line interfaces visually stunning, usable, and delightful. A CLI is a user interface — it deserves the same design rigor as a web app.
Project Requirements → Framework Choice
├─ Simple prompts/wizards (login flow, setup)
│ ├─ TypeScript → Clack
│ ├─ Go → Huh/Survey
│ └─ Rust → inquire
├─ Rich output only (no interaction)
│ ├─ TypeScript → chalk + ora
│ ├─ Python → Rich
│ ├─ Go → lipgloss
│ └─ Rust → owo-colors + indicatif
├─ Full TUI (interactive dashboards, editors)
│ ├─ Team knows React → Ink
│ ├─ Go preferred → Bubble Tea
│ ├─ Performance critical (>60fps) → Ratatui
│ └─ Python ecosystem → Textual
└─ Mixed (prompts + rich output + some TUI)
├─ Budget <2 weeks → Rich/lipgloss + basic prompts
├─ Team <3 devs → Clack + chalk
└─ Enterprise scale → Full framework (Ink/Bubble Tea)
Terminal Support Level → Color Strategy
├─ Basic compatibility needed (CI/servers)
│ ├─ NO_COLOR detection → strip all colors
│ ├─ !isTTY → plain text mode
│ └─ Use only 4 basic colors (green/red/yellow/blue)
├─ Modern terminal assumption (dev tools)
│ ├─ Check COLORTERM for truecolor → use 24-bit RGB
│ ├─ Fall back to 256-color mode → use palette indices
│ └─ Graceful degradation to 16-color
└─ Maximum compatibility (OS installers, system tools)
├─ Detect terminal capabilities first
├─ Provide --no-color flag override
└─ Default to minimal color (success/error only)
Operation Characteristics → Indicator Type
├─ Known duration/steps
│ ├─ >30 seconds → Full progress bar with ETA
│ ├─ 5-30 seconds → Simple progress bar
│ └─ <5 seconds → Spinner with 150ms delay
├─ Unknown duration
│ ├─ Network/IO bound → Spinner + elapsed time
│ ├─ CPU intensive → Animated dots + memory usage
│ └─ Multiple parallel → Multi-line status display
└─ Real-time streaming
├─ Log output → Prefix each line with status
├─ Multiple streams → Split pane layout
└─ Interactive → Live updating dashboard
Symptom: Every piece of text has different colors, making nothing stand out Detection Rule: If you count >5 colors in a single screen, you've hit this Fix: Limit to 3 semantic colors (success/error/info) + 1 accent. Use grayscale for hierarchy.
Symptom: CLI looks great in dark terminal but unreadable in light themes Detection Rule: If you hardcode dark-theme colors (bright yellow, bright blue) without testing Fix: Use semantic ANSI codes (31=red, 32=green) or test in both iTerm dark/light themes
Symptom: CLI crashes or shows ANSI codes when piped: mycli | head -5
Detection Rule: If process.stdout.isTTY check is missing from color logic
Fix: Detect TTY and strip all formatting for pipes. Add --color=always override flag.
Symptom: Terminal cursor disappears after CLI crashes, user needs tput cnorm to recover
Detection Rule: If you hide cursor (\x1b[?25l) without SIGINT/SIGTERM handlers
Fix: Always register exit handlers to restore cursor before process termination
Symptom: Tables and boxes misaligned when users have CJK names or emoji in data
Detection Rule: If using .length instead of string-width for column calculations
Fix: Use unicode-aware width calculation libraries for all alignment math
Before: Basic inquirer prompts, no branding, inconsistent styling
? What's your project name? my-app
? Choose framework: React
Installing dependencies...
Done.
After: Branded Clack experience with consistent design
┌ create-windags-app
│
◇ Project name?
│ my-app
│
◇ Framework?
│ ● React (recommended)
│ Vue
│ Svelte
│
◆ Installing dependencies...
│
├ Next steps ──────────────────╮
│ cd my-app │
│ npm run dev │
├───────────────────────────────╯
│
└ You're all set!
Decision rationale: Clack chosen over inquirer because team wanted branded experience and React-style component thinking. Time budget allowed 3 days for polish vs basic prompts.
Trade-offs:
Before: Plain text logs streaming past
Running lint...
Lint completed
Running build...
Build completed
Running tests...
Tests completed
After: Live updating dashboard with parallel progress
╭─ Build Pipeline ─────────────────────────────────────╮
│ Lint ✓ done 0.8s │
│ Build ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ done 2.1s │
│ Test suite ━━━━━━━━━━━━━━━━╸──────────── 64% 1.2s │
│ Type check ⠋ running... │
│ │
│ Elapsed: 2.3s ETA: 1.4s │
╰─────────────────────────────────────────────────────╯
Decision rationale: Chose Ink over terminal manipulation because team knew React, needed real-time updates, and had 1 week budget for this feature.
Trade-offs:
Before: Cryptic technical error
Error: ENOENT: no such file or directory, open 'windags.config.ts'
at Object.openSync (fs.js:498:3)
After: Helpful, actionable error with context
╭─ Configuration Error ────────────────────────────────╮
│ │
│ ✗ Could not find configuration file │
│ │
│ Looked in: │
│ • ./windags.config.ts │
│ • ./.windags/config.ts │
│ • ~/.windags/config.ts │
│ │
│ To fix: Run wg init to create a configuration │
│ │
╰──────────────────────────────────────────────────────╯
Decision rationale: Custom error formatting because this is a common first-run experience. Investment in good errors pays off in reduced support tickets.
What novice misses vs expert catches:
NO_COLOR=1, TERM=dumb, and pipe output (| cat) all produce clean text--json or --format=json flag bypasses all formatting for scriptsDo NOT use this skill for:
web-design-expert insteadrust-tauri-development insteadmobile-app-development insteadapi-architect insteaddevops-expert insteaddatabase-architect insteadDelegate to other skills when:
web-design-expert + typescript-expertrust-tauri-developmentdata-visualization + your chosen frameworkperformance-optimizationThis skill focuses purely on terminal-based user interfaces. The moment someone mentions "browser", "mobile", "web server", or "GUI window", redirect to the appropriate specialist.
data-ai
license: Apache-2.0 NOT for unrelated tasks outside this domain.
development
Use when designing caching strategies (cache-aside, write-through, write-behind), implementing distributed locks, building rate limiters, leaderboards, real-time streams (XADD/consumer groups), pub/sub, or tuning eviction policies. Triggers: thundering-herd on cache miss, dogpile on key expiry, Redlock vs SET-NX-PX choice, sliding-window rate limiter, hot-key on a single cluster slot, big-key blowup, MULTI/EXEC across slots, KEYS in production. NOT for Redis Cluster operations/admin (different domain), embedded KV (SQLite, leveldb), in-process LRU caches, or Memcached.
tools
Drawing the `'use client'` boundary correctly in React Server Components apps (Next.js App Router, RSC frameworks) — leaf-pushing, slot composition, serialization rules, and environment poisoning prevention. Grounded in react.dev and Next.js 16 docs.
development
Use when designing rate limiting for an API, choosing between token bucket / sliding window / leaky bucket / fixed window, implementing it in Redis, deciding edge (Cloudflare/Upstash) vs origin enforcement, sizing per-user vs per-IP vs per-endpoint quotas, returning the right 429 response with Retry-After, or fixing the boundary-burst bug in fixed-window limiters. Triggers: 429 too many requests, INCR + EXPIRE, ZADD + ZREMRANGEBYSCORE + ZCARD, X-RateLimit-Remaining header, Cloudflare WAF rate limiting rules, Upstash @upstash/ratelimit, leaky bucket shaping vs policing, distributed rate limiter consistency. NOT for DDoS mitigation specifically (different scale), CAPTCHA / bot management, full WAF design, or per-user quota billing.