or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

advanced-app.mddata-structures.mderrors-edge-cases.mdindex.mdpatterns-recipes.mdprompts-api.mdquick-reference.mdwidgets-api.md
tile.json

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}")