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.
tools
Building resilient distributed systems with circuit breakers, retries with full-jitter exponential backoff, retry budgets (per-request 3-attempt + per-client 10% ratio per Google SRE), deadline propagation, and the cascading-failure math (4 layers × 3 retries = 64x amplification). Grounded in Resilience4j, Microsoft Cloud Patterns, AWS Architecture Blog (Marc Brooker), and Google SRE Book.
testing
Designing HTTP cache headers that work correctly across browsers, CDNs, and shared proxies — `Cache-Control` directives per RFC 9111, `stale-while-revalidate` and `stale-if-error` per RFC 5861, the Vary header for varying responses, and surrogate keys for tag-based purging. Grounded in IETF RFCs and Cloudflare/Fastly docs.
development
Use when designing or fixing a Content Security Policy on a real site, choosing between nonce-based and hash-based CSP, adding strict-dynamic, debugging "Refused to execute inline script" errors, deploying CSP in report-only mode first, configuring report-to / report-uri, or auditing an existing policy for unsafe-inline / unsafe-eval / wildcards. Triggers: "CSP blocks legitimate inline script", strict-dynamic, nonce-{RANDOM}, sha256-{HASH}, object-src none, base-uri none, frame-ancestors, Trusted Types, X-Content-Security-Policy obsolete, report-only vs enforced. NOT for general HTTP security headers (HSTS, COOP/COEP), Trusted Types deep dive, CORS configuration, or building a WAF.
tools
Choosing and operating an HTTP API versioning strategy that doesn't break clients — Stripe's date-based pinned versions, the Deprecation/Sunset header pair (RFC 9745 + RFC 8594), URI vs header vs media-type approaches, and the version-transformer pattern. Grounded in Stripe's published architecture and IETF RFCs.