Agent skill

prompt-skill

Create interactive terminal prompts using questionary for user input. Use when building forms, selection menus, and confirmation dialogs.

Stars 163
Forks 31

Install this agent skill to your Project

npx add-skill https://github.com/majiayu000/claude-skill-registry/tree/main/skills/development/prompt-skill-maneeshanif-cli-todo-app-speckit

SKILL.md

Prompt Skill

Purpose

Create beautiful, interactive terminal prompts using questionary.

Instructions

Custom Style

python
import questionary
from questionary import Style

# Retro cyberpunk style
PROMPT_STYLE = Style([
    ('qmark', 'fg:#FF00FF bold'),       # Question mark
    ('question', 'fg:#00FFFF bold'),     # Question text
    ('answer', 'fg:#00FF00 bold'),       # Answer text
    ('pointer', 'fg:#FF00FF bold'),      # Selection pointer
    ('highlighted', 'fg:#00FFFF bold'),  # Highlighted option
    ('selected', 'fg:#00FF00'),          # Selected checkbox
    ('separator', 'fg:#888888'),         # Separator line
    ('instruction', 'fg:#888888'),       # Instructions
    ('text', 'fg:#FFFFFF'),              # Regular text
])

Text Input

python
def prompt_title() -> str:
    """Prompt for task title."""
    return questionary.text(
        "Task title:",
        validate=lambda t: len(t.strip()) > 0 or "Title cannot be empty",
        style=PROMPT_STYLE
    ).ask()

def prompt_description() -> str:
    """Prompt for optional description."""
    return questionary.text(
        "Description (optional):",
        multiline=False,
        style=PROMPT_STYLE
    ).ask() or ""

Selection Menu

python
def prompt_priority() -> str:
    """Prompt for priority selection."""
    choices = [
        questionary.Choice("🟢 Low", value="low"),
        questionary.Choice("🟡 Medium", value="medium"),
        questionary.Choice("🟠 High", value="high"),
        questionary.Choice("🔴 Urgent", value="urgent"),
    ]
    return questionary.select(
        "Priority level:",
        choices=choices,
        default="medium",
        style=PROMPT_STYLE
    ).ask()

def prompt_main_menu() -> str:
    """Main menu selection."""
    choices = [
        questionary.Choice("📝 Add Task", value="add"),
        questionary.Choice("📋 List Tasks", value="list"),
        questionary.Choice("🔍 Search", value="search"),
        questionary.Choice("✅ Complete Task", value="complete"),
        questionary.Choice("🗑️ Delete Task", value="delete"),
        questionary.Choice("⚙️ Settings", value="settings"),
        questionary.Choice("👋 Exit", value="exit"),
    ]
    return questionary.select(
        "What would you like to do?",
        choices=choices,
        style=PROMPT_STYLE
    ).ask()

Checkbox (Multiple Selection)

python
def prompt_tags(existing_tags: list = None) -> list:
    """Prompt for tag selection."""
    default_tags = ["work", "personal", "urgent", "shopping", "health"]
    all_tags = list(set(default_tags + (existing_tags or [])))
    
    choices = [questionary.Choice(tag, value=tag) for tag in sorted(all_tags)]
    
    return questionary.checkbox(
        "Select tags:",
        choices=choices,
        style=PROMPT_STYLE
    ).ask() or []

Confirmation

python
def confirm_action(message: str, default: bool = False) -> bool:
    """Confirm an action."""
    return questionary.confirm(
        message,
        default=default,
        style=PROMPT_STYLE
    ).ask()

def confirm_delete(task_title: str) -> bool:
    """Confirm task deletion."""
    return confirm_action(
        f"Delete '{task_title}'? This cannot be undone.",
        default=False
    )

Autocomplete

python
def prompt_search(suggestions: list = None) -> str:
    """Search with autocomplete."""
    return questionary.autocomplete(
        "Search tasks:",
        choices=suggestions or [],
        style=PROMPT_STYLE
    ).ask()

Complete Task Form

python
def prompt_add_task(existing_tags: list = None) -> dict:
    """Complete form for adding a task."""
    
    # Get title
    title = questionary.text(
        "Task title:",
        validate=lambda t: len(t.strip()) > 0 or "Title is required",
        style=PROMPT_STYLE
    ).ask()
    
    if not title:  # User cancelled
        return None
    
    # Get description
    description = questionary.text(
        "Description (optional):",
        style=PROMPT_STYLE
    ).ask()
    
    # Get priority
    priority = questionary.select(
        "Priority:",
        choices=[
            questionary.Choice("🟢 Low", value="low"),
            questionary.Choice("🟡 Medium", value="medium"),
            questionary.Choice("🟠 High", value="high"),
            questionary.Choice("🔴 Urgent", value="urgent"),
        ],
        default="medium",
        style=PROMPT_STYLE
    ).ask()
    
    # Get tags
    tags = questionary.checkbox(
        "Tags:",
        choices=list(set(["work", "personal", "urgent"] + (existing_tags or []))),
        style=PROMPT_STYLE
    ).ask() or []
    
    # Ask about due date
    has_due = questionary.confirm(
        "Set a due date?",
        default=False,
        style=PROMPT_STYLE
    ).ask()
    
    due_date = None
    if has_due:
        due_date = questionary.text(
            "Due date (YYYY-MM-DD):",
            validate=lambda d: _validate_date(d),
            style=PROMPT_STYLE
        ).ask()
    
    return {
        "title": title.strip(),
        "description": description.strip() if description else None,
        "priority": priority,
        "tags": tags,
        "due_date": due_date
    }

def _validate_date(date_str: str) -> bool:
    """Validate date format."""
    if not date_str:
        return True
    try:
        from datetime import datetime
        datetime.strptime(date_str, "%Y-%m-%d")
        return True
    except ValueError:
        return "Invalid date format. Use YYYY-MM-DD"

Task Selection

python
def prompt_select_task(tasks: list) -> int:
    """Select a task from list."""
    if not tasks:
        return None
    
    choices = [
        questionary.Choice(
            f"[{t['id']}] {t['title']} ({t['priority']})",
            value=t['id']
        )
        for t in tasks
    ]
    
    return questionary.select(
        "Select a task:",
        choices=choices,
        style=PROMPT_STYLE
    ).ask()

Best Practices

  • Always provide a custom style for consistency
  • Add validation to text inputs
  • Use Choice objects for cleaner value mapping
  • Handle None returns (user cancellation)
  • Group related prompts into form functions
  • Use icons for visual appeal
  • Provide sensible defaults
  • Add confirmation for destructive actions

Didn't find tool you were looking for?

Be as detailed as possible for better results