cli-designer
Design and review CLI commands following clig.dev and 12-Factor CLI principles. Use when adding commands, designing flags/arguments, writing help text, handling errors, formatting output, or reviewing CLI code for UX issues.
Installation
Follow the repository instructions for this skill and your agent. Review the files and dependencies before adding it to your workflow.
View source ↗GuidesSkill instructions
CLI Designer
You are a CLI design advocate for HawkOp, ensuring every command follows clig.dev and 12-Factor CLI Apps principles.
Quick Reference
| Principle | Rule |
|---|---|
| Help | -h/--help everywhere, always include examples |
| Args | 1 positional type OK, 2+ types → use flags |
| Streams | stdout = data, stderr = messages |
| Errors | What went wrong + how to fix it |
| Output | Tables without borders, one row = one entry |
| JSON | Always support --format json |
| TTY | Degrade gracefully when piped |
Workflows
When Adding a New Command
- Gather requirements - Ask about purpose, subcommands, flags, arguments
- Design the interface - Apply the args-vs-flags rule (see patterns.md)
-
Write help text - Include examples in
after_help -
Implement - Follow patterns in
src/cli/ - Verify - Run through checklist.md
When Reviewing CLI Code
- Identify CLI changes - What commands/flags are affected?
- Run checklist - Use checklist.md Must Have items
-
Test non-TTY - Verify
hawkop cmd | jqworks - Report - Summary, pass/fail, blocking issues
When Fixing UX Issues
- Understand the confusion - What did the user expect vs. get?
- Check against principles - Which factor is violated?
- Propose fix - Reference 12-factors.md for guidance
- Verify help text - Would better help have prevented this?
The Cardinal Rules
stdout is for DATA, stderr is for MESSAGING
// Data → stdout (can be piped)
println!("{}", table);
// Messages → stderr (always visible)
eprintln!("Fetching scans...");
Errors Must Be Actionable
// BAD: What does this mean?
#[error("Invalid configuration")]
// GOOD: What + Why + How to fix
#[error("Missing API key\n\nRun 'hawkop init' to configure authentication.")]
Respect the User's Environment
use std::io::IsTerminal;
// Colors, spinners only when interactive
if std::io::stdout().is_terminal() && std::env::var("NO_COLOR").is_err() {
// Fancy output OK
}
Additional Resources
- Code patterns: patterns.md - Rust/clap templates for common scenarios
- Full checklist: checklist.md - Complete design verification
- 12 Factors explained: 12-factors.md - Deep dive on each principle
- clig.dev reference: clig.md - Local reference for clig.dev guidelines
-
Project docs:
docs/CLI_DESIGN_PRINCIPLES.md- Full reference
HawkOp Conventions
| Convention | Standard |
|---|---|
| Global flags | --org, --format, --config, --debug |
| Pagination | --limit, --page, --all |
| Output formats | table (default), json |
| Navigation hints | → hawkop <next-command> on stderr |
| Error prefix | Error: with colored output when TTY |
Examples
Read the usage examples in the source repository.
View source ↗Source history
- Indexed on
- 2026-01-20
- Index updated
- 2026-01-26
- Branch
- main
Index and sync dates describe this directory. View the source repository for code history.
GitHub ↗chat Comments (0)
Sign in to join the discussion and leave a comment.
No comments yet. Be the first to share your thoughts!