A powerful command line application framework for PHP. It's an extensible, flexible component, You can build your command-based application in seconds!

Last update: May 17, 2022

CLIFramework

Build Status Coverage Status Latest Stable Version Latest Unstable Version Total Downloads Monthly Downloads License

CLIFramework is a command-line application framework, for building flexiable, simple command-line applications.

Commands and Subcommands can be registered from outside of an application or your plugins.

Defining a new command is pretty simple, all you need to is declare a class which is inherited from CLIFramework\Command class.

Features

  • Intuitive command class and option spec

  • command options are supported, powered by GetOptionKit. including long option, short option, required|optional|default value.

  • Hierarchical commands.

  • Automatic help page generation.

  • Automatic zsh completion generator.

  • Automatic bash completion generator.

  • Friendly message when command arguments are not enough.

  • Testable, CLIFramework provides PHPUnit test case for testing the commands in PHP.

  • Argument validation, suggestion,

  • Command Groups

  • HHVM compatible

Synopsis

class CommitCommand extends CLIFramework\Command {

    public function brief() { return 'brief of bar'; }

    public function options($opts) {
        $opts->add('C|reuse-message:','Take an existing commit object, and reuse the log message and the authorship information (including the timestamp) when creating the commit.')
            ->isa('string')
            ->valueName('commit hash')
            // ->validValues([ 'static-50768ab', 'static-c2efdc2', 'static-ed5ba6a', 'static-cf0b1eb'])
            ->validValues(function() {
                $output = array();
                exec("git rev-list --abbrev-commit HEAD -n 20", $output);
                return $output;
            })
            ;

        // Runtime completion by setting up a closure for completion
        $opts->add('c|reedit-message:','like -C, but with -c the editor is invoked, so that the user can further edit the commit message.')
            ->isa('string')
            ->valueName('commit hash')
            ->validValues(function() {
                // exec("git log -n 10 --pretty=format:%H:%s", $output);
                exec("git log -n 10 --pretty=format:%H:%s", $output);
                return array_map(function($line) {
                    list($key,$val) = explode(':',$line);
                    $val = preg_replace('/\W/',' ', $val);
                    return array($key, $val);
                }, $output);
            })
            ;

        $opts->add('author:', 'Override the commit author. Specify an explicit author using the standard A U Thor <[email protected]> format.')
            ->suggestions(array( 'c9s', 'foo' , 'bar' ))
            ->valueName('author name')
            ;

        $opts->add('output:', 'Output file')
            ->isa('file')
            ;
    }

    public function arguments($args) {
        $args->add('user')
            ->validValues(['c9s','bar','foo']);

        // Static completion result
        $args->add('repo')
            ->validValues(['CLIFramework','GetOptionKit']);

        // Add an argument info expecting multiple *.php files
        $args->add('file')
            ->isa('file')
            ->glob('*.php')
            ->multiple()
            ;
    }

    public function init() {

        $this->command('foo'); // register App\Command\FooCommand automatically

        $this->command('bar', 'WhatEver\MyCommand\BarCommand');

        $this->commandGroup('General Commands', ['foo', 'bar']);

        $this->commandGroup('Database Commands', ['create-db', 'drop-db']);

        $this->commandGroup('More Commands', [
            'foo' => 'WhatEver\MyCommand\FooCommand',
            'bar' => 'WhatEver\MyCommand\BarCommand'
        ]);
    }

    public function execute($user,$repo) {
        $this->logger->notice('executing bar command.');
        $this->logger->info('info message');
        $this->logger->debug('info message');
        $this->logger->write('just write');
        $this->logger->writeln('just drop a line');
        $this->logger->newline();

        return "Return result as an API"; // This can be integrated in your web application
    }
}

Automatic Zsh Completion Generator

Imgur

Zsh Completion With Lazy Completion Values:

Imgur

Bash Completion

Imgur

Documentation

See documentation on our wiki https://github.com/c9s/CLIFramework/wiki

Command Forms

CLIFramework supports many command-line forms, for example:

$ app [app-opts] [subcommand1] [subcommand1-opts] [subcommand2] [subcommand2-opts] .... [arguments] 

If the subcommand is not defined, you can still use the simple form:

$ app [app-opts] [arguments]

For example,

$ app db schema --clean dbname
$ app gen controller --opt1 --opt2 ControllerName 

Subcommand Hierarchy

Commands have methods for stages, like prepare, execute, finish, for a command like below:

$ app foo_cmd bar_cmd arg1 arg2 arg3

The call graph is like:

app->run
- app->prepare
  - foo_cmd->prepare
    - bar_cmd->prepare
    - bar_cmd->execute
    - bar_cmd->finish
  - foo_cmd->finish
- app->finish

Basic Requirement

  • PHP 5.3

Installation

From composer

{
    "require": {
        "corneltek/cliframework": "*"
    }
}

Zsh Completion Generator

example/demo zsh demo > _demo
source _demo
demo <TAB>

Imgur

Imgur

Imgur

Imgur

Console Prompt (Readline)

simple prompt:

$input = $this->ask("Your name please");
$ php demo.php
Your name please: 

prompt and except valid values:

$input = $this->ask("Your name please", array('John', 'Pedro'));

Version Info

CLIFrameword has a built-in --version option, to setup the version info, you can simply override a const in your application class to setup version string:

class ConsoleApp extends CLIFramework\Application
{
    const NAME = 'YourApp';
    const VERSION = '1.2.1';
}

This shows:

$ yourapp.php --version
YourApp - version 1.2.1

Example

Please check example/demo.php

$ php example/demo.php

ArgumentEditor

use CLIFramework\ArgumentEditor\ArgumentEditor;

$editor = new ArgumentEditor(array('./configure','--enable-debug'));
$editor->append('--enable-zip');
$editor->append('--with-sqlite','--with-postgres');

echo $editor;
# ./configure --enable-debug --enable-zip --with-sqlite --with-postgres

Message style formatter

$formatter = new CLIFramework\Formatter;
$formatter->format( 'message' , 'green' );

Built-in styles:

'red'          => array('fg' => 'red'),
'green'        => array('fg' => 'green'),
'white'        => array('fg' => 'white'),
'yellow'       => array('fg' => 'yellow'),
'strong_red'   => array('fg' => 'red', 'bold'  => 1),
'strong_green' => array('fg' => 'green','bold' => 1),
'strong_white' => array('fg' => 'white','bold' => 1),

Building Phar Archive file

COMPOSER=tests/fixture/composer.json.phar-test composer install
php example/demo archive --working-dir /Users/c9s/work/php/CLIFramework \
        --composer tests/fixture/composer.json.phar-test \
        app.phar

Chooser Component

$chooser = new CLIFramework\Chooser;
$value = $chooser->choose( "System Options" , array( 
    'use php-5.4.0' => '5.4.0',
    'use php-5.4.1' => '5.4.1',
    'use system' => '5.3.0',
));

Debug Utilities

LineIndicator

use CLIFramework\Debug\LineIndicator;
$indicator = new LineIndicator;
echo PHP_EOL, $indicator->indicateFile(__FILE__, __LINE__);

ConsoleDebug class

use CLIFramework\Debug\ConsoleDebug;

ConsoleDebug::dumpRows($pdo->fetchAll());

ConsoleDebug::dumpException($e);

Todos in the next release

  • provide a easy way to define chained commands
  • inheritable options for subcommands.
  • human readable exception renderer.
  • interact utilities

Hacking

Setup

  1. Download & install Onion from https://github.com/phpbrew/Onion

  2. Use Onion to bundle the dependencies:

    $ onion bundle

  3. Run tests, it should pass.

  4. Hack hack hack.

  5. Run tests.

  6. Send a pull request.

How command class register works

  • CLIApplication is inherited from CommandBase.
  • Command is also inherited from CommandBase.
  • To register a subcommand, we use the addCommand method to register commands or subcommands.
    • The command class is optional, if command class name is omitted, then the addCommand method will try to guess the real command class, and try to load the command class.

Bitdeli Badge

GitHub

https://github.com/c9s/CLIFramework
Comments
  • 1. Command/subcommand autoloading

    Hi, c9s:

    This is a great framework, first of all, thanks for building this. I heard this from you on PHPConf 14' (I'm also the who have asked you question :) )

    I'm currently using it to integrate my original back-end administration tool. The tool combines many commands, each corresponding to some part of our back-end service component.

    The key is the number of our back-end services will keep growing, so it is expected that CLI administration tool will constantly adding new commands as well, however the current mechanic in CIFramework to add new command is to strictly 'register/add' it in init() function of parent command.

    It violates the Open/Closed principle: we've expected that we'll keep adding new commands, however every time we add a new command, we need to "MODIFY" the existing file (the ApplicationClass). So I'm considering building an autoloading mechanism based on your original Command structure and PSR class autoloading.

    So

    app cmd sub-cmd1 sub-cmd2 sub-cmd3 arg1 arg2
    

    It will automatically looking into

    Application\Command\SubCmd1\SubCmd2\SubCmd3Command.php
    

    The detail of my planning implementation:

    • A new method in CommandLoader probably named autoloadCommandsFromFileSystem
    • In the Application/Command/Subcommand which expects continuous new sub-commands would be added. Invoke the autoload instead of manually registering commands
    public function init()
    {
        $this->loader->autoloadCommandsFromFileSystem();
    }
    
    • Probably a dispatch in CommandBase (Not really necessary, though)
    public function init()
    {
        $this->autoloadCommands();
    }
    

    Well, Since this fits my needs, so I'm gonna do it in my project anyway, but I'd like to know if you think it is an appropriate feature for the master branch of CLIFramework. Any suggestions/corrections would be fine as well.

    Reviewed by dh3014 at 2014-12-18 04:17
  • 2. Add a new feature of built-in daemon command.

    Ref: https://github.com/c9s/CLIFramework/issues/33

    I've implemented a built-in daemon command. The new Extension and hook system are described at the above issue.

    How to try

    Check my branch out and execute the following shell commands:

    $ php example/demo --log-path=/tmp/server.log server --pid-file=/tmp/sample.pid 127.0.0.1 12345
    $ echo 'Hello, world!' | netcat 127.0.0.1 12345
    $ tail /tmp/server.log
    

    php example/demo server launches an echo server, so that's ok if you can see 'Hello, world!' in the log file.

    execution steps for ServerCommand and DaemonExtension

    1. ServerCommand::init()
    2. ServerCommand::enableExtension(new DaemonExtension())
    3. ServerCommand::_init()
    4. ServerCommand::initExtensions()
    5. DaemonExtension::bind($command)
    6. ServerCommand::executeWrappers()
    7. ServerCommand::callHook('execute.before')
    8. DaemonExtension::callHook('run.before')
    9. DaemonExtension::run()
    10. DaemonExtension::daemonize()
    11. DaemonExtension::callHook('run.after')
    12. ServerCommand::execute()
    13. ServerCommand::callHook('execute.after')

    ChangeLogs

    • add CLIFramework\Hook namespace and support hook system.
    • CommandBase and ExtensionBase implement Hookable interface.
    • support global --log-path option and daemon command outputs logs to the path if --log-path is given.
    • call Logger::setVerbose and Logger::setDebug on preparing Application if verbose and debug are set in cliframework.ini
    • add Command::hasApplication in order to confirm whether we can get application or not.
    Reviewed by shinnya at 2015-05-17 04:27
  • 3. Command autoloading feature

    This PR actually mix with 3 stuffs.

    • Command autoloading feature
    • A bug fix when throwing an ExecuteMethodNotDefinedException
    • make ProgramName of an Application be its sufficient part of $argv[0] only

    I can re-organize it if you want.

    Reviewed by dh3014 at 2014-12-23 08:17
  • 4. Where's arguments' help?

    I found no documentation on usage of arguments, only on options. I would like to run a command like this: app run --dir /dev now Being:

    • app: my entry script
    • run: the command, equivalent to \MyApp\Command\RunCommand
    • --dir /dev: an option, as defined in options()
    • now: the said argument, as in execute(*$when*)

    If the command is run without the argument it fails with a generic red message + horrible exception:

    Command requires at least 1 arguments [sic].
    Command prototype:
        0 => $project
    

    I think it should:

    1. show the script/command help whenever something wrong is given;
    2. Catch its own exceptions and show something nice instead (related to first point);
    3. show the arguments' description on help;
    Reviewed by igorsantos07 at 2013-11-27 22:17
  • 5. Corrector: suggests using similar_text instead of levenshtein

    I think current Corrector::guess() is disappointing. I add the first command 'scheduled-job' in my app. Since I'm still using bash (no completion), I'm trying with Corrector feature. Here's what happened:

    mb sch
    Did you mean 'zsh'? [Y/n] 
    [ec2-user ~]$ mb sche
    Did you mean 'zsh'? [Y/n] n
    [ec2-user ~]$ mb sched
    Did you mean 'zsh'? [Y/n]
    [ec2-user ~]$ mb schedu
    Did you mean 'help'? [Y/n]
    [ec2-user ~]$ mb schedule
    Did you mean 'help'? [Y/n]
    [ec2-user ~]$ mb scheduled
    Did you mean 'scheduled-job'? [Y/n]
    
    

    After looking into source in Corrector, it uses levenshtein() to make the best guess. I think this algo computes edit distance between two strings. However I don't think edit-distance is fit into suggesting feature, in fact I guess even LCS or LIS would be better in suggestion.

    To make it simple, I think another php built-in function similar_text[http://php.net/manual/en/function.similar-text.php] is much better in this case. It has the same time complexity with levenshtein (but slower a bit, yes).

    I did a little experiment:

    [ec2-user ~]$ mb sche
    Did you mean 'zsh'? [Y/n] 
    [ec2-user ~]$ mb sched
    Did you mean 'scheduled-job'? [Y/n] 
    
    

    What would you think about changing the suggestion algorithm?

    Reviewed by dh3014 at 2014-12-25 06:57
  • 6. Update symfony/finder to 5.x.x

    Laravel Lumen requires symfony/finder 5.x.x and I'd like to use this framework without having to hack my way around in composer. I have no clue what this update entails for CLIFramework, but it would be awesome if this could be attempted.

    Reviewed by Bertie2011 at 2021-08-21 06:44
  • 7. Allow raw output even if terminal emulator support colors

    Hello, again :)

    This PR is useful for command output spec testing and maybe for when color support detection goes wrong (exotic contexts).

    Without this feature, a tester would have to assert cli output buffer as binary string and sometimes it does not work as expected, specially with anchored regex based assertions.

    Reviewed by marcioAlmada at 2014-06-24 07:30
  • 8. Duplicated short opt in ArchiveCommand.php

    'composer' and 'compress?' option both have the short opt -c. This leads to following error if you run cli.php:

    >php71 cli help
    Option conflict: -c is already defined.
    

    Snipplett of the error in Question.

            $opts->add('c|composer:', 'The composer.json file. If --working-dir is ignored, dirname of the composer.json will be used.')
                ->isa('file')
                ->defaultValue('composer.json')
                ;
    
            $opts->add('c|compress?', 'compress type: gz, bz2')
                ->defaultValue('gz')
                ->validValues(array('gz', 'bz2'))
                ;
    
    Reviewed by mbattista at 2017-08-23 08:02
  • 9. Do not display the "from" section for the first exception trace entry

    According to http://php.net/manual/en/exception.gettrace.php#107563, the first entry doesn't contain the file/line keys since they are recorded in the exception object itself.

    Additionally, some changes to the output formatting have been made:

    1. The trace entries are counted in a human-friendly way starting with "1" (like Xdebug does for example).
    2. The file name and line number in the "from" section are delimited by a colon without the space. This format is better IDE/editor friendly and helps easier navigation (e.g. Ctrl+N in PhpStorm, copy-paste the file:line combination).

    With this patch applied, the output looks like the following:

    ↪ phpbrew --debug install 7.1.99
    Exception: Version 7.1.99 not found.
    Thrown from /home/morozov/Projects/phpbrew/src/PhpBrew/Command/InstallCommand.php at line 217:
    
      214            $version = preg_replace('/^php-/', '', $version);
      215            $versionInfo = $releaseList->getVersion($version);
      216            if (!$versionInfo) {
    > 217                throw new \Exception("Version $version not found.");
      218            }
      219            $version = $versionInfo['version'];
      220
      221            $distUrlPolicy = new DistributionUrlPolicy();
    
    Trace:
    
        1) PhpBrew\Command\InstallCommand->execute('7.1.99')
    
        2) call_user_func_array([PhpBrew\Command\InstallCommand, 'execute'], ['7.1.99'])
            from /home/morozov/Projects/phpbrew/vendor/corneltek/cliframework/src/CommandBase.php:846
    
        3) CLIFramework\CommandBase->executeWrapper(['7.1.99'])
            from /home/morozov/Projects/phpbrew/vendor/corneltek/cliframework/src/Application.php:398
    
        4) CLIFramework\Application->run(['bin/phpbrew', '--debug', 'install', '7.1.99'])
            from /home/morozov/Projects/phpbrew/src/PhpBrew/Console.php:114
    
        5) PhpBrew\Console->runWithTry(['bin/phpbrew', '--debug', 'install', '7.1.99'])
            from /home/morozov/Projects/phpbrew/bin/phpbrew:23
    

    Fixes #108.

    Reviewed by morozov at 2017-11-29 17:57
  • 10. Fixed problem with invalid implementation of OnionPrinterInterface

    I don't know, maybe after upgrade GetOptionKit package, implements value in OptionPrinter.php was invalid. It should refer to OptionPrinter, instead of OptionPrinterInterface. I fixed it and now CLIFramework works fine.

    Reviewed by pklebba at 2016-06-08 14:47
  • 11. Better commnand line parser

    Hi,

    I am developing a project with this nice tool but when I run some tests I found an annoying issue. When I execute the following code:

    public function test()
    {
        // ...
        $this->runCommand("program arg1 \"arg2.1 arg2.2\" arg3");
        // ...
    }
    

    The arguments passed to program are

    array() = 
    {
        [0] = "program",
        [1] = "arg1",
        [2] = "\"arg2.1",
        [3] = "arg2.2\"",
        [4] = "arg3"
    }
    

    And I expect something like that:

    array() = 
    {
        [0] = "program",
        [1] = "arg1",
        [2] = "arg2.1 arg2.2",
        [3] = "arg3"
    }
    

    It is a bit annoying and I have created a better parser. How can I post my contribution in this project?

    Thanks, Petru Rares.

    Reviewed by psincraian at 2016-03-18 11:05
  • 12. Command suffix on commands

    I find the requirement of Commands auto-loaded from the Command folder to have the Command suffix to be a bit bothersome at times. Would you be opposed to a patch to remove that? The classes are already name-spaced away preventing conflict. When looking at a directory listing, it can be tedious to mentally strip away the Command from everything to easily see all the class names.

    I will likely be writing my own enableCommandAutoload implementation to circumvent this, but if you are open to it being incorporated upstream I could send a pull request.

    Reviewed by detain at 2021-11-18 21:12
  • 13. Logging error with '%' : Warning fprintf too few arguments

    Hello,

    We get from time to time the warning

    Warning: fprintf(): Too few arguments in /path/to/project/vendor/corneltek/cliframework/src/Logger.php on line 183
    

    Because the message getting logged contains %, in our case, an URL encoded provided by the service we're calling.

    A quick fix is to escape % :

    fprintf(STDERR, str_replace('%', '%%', $this->formatter->format($msg , $style)) . PHP_EOL);
    

    https://github.com/c9s/CLIFramework/blob/5d7c4703390e80326938cbdef7de499bca2a0143/src/Logger.php#L188

    I'm not sure where to point a fix, if the formatter should be involved or not, although I'm convinced the fprintf without additional arguments should escape %.

    Thank you for your help.

    Reviewed by sherbrow at 2019-09-01 09:48
  • 14. ArgInfo::validate() crippled validator call

    Using CLIFramework 3: in ArgInfo::validate():

    return call_user_func($this->validator);
    

    Unless I am missing something, there is no way for the validator to get the value to validate so validator is kindof pointless. Prolly should be

    return call_user_func($this->validator,$value);
    
    Reviewed by exteon at 2019-08-09 21:57
  • 15. smart Corrector::match

    The current implementation of Corrector::match currently used in HelpCommand::execute is quite naive since it is only based on php's native similar_text.

    Consider making it smarter.

    The idea occurred after

    $ phpbrew uninstall php-7.0.15
    Did you mean 'install'? [Y/n]
    

    Where one presses Yes (or at least I did) without second thought.

    I would expect Corrector::match to say "Did you mean 'remove'? [Y/n]".

    If this is a direction you would like to go towards, I would be happy to provide a first implementation.

    Reviewed by dbaltas at 2017-02-07 12:31
Console - The Console component eases the creation of beautiful and testable command line interfaces.

Console Component The Console component eases the creation of beautiful and testable command line interfaces. Sponsor The Console component for Symfon

May 25, 2022
PHP Interminal is a command-line tool that gives you access to PHP Internals discussions in your terminal.
PHP Interminal is a command-line tool that gives you access to PHP Internals discussions in your terminal.

PHP Interminal is a command-line tool that gives you access to PHP Internals discussions in your terminal. ??

Dec 12, 2021
👨🏻‍🚀 A command-line tool that gives you the Alpine Day 2021 schedule in your timezone. 🚀
👨🏻‍🚀 A command-line tool that gives you the Alpine Day 2021 schedule in your timezone. 🚀

Alpine Day Schedule a command-line tool that gives you the Alpine Day 2021 schedule in your timezone. ?? Quick start Requires PHP 7.4+ # First, instal

Jun 10, 2021
Laracon Schedule a command-line tool that gives you the Laracon Online schedule in your timezone.
Laracon Schedule a command-line tool that gives you the Laracon Online schedule in your timezone.

Laracon Schedule a command-line tool that gives you the Laracon Online schedule in your timezone. ?? Quick start Requires PHP 7.4+ # First, install: c

Dec 13, 2021
Patrol is an elegant command-line tool that keeps your PHP Project's dependencies in check.
Patrol is an elegant command-line tool that keeps your PHP Project's dependencies in check.

Patrol is an elegant command-line tool that keeps your PHP Project's dependencies in check. Installation / Usage Requires PHP 8.0+ First, install Patr

May 27, 2022
Skeleton for creating a new Command Line Interface application with a minimum of dependencies.

Skeleton for creating a new Command Line Interface application with a minimum of dependencies.

Jan 17, 2022
Lovely PHP wrapper for using the command-line

ShellWrap What is it? It's a beautiful way to use powerful Linux/Unix tools in PHP. Easily and logically pipe commands together, capture errors as PHP

May 3, 2022
A PHP library for command-line argument processing

GetOpt.PHP GetOpt.PHP is a library for command-line argument processing. It supports PHP version 5.4 and above. Releases For an overview of the releas

May 24, 2022
Twitter raffles in the command line, with PHP and minicli
Twitter raffles in the command line, with PHP and minicli

Rafflebird Rafflebird is a highly experimental CLI application for giveaways / raffles on Twitter, built in PHP with Minicli. Disclaimer: The recent s

May 14, 2022
A PHP command line tool used to install shlink
A PHP command line tool used to install shlink

Shlink installer A PHP command line tool used to install shlink. Installation Install this tool using composer.

Jan 10, 2022
Command-line control panel for Nginx Server to manage WordPress sites running on Nginx, PHP, MySQL, and Let's Encrypt
Command-line control panel for Nginx Server to manage WordPress sites running on Nginx, PHP, MySQL, and Let's Encrypt

EasyEngine v4 EasyEngine makes it greatly easy to manage nginx, a fast web-server software that consumes little memory when handling increasing volume

May 22, 2022
Generic PHP command line flags parse library
Generic PHP command line flags parse library

PHP Flag Generic PHP command line flags parse library Features Generic CLI options and arguments parser. Support set value data type(int,string,bool,a

Mar 2, 2022
A simple command-line tool whose aim is to facilitate the continous delivery of PHP apps
A simple command-line tool whose aim is to facilitate the continous delivery of PHP apps

Deployer Simple command-line tool that aims to facilitate the continous delivery of PHP apps, particularly Laravel apps. Imagine you want to update yo

Sep 8, 2021
🍃 In short, it's like Tailwind CSS, but for the PHP command-line applications.
🍃 In short, it's like Tailwind CSS, but for the PHP command-line applications.

Termwind Termwind allows you to build unique and beautiful PHP command-line applications, using the Tailwind CSS API. In short, it's like Tailwind CSS

May 27, 2022
A PHP Command Line tool that makes it easy to compile, concat, and minify front-end Javascript and CSS/SCSS dependencies.

Front End Compiler A PHP Command Line tool that makes it easy to compile, concat, and minify front-end Javascript and CSS/SCSS dependencies. The minif

Nov 12, 2021
php command line script to DCA crypto from Coinbase Pro

dca.php A simple php script designed to be run via the command line via a cron job. This will connect to coinbase pro and buy the crypto coins specifi

Oct 22, 2021
A PHP library for command-line argument processing

GetOpt.PHP GetOpt.PHP is a library for command-line argument processing. It supports PHP version 7.1 and above. Releases For an overview of the releas

May 20, 2022
🖥 Build beautiful PHP CLI menus. Simple yet Powerful. Expressive DSL.
🖥  Build beautiful PHP CLI menus. Simple yet Powerful. Expressive DSL.

Contents Minimum Requirements Installation Upgrading Usage Quick Setup Examples API Appearance Menu Title Colour Width Padding Margin Borders Exit But

May 16, 2022
Command-Line Interface tools

Aura.Cli Provides the equivalent of request ( Context ) and response ( Stdio ) objects for the command line interface, including Getopt support, and a

May 6, 2022