sugarcraft / sugar-readline
PHP port of erikgeiser/promptkit — interactive line-editing prompt library. Supports text input with validation/completion/hidden-password mode, selection prompts with filtering/pagination/cursor navigation, confirmation prompts, and textarea multi-line input.
v0.2.0
2026-05-07 01:29 UTC
Requires
- php: ^8.1
Requires (Dev)
- phpunit/phpunit: ^10.5
This package is not auto-updated.
Last update: 2026-05-07 14:50:25 UTC
README
SugarReadline
PHP port of erikgeiser/promptkit — interactive line-editing prompt library for terminal UIs.
Features
- TextPrompt — single-line input with validation, auto-completion, hidden/password mode, char limit, default value
- SelectionPrompt — filtered list with cursor navigation and pagination
- MultiSelectPrompt — filtered multi-choice with min/max enforcement and FIFO rollover at the cap
- ConfirmationPrompt — yes/no with customizable labels, decoupled select-vs-submit
- TextareaPrompt — multi-line text input with line/column cursor and optional max-line cap
- Pure renderer — every method returns a new immutable instance;
view()returns ANSI strings,value()returns the data
Install
composer require sugarcraft/sugar-readline
Quick Start
Text Prompt
use SugarCraft\Readline\{Key, TextPrompt}; $p = TextPrompt::new('Enter your name: ') ->withDefault('Anonymous') ->withCompletions(['Alice', 'Bob', 'Carol']); $p = $p->handleChar('A')->handleChar('l')->handleKey(Key::Tab)->submit(); echo $p->value(); // 'Alice'
Selection Prompt
use SugarCraft\Readline\SelectionPrompt; $p = SelectionPrompt::new('Choose a fruit:', ['Apple', 'Banana', 'Cherry', 'Date']) ->withFilter('an'); // Banana matches echo $p->selectedValue(); // 'Banana'
Multi-Select Prompt
use SugarCraft\Readline\{Key, MultiSelectPrompt}; $p = MultiSelectPrompt::new('Pick:', ['A', 'B', 'C']) ->withMinSelections(1) ->handleKey(Key::Space) // mark A ->handleKey(Key::Down) ->handleKey(Key::Space) // mark B ->handleKey(Key::Enter); // submit (min satisfied) print_r($p->selectedValues()); // ['A', 'B']
Confirmation Prompt
use SugarCraft\Readline\{ConfirmationPrompt, Key}; $p = ConfirmationPrompt::new('Delete file?') ->handleKey('n') // selects No (does not auto-submit) ->handleKey(Key::Left) // changes mind back to Yes ->submit(); echo $p->result() ? 'yes' : 'no'; // 'yes'
Key Bindings
The SugarCraft\Readline\Key class exposes symbolic constants for every supported key.
Key::Left/Key::Right— move cursor (text input)Key::Up/Key::Down— navigate selection list / change line in textareaKey::PageUp/Key::PageDown— page through long listsKey::Home/Key::End— jump within the current line / listKey::Enter— submit text or select current choiceKey::Space— toggle mark in multi-selectKey::Tab— auto-complete or toggle confirmation valueKey::Backspace/Key::Delete— delete charactersKey::CtrlU/Key::CtrlK— delete to start / end of lineKey::Escape/Key::CtrlC— abort
Submit / Abort Semantics
Each prompt is a state machine with three states: pending, submitted, aborted.
submit()finalises the prompt; forMultiSelectPromptit only succeeds whencanSubmit()is true.abort()(or feedingKey::Escape/Key::CtrlC) discards the prompt;value()/selectedValues()then return empty.isSubmitted()/isAborted()report status;currentValue()(Confirmation) andselectedValue()(Selection) reflect the current cursor regardless of submission state.