CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/pypi-inquirer-textual

Inquirer based on Textual for creating interactive command-line user input prompts

Pending
Quality

Pending

Does it follow best practices?

Impact

Pending

No eval scenarios have been run

SecuritybySnyk

Pending

The risk profile of this skill

Overview
Eval results
Files

index.mddocs/

Inquirer-Textual

Interactive command-line user input prompts built on the Textual framework. Provides text input, password input, number input, confirmation prompts, single-select, multi-select, and multi-prompt forms with validation and keyboard shortcuts.

Package Information

  • Package: inquirer-textual
  • PyPI: pkg:pypi/inquirer-textual@0.2.0
  • Install: pip install inquirer-textual
  • Python: 3.9 to 3.14

Core Imports

# Simple prompt functions
from inquirer_textual import prompts

# Data structures
from inquirer_textual.common.Choice import Choice
from inquirer_textual.common.Result import Result
from inquirer_textual.common.Shortcut import Shortcut

# Advanced: App class for custom flows
from inquirer_textual.InquirerApp import InquirerApp

# Advanced: Widget classes
from inquirer_textual.widgets.InquirerText import InquirerText
from inquirer_textual.widgets.InquirerSecret import InquirerSecret
from inquirer_textual.widgets.InquirerNumber import InquirerNumber
from inquirer_textual.widgets.InquirerConfirm import InquirerConfirm
from inquirer_textual.widgets.InquirerSelect import InquirerSelect
from inquirer_textual.widgets.InquirerCheckbox import InquirerCheckbox
from inquirer_textual.widgets.InquirerMulti import InquirerMulti

# Validation (from Textual framework)
from textual.validation import Validator, ValidationResult, Function

Quick Start

from inquirer_textual import prompts

# Text input
result = prompts.text("Enter name:")
if result.command == 'select':
    name = result.value  # str

# Selection
result = prompts.select("Choose:", ["A", "B", "C"])
if result.command == 'select':
    choice = result.value  # str

# Multi-select
result = prompts.checkbox("Select features:", ["Auth", "DB", "Cache"])
if result.command == 'select':
    features = result.value  # list[str]

# Confirmation
result = prompts.confirm("Continue?", default=True)
if result.command == 'select':
    should_continue = result.value  # bool

Architecture

Two-tier API design:

  1. Simple Tier: High-level prompts.* functions for single prompts
  2. Advanced Tier: InquirerApp class with widgets for complex multi-prompt flows

All prompts return Result[T] with:

  • command: str ('select', 'quit', or custom shortcut command)
  • value: T (typed value matching prompt type)

API Overview

Prompt Functions

FunctionReturnsPurpose
prompts.text(message, shortcuts, validators)Result[str]Text input with validation
prompts.secret(message, shortcuts)Result[str]Password/secret input (masked)
prompts.number(message, shortcuts)Result[str]Integer number input
prompts.confirm(message, shortcuts, default, mandatory)Result[bool]Yes/No confirmation
prompts.select(message, choices, shortcuts, default, mandatory)Result[str|Choice]Single selection from list
prompts.checkbox(message, choices, shortcuts, enabled)Result[list[str|Choice]]Multiple selection from list
prompts.multi(widgets, shortcuts)Result[list[Any]]Sequential multi-prompt form

Data Structures

  • Result[T]: Return wrapper with command (str) and value (T)
  • Choice: Selection item with name (str), data (Any), command (str)
  • Shortcut: Keyboard shortcut with key (str), command (str), description (str), show (bool)

Widget Classes

  • InquirerText: Text input widget
  • InquirerSecret: Secret/password input widget
  • InquirerNumber: Number input widget
  • InquirerConfirm: Yes/No confirmation widget
  • InquirerSelect: Single selection widget
  • InquirerCheckbox: Multi-select checkbox widget
  • InquirerMulti: Sequential multi-prompt widget

Advanced App

  • InquirerApp[T]: Main app class for custom flows with inquiry_func

When to Use What

Use Simple Prompt Functions When:

  • Need a single prompt
  • No conditional logic required
  • Straightforward input/selection
from inquirer_textual import prompts
result = prompts.text("Name:")

Use InquirerApp + inquiry_func When:

  • Multiple prompts with conditional logic
  • Variable number of prompts based on user input
  • Need state management across prompts
  • Complex workflows
from inquirer_textual.InquirerApp import InquirerApp
from inquirer_textual.widgets.InquirerText import InquirerText

def flow(app):
    result1 = app.prompt(InquirerText("First:"))
    if result1.value == "something":
        result2 = app.prompt(InquirerText("Second:"))
    app.stop(result1.value)

app = InquirerApp()
result = app.run(inline=True, inquiry_func=flow)

Use Multi-Prompt When:

  • Fixed sequence of prompts
  • No conditional logic needed
  • Collect multiple inputs in order
from inquirer_textual import prompts
from inquirer_textual.widgets.InquirerText import InquirerText

widgets = [InquirerText("Name:"), InquirerText("Email:")]
result = prompts.multi(widgets)
name, email = result.value

Common Commands

All prompts return a Result with a command field:

  • 'select': User pressed Enter to confirm
  • 'quit': User pressed Ctrl+D to quit
  • 'ctrl+c': User pressed Ctrl+C (when mandatory=False)
  • Custom: Any custom command from shortcuts or Choice.command

Always check the command before using the value:

result = prompts.text("Input:")
if result.command == 'select':
    # User confirmed - value is valid
    process(result.value)
elif result.command == 'quit':
    # User quit
    exit(0)

Critical Known Issues

Checkbox enabled Parameter Not Functional (v0.2.0)

The enabled parameter in prompts.checkbox() and InquirerCheckbox does NOT work. All items start unchecked regardless of this parameter.

# This does NOT work in v0.2.0
result = prompts.checkbox("Select:", ["A", "B", "C"], enabled=["A", "B"])
# All items will start unchecked, not A and B as intended

Workaround: None currently. User must manually check desired items.

Documentation Structure

  • Quick Reference - Fast API lookup table
  • Prompts API - All prompt functions with examples
  • Widgets API - All widget classes with examples
  • Data Structures - Result, Choice, Shortcut classes
  • InquirerApp Advanced - InquirerApp class and inquiry_func
  • Patterns & Recipes - Common task patterns
  • Errors & Edge Cases - Error handling, limitations, pitfalls

Minimal Examples

Text Input with Validation

from inquirer_textual import prompts
from textual.validation import Function

result = prompts.text(
    "Email:",
    validators=Function(lambda s: '@' in s, "Invalid email")
)
if result.command == 'select':
    print(f"Email: {result.value}")

Selection with Choice Objects

from inquirer_textual import prompts
from inquirer_textual.common.Choice import Choice

choices = [
    Choice("Dev", data={"url": "localhost:3000"}),
    Choice("Prod", data={"url": "example.com"})
]
result = prompts.select("Environment:", choices)
if result.command == 'select':
    url = result.value.data["url"]

Multi-Prompt Form

from inquirer_textual import prompts
from inquirer_textual.widgets.InquirerText import InquirerText
from inquirer_textual.widgets.InquirerConfirm import InquirerConfirm

result = prompts.multi([
    InquirerText("Name:"),
    InquirerText("Email:"),
    InquirerConfirm("Subscribe?")
])
if result.command == 'select':
    name, email, subscribe = result.value

Shortcuts

from inquirer_textual import prompts
from inquirer_textual.common.Shortcut import Shortcut

shortcuts = [
    Shortcut('escape', 'cancel', 'Cancel'),
    Shortcut('ctrl+s', 'save', 'Save')
]
result = prompts.text("Input:", shortcuts=shortcuts)
if result.command == 'cancel':
    print("Cancelled")
elif result.command == 'save':
    print(f"Saved: {result.value}")
elif result.command == 'select':
    print(f"Final: {result.value}")

docs

advanced-app.md

data-structures.md

errors-edge-cases.md

index.md

patterns-recipes.md

prompts-api.md

quick-reference.md

widgets-api.md

tile.json