SKILL.md
DevEx Developer Experience TUI Best Practices
Comprehensive developer experience guide for building TypeScript terminal user interfaces using Ink (React for CLIs) and Clack prompts. Contains 42 rules across 8 categories, prioritized by impact to guide automated refactoring and code generation.
When to Apply
Reference these guidelines when:
- Building CLI tools with interactive prompts using @clack/prompts
- Creating React-based terminal UIs with Ink
- Handling keyboard input and user interactions
- Optimizing terminal rendering and preventing flicker
- Designing developer-friendly CLI experiences
Rule Categories by Priority
Priority
Category
Impact
Prefix
1
Rendering & Output
CRITICAL
render-
2
Input & Keyboard
CRITICAL
input-
3
Component Patterns
HIGH
tuicomp-
4
State & Lifecycle
HIGH
tuistate-
5
Prompt Design
MEDIUM-HIGH
prompt-
6
UX & Feedback
MEDIUM
ux-
7
Configuration & CLI
MEDIUM
tuicfg-
8
Robustness & Compatibility
LOW-MEDIUM
robust-
Quick Reference
1. Rendering & Output (CRITICAL)
render-single-write- Batch Terminal Output in Single Write
render-overwrite-dont-clear- Overwrite Content Instead of Clear and Redraw
render-synchronized-output- Use Synchronized Output Protocol for Animations
render-60fps-baseline- Target 60fps for Smooth Animation
render-partial-updates- Update Only Changed Regions
render-escape-sequence-batching- Defer ANSI Escape Code Generation to Final Output
2. Input & Keyboard (CRITICAL)
input-useinput-hook- Use useInput Hook for Keyboard Handling
input-immediate-feedback- Provide Immediate Visual Feedback for Input
input-modifier-keys- Handle Modifier Keys Correctly
input-isactive-focus- Use isActive Option for Focus Management
input-escape-routes- Always Provide Escape Routes
3. Component Patterns (HIGH)
tuicomp-box-flexbox- Use Box Component with Flexbox for Layouts
tuicomp-text-styling- Use Text Component for All Visible Content
tuicomp-measure-element- Use measureElement for Dynamic Sizing
tuicomp-static-for-logs- Use Static Component for Log Output
tuicomp-percentage-widths- Use Percentage Widths for Responsive Layouts
tuicomp-border-styles- Use Border Styles for Visual Structure
4. State & Lifecycle (HIGH)
tuistate-useapp-exit- Use useApp Hook for Application Lifecycle
tuistate-cleanup-effects- Always Clean Up Effects on Unmount
tuistate-functional-updates- Use Functional State Updates to Avoid Stale Closures
tuistate-usecallback-stable- Stabilize Callbacks with useCallback
tuistate-usememo-expensive- Memoize Expensive Computations with useMemo
5. Prompt Design (MEDIUM-HIGH)
prompt-group-flow- Use Clack group() for Multi-Step Prompts
prompt-validation- Validate Input Early with Descriptive Messages
prompt-cancellation- Handle Cancellation Gracefully with isCancel
prompt-spinner-tasks- Use Spinner and Tasks for Long Operations
prompt-custom-render- Build Custom Prompts with @clack/core
6. UX & Feedback (MEDIUM)
ux-progress-indicators- Show Progress for Operations Over 1 Second
ux-color-semantics- Use Colors Semantically and Consistently
ux-error-messages- Write Actionable Error Messages
ux-next-steps- Show Next Steps After Completion
ux-intro-outro- Use Intro and Outro for Session Framing
7. Configuration & CLI (MEDIUM)
tuicfg-sensible-defaults- Provide Sensible Defaults for All Options
tuicfg-env-vars- Support Standard Environment Variables
tuicfg-flags-over-args- Prefer Flags Over Positional Arguments
tuicfg-help-system- Implement Comprehensive Help System
tuicfg-json-output- Support Machine-Readable Output Format
8. Robustness & Compatibility (LOW-MEDIUM)
robust-tty-detection- Detect TTY and Adjust Behavior Accordingly
robust-signal-handling- Handle Process Signals Gracefully
robust-exit-codes- Use Meaningful Exit Codes
robust-terminal-restore- Always Restore Terminal State on Exit
robust-graceful-degradation- Degrade Gracefully for Limited Terminals
How to Use
Read individual reference files for detailed explanations and code examples:
- Section definitions - Category structure and impact levels
- Rule template - Template for adding new rules
- render-single-write - Example rule file
- input-useinput-hook - Example rule file
Full Compiled Document
For the complete guide with all rules expanded: AGENTS.md