Hi Derick, hi internals,

Small update from my side: I pushed this further based on the feedback here.

The current release is v0.4.1 now:
https://github.com/prateekbhujel/php-terminal/releases/tag/v0.4.1

The API is now fully on the Terminal\Terminal class + enums shape. Raw mode
restore uses an opaque Terminal\ModeToken object, special keys return
Terminal\Key cases, printable input returns strings, and resize is surfaced
as Terminal\Key::Resize on both POSIX and Windows.

I also documented the current key scope more clearly: code points rather
than grapheme clusters for now, no F1-F12/modifier normalization yet, and
the POSIX sequence timeout defaults to 25ms.

At this point I am mainly wondering what the right next step is: keep
hardening it as a PECL/ecosystem package first, or is there anything in the
current API shape that would already be a blocker if this ever moved closer
to core?

Thanks,
Pratik


On Tue, Jun 2, 2026 at 3:42 PM Pratik Bhujel <[email protected]>
wrote:

> Hi Derick,
>
> Thanks, that makes sense.
>
> I moved the package in that direction now. The current v0.3.0 API uses
> `Terminal\Terminal` with camelCase methods, plus `Terminal\Backend`,
> `Terminal\Stream`, and `Terminal\Key` enums:
>
> https://github.com/prateekbhujel/php-terminal/releases/tag/v0.3.0
>
> I also removed the old procedural API instead of keeping compatibility
> around it. Since this is still pre-1.0 and not something people should be
> depending on yet, it felt better to make the shape cleaner now.
>
> For `readKey()`, special keys now return `Terminal\Key` cases, while
> printable input still returns a string.
>
> For Unicode, it currently returns the next encoded code point from the
> terminal, not a full grapheme cluster. That seemed like the clearer
> low-level primitive to me, but I am happy to adjust that if core would
> prefer a different contract.
>
> Thanks again for looking at it.
>
> Pratik Bhujel
>
> On Tue, Jun 2, 2026 at 2:27 PM Derick Rethans <[email protected]> wrote:
>
>> On Sun, 24 May 2026, Pratik Bhujel wrote:
>>
>> > The goal is to expose a small cross-platform CLI terminal layer for
>> > the pieces that are currently awkward to normalize in userland,
>> > especially on Windows:
>> >
>> > - checking whether stdin/stdout/stderr are TTYs
>> > - reading terminal size
>> > - enabling/restoring raw mode safely
>> > - reading a single key with normalized names
>> > - writing directly to stdout/stderr
>>
>> I think that this is something useful to have.
>>
>> > The extension is still alpha, and I am not proposing it for core right
>> > now. I mainly want feedback on whether this API shape makes sense from
>> > a PHP CLI/runtime point of view, and whether this is better kept as
>> > PECL/ecosystem work first.
>>
>> I have had a look at the API, and from my point of view, I think I would
>> like to see, with in mind a possible introduction into PHP core:
>>
>> - All functions to be part of a Terminal\Terminal class — we have
>>   guidelines for this in place:
>> https://github.com/php/policies/blob/main/coding-standards-and-naming.rst#bundled-extensions
>>
>> - The getBackend() method should return an enum, as there are
>>   (currently) only two possible values: windows, and posix.
>>
>> - Reading a key returns either a string containing a character, or a
>>   sequence of characters describing an action (up, down, etc). I think,
>>   because both of these are strings, this is awkward. Perhaps it would
>>   be better for actual characters to return strings, and again, the
>>   special key-presses to be case of an Enum.
>>
>>   In addition, would it return Unicode graphemes (think emojis), or just
>>   code points?
>>
>> - The stream names (STDOUT, STDIN, and STDERR) again should probably an
>>   Enum.
>>
>> cheers,
>> Derick
>>
>> --
>> https://derickrethans.nl | https://xdebug.org | https://xdebug.cloud
>> Author of Xdebug. Like it? Consider supporting me:
>> https://xdebug.org/support
>> mastodon: @[email protected] @[email protected]
>
>

Reply via email to