All notable changes to pdphilip/omniterm will be documented in this file.
- Dropped Laravel 10 support — minimum is now Laravel 11
- Dropped Symfony 6 support — minimum is now Symfony 7
- Laravel 13 support — compatible with Laravel 11, 12, and 13
- Symfony 8 support — for Laravel 13's Symfony dependency
- Composer test scripts for per-version testing:
composer test:l11,composer test:l12,composer test:l13,composer test:all
illuminate/contractsconstraint:^11.0||^12.0||^13.0symfony/consoleconstraint:^7.0||^8.0laravel/promptsconstraint:^0.2||^0.3- Dev dependencies updated to support Pest 4, PHPStan 2, Larastan 3, Testbench 11
- CI matrix updated: PHP 8.3/8.4, Laravel 11/12/13
Full Changelog: https://github.com/pdphilip/omniterm/compare/v2.1.1...v3.0.0
ask()now accepts a$defaultparameter — when provided, pressing Enter returns the default value instead of an empty string- Question prompt displays
(default: X)hint in muted text when a default is set AskTestwith 7 tests covering question view rendering (options, defaults, prompt character)- Service provider registered in test suite
TestCasefor view-dependent tests
ask()signature:ask(string $question, array $options = [], mixed $default = null): mixed- Question blade view renders the default hint alongside options
Full Changelog: https://github.com/pdphilip/omniterm/compare/v2.1.0...v2.1.1
The rendering engine now handles semantic HTML tags with correct terminal output. Tags apply sensible defaults (block/inline, bold, italic, etc.) that CSS classes can override.
Block tags: <p>, <ul>, <ol>, <li>, <dl>, <dt>, <dd>, <pre>, <code>, <table>, <section>, <article>, <header>, <footer>, <nav>, <aside>, <main>
Inline tags: <b>/<strong> (bold), <i>/<em> (italic), <s> (strikethrough), <a> (underline + hyperlink), <th> (bold)
Self-closing: <br> (line break), <hr> (horizontal rule with color support)
<table> elements render with rounded box-drawing borders. Auto-sized columns with proportional shrinking when content exceeds terminal width. Header rows get a mid-border separator.
<table>
<thead><tr><th>Name</th><th>Status</th></tr></thead>
<tr><td>Build</td><td>Done</td></tr>
</table><code> preserves whitespace and supports line numbers via line and start-line attributes.
<code line="1" start-line="10">
$foo = 'bar';
echo $foo;
</code><a href="..."> wraps content with OSC 8 terminal hyperlink sequences. Terminals that support it show clickable links; others show the text as-is with underline.
<pre> and <code> preserve whitespace and newlines. The preserveWhitespace property inherits through nested elements.
dataList($data, $title, $borderColor)renders any data structure as a tree with box-drawing connectorsdebug($var, $label)dumps data as a tree and exits (the terminaldd())
newLine($count)method for outputting blank linestableRow()andtableRowAsStatus()now acceptmixedvalues (auto-cast to string)Ansi::dim()methodAnsi::hyperlink(),Ansi::stripAnsi()methods
- Rendering engine:
isBlockTag()now recognizesclass="block"on inline tags, not just block tag names - Rendering engine: inline shortcut skipped when
listStyleorspaceYis active (fixes list/space-y rendering with inline children) - Box-drawing characters consolidated into
AsciiHelperas single source of truth (roundedTable()method) SplitBrowserRendererusesAsciiHelperandAnsimethods instead of raw escape sequencesAnsi::visibleLength()andAnsi::truncate()handle OSC 8 hyperlink sequences
- List styles (
list-disc,list-decimal,list-square) now render markers correctly when children are inline elements space-ynow adds spacing between inline children in block containers<span class="block">correctly treated as block element in parent layout decisions
feedback()public method for custom-colored feedback messages with any title and color- Custom
$titleparameter onsuccess(),error(),warning(),info(),disabled()methods confirm()method with Y/N prompt and callback executionConfirmTaskclass for interactive confirmation dialogs- 26 CSS classes added to the rendering engine:
italic,underline,line-through,font-normal,invisible,block,list-disc,list-decimal,list-square,list-none,text-left,text-right,text-center,justify-between,justify-around,justify-center,justify-evenly,uppercase,lowercase,capitalize,snakecase,truncate,min-w-{n},max-w-{n},w-auto,w-full FeedbackTestwith 5 tests covering feedback view rendering- New sample commands:
omniterm:confirm,omniterm:tailwind-classes
- Feedback methods (
success,error,warning,info,disabled) now delegate to a singlefeedback()method using one shared blade view - Removed individual blade views (
success.blade.php,error.blade.php,warning.blade.php,info.blade.php,disabled.blade.php) in favor of unifiedfeedback.blade.php - Type hints and readability improvements across async classes
-
Trait renamed:
OmniTerm\OmniTerm→OmniTerm\HasOmniTerm// Before use OmniTerm\OmniTerm; class MyCommand extends Command { use OmniTerm; } // After use OmniTerm\HasOmniTerm; class MyCommand extends Command { use HasOmniTerm; }
-
Core class renamed:
OmniTerm\Helpers\OmniHelpers→OmniTerm\OmniTerm— the flagship class name now belongs to the core component, accessed via$this->omni -
Spinner enum replaces strings: Loader/spinner types are now a backed enum instead of magic strings
// Before $this->omni->newLoader('sand'); $this->omni->liveTask('Title', 'dots'); // After use OmniTerm\Async\Spinner; $this->omni->newLoader(Spinner::Sand); $this->omni->liveTask('Title', Spinner::Dots);
-
Progress bar fluent builder: Old convenience methods replaced with a chainable builder API
// Before $this->omni->createProgressBar(100, withColors: true); $this->omni->showProgress(); $this->omni->progressAdvance(); $this->omni->progressFinish(); // After $bar = $this->omni->progressBar(100)->framed()->steps(); $bar->start(); $bar->advance(); $bar->finish();
-
SplitBrowser API redesigned: Items are now an associative array (keys = labels, values = closures, arrays, or scalars) instead of a flat list with a separate detail callback
// Before $this->omni->browse('Label', ['a', 'b'], fn ($item) => ["Detail for $item"]); // After $this->omni->browse('Label', [ 'a' => function (OmniTerm $omni) { $omni->statusSuccess('Healthy', 'All checks passing'); }, 'b' => ['status' => 'running', 'cpu' => '45%'], ]);
-
Global functions removed:
render(),liveRender(),parse(),terminal(),asyncFunction()— use$this->omni->methods instead
Spinnerbacked enum (OmniTerm\Async\Spinner) with 10 animation types — resolves view names, animation frames, and labels viaview(),frames(),label()methodsTaskResultvalue object for structured spinner/live task resultsSpinnerTaskclass encapsulating spinner + async task executionLiveTask::runTask()— one-shot method combining run + finishOmniTerm::task()— one-liner for spinner task execution- Progress bar builder with
framed(),steps(),gradient(),color()chainable methods - SplitBrowser closure rendering — detail pane captures full omni output (status blocks, tables, etc.) via
Renderer::renderUsing()withCOLUMNSwidth constraint - SplitBrowser associative array auto-formatting (bold keys, aligned values)
- ANSI-aware string truncation in SplitBrowser renderer preventing layout overflow
- New sample commands:
omniterm:browser-demo,omniterm:live-task-demo,omniterm:title-bars
OmniTerm\Helpers\OmniHelpersclass (renamed toOmniTerm\OmniTerm)OmniTerm\OmniTermtrait (renamed toOmniTerm\HasOmniTerm)- Global helper functions (
use function OmniTerm\render, etc.) - Direct
AsciiHelpercalls from blade views (frames now passed as data)