PHPackages                             louzet/zenora - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [CLI &amp; Console](/categories/cli)
4. /
5. louzet/zenora

ActiveLibrary[CLI &amp; Console](/categories/cli)

louzet/zenora
=============

A themed PHP CLI toolkit with attributes, task runner, progress bars, and widgets

v0.1.0(5mo ago)00MITPHPPHP ^8.3CI passing

Since Nov 22Pushed 5mo agoCompare

[ Source](https://github.com/Louzet/zenora)[ Packagist](https://packagist.org/packages/louzet/zenora)[ RSS](/packages/louzet-zenora/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (1)Dependencies (1)Versions (2)Used By (0)

Zenora CLI Toolkit (v0.1)
-------------------------

[](#zenora-cli-toolkit-v01)

Zenora is a PHP 8.3+ toolkit to build rich CLIs quickly: attributes for commands/options, a configurable task runner with fiber-friendly spinner/progress bar, styled tables, interactive selects, and themed output.

### Install

[](#install)

```
composer require louzet/zenora
```

### Quick start

[](#quick-start)

```
use Zenora\Attribute\Command;
use Zenora\Attribute\Option;
use Zenora\Context;
use Zenora\Zenora;

#[Command('app:hello', description: 'Say hello')]
class HelloCommand {

  public function handle(
    Context $ctx,
    #[Option(shortcut: 'n')] string $name = 'World'
    ): void {
    $ctx->success("Hello $name!");
  }
}

Zenora::forge()
  ->register(HelloCommand::class)
  ->ignite($argv);
```

Run:

```
php bin/console app:hello -n Alice
php bin/console app:hello --help   # auto help
php bin/console --help             # list commands
```

### Parsing behavior

[](#parsing-behavior)

- Supports `--key=value`, `--key value`, `-k value`, combined shorts `-abc`, `-ab=c`, and attached value `-afoo`.
- Negative numbers after flags are allowed (`--threshold -5`); for other values starting with `-`, use `--` to stop parsing or `--key=value`.
- Use `--` to stop flag parsing: `cmd -- --literal -text`.
- Duplicate flags with conflicting values throw.

### Services &amp; hooks

[](#services--hooks)

```
$app = Zenith::forge()
  ->registerService(MyService::class, new MyService())
  ->before(fn($name, $class) => /* log */)
  ->after(fn($name, $class, $result) => /* metrics */)
  ->register(MyCommand::class)
  ->ignite($argv);
```

Per-command services: `registerServiceFor(CommandClass::class, id, service)`.

### Task runner &amp; progress

[](#task-runner--progress)

```
use Zenora\UI\ProgressBar;

$ctx->configureTasks(tickMicroseconds: 50_000, progressWidth: 30, progressChars: ['filled' => '#', 'empty' => '.']);
$ctx->work('Doing stuff...', function($pulse, ProgressBar $bar) {
  $bar->setTotal(3);
  foreach (range(1,3) as $i) { /* work */ $bar->advance()->setMessage("step $i"); $pulse(); }
  $bar->finish();
});
```

Use `$ctx->progress()` to show the bar without spinner.

### Tables

[](#tables)

```
use Zenora\UI\Table;

$ctx->table(
  ['ID','Name','Notes'],
  [[1,'Alice','Long note that wraps...']],
  style: Table::STYLE_BOX,
  options: [
    'header_preset' => 'blue',
    'alignments' => [0 => 'right', 2 => 'left'],
    'formatter' => fn($row,$col,$val) => strtoupper($val),
  ]
);
```

Headers default to the theme primary color; presets and custom ANSI codes are available.

### Interactive select

[](#interactive-select)

`Select` uses raw mode; in non-TTY it falls back to the first option. POSIX terminals are supported; Windows raw-mode handling is not implemented yet (fallback to non-interactive).

### Demo commands

[](#demo-commands)

Run in this repo:

```
php demo.php --help
php demo.php demo:progress
php demo.php demo:table
php demo.php demo:args -fr 5 target
php demo.php demo:service
```

### Theme defaults

[](#theme-defaults)

Colors come from the active theme (default `CyberTheme`). Table headers and progress bars will use theme primary unless overridden.

### Known limitations

[](#known-limitations)

- Parsing is close to GNU but not identical; if a non-numeric value starts with `-`, use `--` to terminate parsing or quote it.
- Windows TTY support is not implemented; POSIX terminals recommended (Windows falls back to non-interactive select).
- No variadic args or custom value parsers yet.

### Tests

[](#tests)

```
composer test
```

### Documentation

[](#documentation)

See `docs/` for more focused examples (tasks, tables, progress, services, hooks, and interactive widgets). You can run them locally to capture screenshots.

###  Health Score

30

—

LowBetter than 64% of packages

Maintenance70

Regular maintenance activity

Popularity0

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity40

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

177d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/0a9f663b28460c58168f9dafcfca47b7aa89cf514462adc2e60ec30b42d7b6cb?d=identicon)[Louzet](/maintainers/Louzet)

---

Top Contributors

[![Louzet](https://avatars.githubusercontent.com/u/39524830?v=4)](https://github.com/Louzet "Louzet (5 commits)")

---

Tags

cliterminalattributescommandtableprogressspinner

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/louzet-zenora/health.svg)

```
[![Health](https://phpackages.com/badges/louzet-zenora/health.svg)](https://phpackages.com/packages/louzet-zenora)
```

###  Alternatives

[symfony/console

Eases the creation of beautiful and testable command line interfaces

9.8k1.1B11.3k](/packages/symfony-console)[league/climate

PHP's best friend for the terminal. CLImate allows you to easily output colored text, special formats, and more.

1.9k14.0M273](/packages/league-climate)[aplus/cli

Aplus Framework CLI Library

2301.7M6](/packages/aplus-cli)[php-school/cli-menu

A command line menu helper in PHP

2.0k1.1M27](/packages/php-school-cli-menu)[nategood/commando

PHP CLI Commando Style

8123.3M38](/packages/nategood-commando)[helhum/typo3-console

A reliable and powerful command line interface for TYPO3 CMS

2939.0M192](/packages/helhum-typo3-console)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
