{"id":20180753,"url":"https://github.com/webfiori/cli","last_synced_at":"2026-01-16T18:28:34.579Z","repository":{"id":41104122,"uuid":"508088553","full_name":"WebFiori/cli","owner":"WebFiori","description":"Class library to simplify the process of creating command line based applications using PHP.","archived":false,"fork":false,"pushed_at":"2025-04-07T19:22:30.000Z","size":788,"stargazers_count":9,"open_issues_count":2,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-10T05:08:48.251Z","etag":null,"topics":["cli","command","command-line","command-line-tool","php","terminal"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/WebFiori.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"custom":["https://paypal.me/IbrahimBinAlshikh","https://www.buymeacoffee.com/ibrahimdev"],"ko_fi":"ibrahimdev"}},"created_at":"2022-06-27T23:15:00.000Z","updated_at":"2025-04-07T19:18:55.000Z","dependencies_parsed_at":"2023-12-03T19:27:56.899Z","dependency_job_id":"9b4fb4c3-99ff-49f0-ade8-ab86709b46a7","html_url":"https://github.com/WebFiori/cli","commit_stats":{"total_commits":143,"total_committers":2,"mean_commits":71.5,"dds":0.1048951048951049,"last_synced_commit":"ade9dd2873f59712fa45b345e15b1fd8105d3013"},"previous_names":[],"tags_count":21,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WebFiori%2Fcli","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WebFiori%2Fcli/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WebFiori%2Fcli/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WebFiori%2Fcli/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/WebFiori","download_url":"https://codeload.github.com/WebFiori/cli/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248161269,"owners_count":21057555,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","command","command-line","command-line-tool","php","terminal"],"created_at":"2024-11-14T02:32:48.543Z","updated_at":"2026-01-16T18:28:34.557Z","avatar_url":"https://github.com/WebFiori.png","language":"PHP","funding_links":["https://paypal.me/IbrahimBinAlshikh","https://www.buymeacoffee.com/ibrahimdev","https://ko-fi.com/ibrahimdev"],"categories":[],"sub_categories":[],"readme":"# WebFiori CLI\nClass library that can help in writing command line based applications with minimum dependencies using PHP.\n\n\u003cp align=\"center\"\u003e\n  \u003ca target=\"_blank\" href=\"https://github.com/WebFiori/cli/actions/workflows/php85.yaml\"\u003e\n    \u003cimg src=\"https://github.com/WebFiori/cli/actions/workflows/php85.yaml/badge.svg?branch=main\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://codecov.io/gh/WebFiori/cli\"\u003e\n    \u003cimg src=\"https://codecov.io/gh/WebFiori/cli/branch/main/graph/badge.svg\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://sonarcloud.io/dashboard?id=WebFiori_cli\"\u003e\n      \u003cimg src=\"https://sonarcloud.io/api/project_badges/measure?project=WebFiori_cli\u0026metric=alert_status\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/WebFiori/cli/releases\"\u003e\n      \u003cimg src=\"https://img.shields.io/github/release/WebFiori/cli.svg?label=latest\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://packagist.org/packages/webfiori/cli\"\u003e\n    \u003cimg src=\"https://img.shields.io/packagist/dt/webfiori/cli?color=light-green\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n## Content\n* [Supported PHP Versions](#supported-php-versions)\n* [Features](#features)\n* [Quick Start](#quick-start)\n* [Sample Application](#sample-application)\n* [Installation](#installation)\n* [Basic Usage](#basic-usage)\n  * [Simple Command Example](#simple-command-example)\n  * [Command with Arguments](#command-with-arguments)\n  * [Multi-Command Application](#multi-command-application)\n* [Creating and Running Commands](#creating-and-running-commands)\n  * [Creating a Command](#creating-a-command)\n  * [Running a Command](#running-a-command)\n  * [Arguments](#arguments)\n    * [Adding Arguments to Commands](#adding-arguments-to-commands)\n    * [Accessing Argument Value](#accessing-argument-value)\n* [Advanced Features](#advanced-features)\n  * [Interactive Mode](#interactive-mode)\n  * [Input and Output Streams](#input-and-output-streams)\n  * [ANSI Colors and Formatting](#ansi-colors-and-formatting)\n  * [Progress Bars](#progress-bars)\n  * [Table Display](#table-display)\n* [The `help` Command](#the-help-command)\n  * [Setting Help Instructions](#setting-help-instructions)\n  * [Running `help` Command](#running-help-command)\n    * [General Help](#general-help)\n    * [Command-Specific Help](#command-specific-help)\n* [Unit-Testing Commands](#unit-testing-commands)\n* [Examples](#examples)\n\n## Supported PHP Versions\n|                                                                                      Build Status                                                                                       |\n|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|\n| \u003ca target=\"_blank\" href=\"https://github.com/WebFiori/cli/actions/workflows/php81.yaml\"\u003e\u003cimg src=\"https://github.com/WebFiori/cli/actions/workflows/php81.yaml/badge.svg?branch=main\"\u003e\u003c/a\u003e |\n| \u003ca target=\"_blank\" href=\"https://github.com/WebFiori/cli/actions/workflows/php82.yaml\"\u003e\u003cimg src=\"https://github.com/WebFiori/cli/actions/workflows/php82.yaml/badge.svg?branch=main\"\u003e\u003c/a\u003e |\n| \u003ca target=\"_blank\" href=\"https://github.com/WebFiori/cli/actions/workflows/php83.yaml\"\u003e\u003cimg src=\"https://github.com/WebFiori/cli/actions/workflows/php83.yaml/badge.svg?branch=main\"\u003e\u003c/a\u003e |\n| \u003ca target=\"_blank\" href=\"https://github.com/WebFiori/cli/actions/workflows/php84.yaml\"\u003e\u003cimg src=\"https://github.com/WebFiori/cli/actions/workflows/php84.yaml/badge.svg?branch=main\"\u003e\u003c/a\u003e |\n| \u003ca target=\"_blank\" href=\"https://github.com/WebFiori/cli/actions/workflows/php85.yaml\"\u003e\u003cimg src=\"https://github.com/WebFiori/cli/actions/workflows/php85.yaml/badge.svg?branch=main\"\u003e\u003c/a\u003e |\n\n## Features\n* **Easy Command Creation**: Simple class-based approach to building CLI commands\n* **Argument Handling**: Support for required and optional arguments with validation\n* **Interactive Mode**: Keep your application running and execute multiple commands\n* **ANSI Output**: Rich text formatting with colors and styles\n* **Input/Output Streams**: Custom input and output stream implementations\n* **Progress Bars**: Built-in progress indicators for long-running operations\n* **Table Display**: Format and display data in clean, readable tables\n* **Help System**: Automatic help generation for commands and arguments\n* **Unit Testing**: Built-in testing utilities for command validation\n* **Minimal Dependencies**: Lightweight library with minimal external requirements\n\n## Quick Start\n\nGet up and running in minutes:\n\n```bash\n# Install via Composer\ncomposer require webfiori/cli\n\n# Create your first command\nphp -r \"\nrequire 'vendor/autoload.php';\nuse WebFiori\\Cli\\Command;\nuse WebFiori\\Cli\\Runner;\n\nclass HelloCommand extends Command {\n    public function __construct() {\n        parent::__construct('hello', [], 'Say hello to the world');\n    }\n    public function exec(): int {\n        \\$this-\u003eprintln('Hello, World!');\n        return 0;\n    }\n}\n\n\\$runner = new Runner();\n\\$runner-\u003eregister(new HelloCommand());\nexit(\\$runner-\u003estart());\n\" hello\n```\n\n## Sample Application\n\nA complete sample application with multiple examples can be found here: **[📁 View Sample Application](https://github.com/WebFiori/cli/tree/main/examples)**\n\nThe sample application includes:\n- **[Basic Commands](https://github.com/WebFiori/cli/tree/main/examples/01-basic-hello-world)** - Simple command creation\n- **[Arguments Handling](https://github.com/WebFiori/cli/tree/main/examples/02-arguments-and-options)** - Working with command arguments\n- **[User Input](https://github.com/WebFiori/cli/tree/main/examples/03-user-input)** - Building interactive applications\n- **[Multi-Command Apps](https://github.com/WebFiori/cli/tree/main/examples/10-multi-command-app)** - Complex applications with multiple commands\n- **[Progress Bars](https://github.com/WebFiori/cli/tree/main/examples/07-progress-bars)** - Visual progress indicators\n- **[Table Display](https://github.com/WebFiori/cli/tree/main/examples/06-table-display)** - Formatting data in tables\n- **[Database Operations](https://github.com/WebFiori/cli/tree/main/examples/09-database-ops)** - Database CLI commands\n\n## Installation\n\nInstall WebFiori CLI using Composer:\n\n```bash\ncomposer require webfiori/cli\n```\n\nOr add it to your `composer.json`:\n\n```json\n{\n    \"require\": {\n        \"webfiori/cli\": \"*\"\n    }\n}\n```\n\n## Basic Usage\n\n### Simple Command Example\n\nCreate a basic command that outputs a message:\n\n```php\n\u003c?php\nrequire_once 'vendor/autoload.php';\n\nuse WebFiori\\Cli\\Command;\nuse WebFiori\\Cli\\Runner;\n\nclass GreetCommand extends Command {\n    public function __construct() {\n        parent::__construct('greet', [], 'Greet the user');\n    }\n\n    public function exec(): int {\n        $this-\u003eprintln(\"Hello from WebFiori CLI!\");\n        return 0;\n    }\n}\n\n$runner = new Runner();\n$runner-\u003eregister(new GreetCommand());\nexit($runner-\u003estart());\n```\n\n**Usage:**\n```bash\nphp app.php greet\n# Output: Hello from WebFiori CLI!\n```\n\n**[📖 View Complete Example](https://github.com/WebFiori/cli/tree/main/examples/01-basic-hello-world)**\n\n### Command with Arguments\n\nCreate a command that accepts and processes arguments:\n\n```php\n\u003c?php\nuse WebFiori\\Cli\\Command;\nuse WebFiori\\Cli\\Option;\n\nclass PersonalGreetCommand extends Command {\n    public function __construct() {\n        parent::__construct('greet-person', [\n            '--name' =\u003e [\n                Option::OPTIONAL =\u003e false,\n                Option::DESCRIPTION =\u003e 'Name of the person to greet'\n            ],\n            '--title' =\u003e [\n                Option::OPTIONAL =\u003e true,\n                Option::DEFAULT =\u003e 'Friend',\n                Option::DESCRIPTION =\u003e 'Title to use (Mr, Ms, Dr, etc.)'\n            ]\n        ], 'Greet a specific person');\n    }\n\n    public function exec(): int {\n        $name = $this-\u003egetArgValue('--name');\n        $title = $this-\u003egetArgValue('--title');\n        \n        $this-\u003eprintln(\"Hello %s %s!\", $title, $name);\n        return 0;\n    }\n}\n```\n\n**Usage:**\n```bash\nphp app.php greet-person --name=John --title=Mr\n# Output: Hello Mr John!\n\nphp app.php greet-person --name=Sarah\n# Output: Hello Friend Sarah!\n```\n\n**[📖 View Complete Example](https://github.com/WebFiori/cli/tree/main/examples/02-arguments-and-options)**\n\n### Multi-Command Application\n\nBuild applications with multiple commands:\n\n```php\n\u003c?php\nuse WebFiori\\Cli\\Runner;\n\n// Register multiple commands\n$runner = new Runner();\n$runner-\u003eregister(new GreetCommand());\n$runner-\u003eregister(new PersonalGreetCommand());\n$runner-\u003eregister(new FileProcessCommand());\n$runner-\u003eregister(new DatabaseCommand());\n\n// Set application info\n$runner-\u003esetAppName('My CLI App');\n$runner-\u003esetAppVersion('1.0.0');\n\nexit($runner-\u003estart());\n```\n\n**Usage:**\n```bash\nphp app.php help                    # Show all available commands\nphp app.php greet                   # Run greet command\nphp app.php greet-person --name=Bob # Run greet-person command\nphp app.php -i                      # Start interactive mode\n```\n\n**[📖 View Complete Example](https://github.com/WebFiori/cli/tree/main/examples/10-multi-command-app)**\n\n## Creating and Running Commands\n\n### Creating a Command\n\nFirst step in creating new command is to create a new class that extends the class `WebFiori\\Cli\\Command`. The class `Command` is a utility class which has methods that can be used to read inputs, send outputs and use command line arguments.\n\nThe class has one abstract method that must be implemented. The code that will exist in the body of the method will represent the logic of the command.\n\n``` php\n\u003c?php\n//File 'src/SampleCommand.php'\nuse WebFiori\\Cli\\Command;\n\nclass SampleCommand extends Command {\n\n    public function __construct(){\n        parent::__construct('say-hi');\n    }\n\n    public function exec(): int {\n        $this-\u003eprintln(\"Hi People!\");\n        return 0;\n    }\n\n}\n\n```\n\n### Running a Command\n\nThe class `WebFiori\\Cli\\Runner` is the class which is used to manage the logic of executing the commands. In order to run a command, an instance of this class must be created and used to register the command and start running the application.\n\nTo register a command, the method `Runner::register()` is used. To start the application, the method `Runner::start()` is used.\n\n``` php\n// File src/main.php\nrequire_once '../vendor/autoload.php';\n\nuse WebFiori\\Cli\\Runner;\nuse SampleCommand;\n\n\n$runner = new Runner();\n$runner-\u003eregister(new SampleCommand());\nexit($runner-\u003estart());\n```\n\nNow if terminal is opened and following command is executed:\n\n``` bash\nphp main.php say-hi\n```\n\nThe output will be the string `Hi People!`.\n\n### Arguments\n\nArguments is a way that can be used to pass values from the terminal to PHP process. They can be used to configure execution of the command. For example, a command might require some kind of file as input. \n\n#### Adding Arguments to Commands\n\nArguments can be added in the constructor of the class as follows:\n\n``` php\n\u003c?php\n//File 'src/SampleCommand.php'\nuse WebFiori\\Cli\\Command;\nuse WebFiori\\Cli\\Option;\n\nclass SampleCommand extends Command {\n\n    public function __construct(){\n        parent::__construct('say-hi', [\n            '--person-name' =\u003e [\n                Option::OPTIONAL =\u003e true\n            ]\n        ]);\n    }\n\n    public function exec(): int {\n        $this-\u003eprintln(\"Hi People!\");\n        return 0;\n    }\n\n}\n\n```\n\nArguments can be provided as an associative array or array of objects of type `WebFiori\\Cli\\Argument`. In case of associative array, Index is name of the argument and the value of the index is sub-associative array of options. Each argument can have the following options:\n* `optional`: A boolean. if set to true, it means that the argument is optional. Default is false.\n* `default`: An optional default value for the argument to use if it is not provided.\n* `description`: A description of the argument which will be shown if the command `help` is executed.\n* `values`: A set of values that the argument can have. If provided, only the values on the list will be allowed.\n\nThe class `WebFiori\\Cli\\Option` can be used to access the options.\n\n#### Accessing Argument Value\n\nAccessing the value of an argument is performed using the method `Command::getArgValue(string $argName)`. If argument is provided, the method will return its value as `string`. If not provided, `null` is returned.\n\n``` php\n\u003c?php\n//File 'src/SampleCommand.php'\nuse WebFiori\\Cli\\Command;\nuse WebFiori\\Cli\\Option;\n\nclass SampleCommand extends Command {\n\n    public function __construct(){\n        parent::__construct('say-hi', [\n            '--person-name' =\u003e [\n                Option::OPTIONAL =\u003e true\n            ]\n        ]);\n    }\n\n    public function exec(): int {\n        $personName = $this-\u003egetArgValue('--person-name');\n        \n        if ($personName !== null) {\n            $this-\u003eprintln(\"Hi %s!\", $personName);\n        } else {\n            $this-\u003eprintln(\"Hi People!\");\n        }\n        \n        return 0;\n    }\n\n}\n\n```\n\n## Advanced Features\n\n### Interactive Mode\n\nInteractive mode is a way that can be used to keep your application running and execute more than one command using same PHP process. To start the application in interactive mode, add the argument `-i` when starting the application as follows:\n\n``` bash\nphp main.php -i\n```\n\nThis will show following output in terminal:\n\n``` bash\n\u003e\u003e Running in interactive mode.\n\u003e\u003e Type command name or 'exit' to close.\n\u003e\u003e\n```\n\n**[📖 View Interactive Mode Example](https://github.com/WebFiori/cli/tree/main/examples/05-interactive-commands)**\n\n### Input and Output Streams\n\nWebFiori CLI supports custom input and output streams for advanced use cases:\n\n```php\nuse WebFiori\\Cli\\Streams\\FileInputStream;\nuse WebFiori\\Cli\\Streams\\FileOutputStream;\n\n// Read from file instead of stdin\n$command-\u003esetInputStream(new FileInputStream('input.txt'));\n\n// Write to file instead of stdout\n$command-\u003esetOutputStream(new FileOutputStream('output.txt'));\n```\n\n**[📖 View Streams Example](https://github.com/WebFiori/cli/tree/main/examples/08-file-processing)**\n\n### ANSI Colors and Formatting\n\nAdd colors and formatting to your CLI output:\n\n```php\npublic function exec(): int {\n    $this-\u003eprintln(\"This is %s text\", 'normal');\n    $this-\u003eprintln(\"This is {{bold}}bold{{/bold}} text\");\n    $this-\u003eprintln(\"This is {{red}}red{{/red}} text\");\n    $this-\u003eprintln(\"This is {{bg-blue}}{{white}}white on blue{{/white}}{{/bg-blue}} text\");\n    return 0;\n}\n```\n\n**[📖 View Formatting Example](https://github.com/WebFiori/cli/tree/main/examples/04-output-formatting)**\n\n### Progress Bars\n\nDisplay progress for long-running operations:\n\n```php\nuse WebFiori\\Cli\\Progress\\ProgressBar;\n\npublic function exec(): int {\n    $items = range(1, 100);\n    \n    $this-\u003ewithProgressBar($items, function($item, $bar) {\n        // Process each item\n        usleep(50000); // Simulate work\n        $bar-\u003esetMessage(\"Processing item {$item}\");\n    });\n    \n    return 0;\n}\n```\n\n**[📖 View Progress Bar Example](https://github.com/WebFiori/cli/tree/main/examples/07-progress-bars)**\n\n### Table Display\n\nDisplay data in formatted tables:\n\n```php\npublic function exec(): int {\n    $data = [\n        ['Ahmed Hassan', 30, 'Cairo'],\n        ['Sarah Johnson', 25, 'Los Angeles']\n    ];\n    $headers = ['Name', 'Age', 'City'];\n    \n    $this-\u003etable($data, $headers);\n    \n    return 0;\n}\n```\n\n**[📖 View Table Display Example](https://github.com/WebFiori/cli/tree/main/examples/06-table-display)**\n\n## The `help` Command\nOne of the commands which comes by default with the library is the `help` command. It can be used to display help instructions for all registered commands. \n\n\u003e Note: In order to use this command, it must be registered using the method `Runner::register()`. \n\n### Setting Help Instructions\n\nHelp instructions are provided by the developer who created the command during its implementation. Instructions can be set on the constructor of the class that extends the class `WebFiori\\Cli\\Command` as a description. The description can be set for the command and its arguments.\n\n``` php\n\u003c?php\n//File 'src/SampleCommand.php'\nuse WebFiori\\Cli\\Command;\nuse WebFiori\\Cli\\Option;\n\nclass GreetingsCommand extends Command {\n\n    public function __construct() {\n        parent::__construct('hello', [\n            '--person-name' =\u003e [\n                Option::DESCRIPTION =\u003e 'Name of someone to greet.',\n                Option::OPTIONAL =\u003e true\n            ]\n        ], 'A command to show greetings.');\n    }\n\n    public function exec(): int {\n        $name = $this-\u003egetArgValue('--person-name');\n\n        if ($name === null) {\n            $this-\u003eprintln(\"Hello World!\");\n        } else {\n            $this-\u003eprintln(\"Hello %s!\", $name);\n        }\n\n        return 0;\n    }\n}\n\n```\n\n### Running `help` Command\n\nHelp command can be used in two ways, one way is to display a general help for the application and another one for specific command.\n\n#### General Help\n\nTo show general help of the application, following command can be executed.\n\n``` bash\nphp main.php help \n```\n\nOutput of this command will be as follows:\n\n```\nUsage:\n    command [arg1 arg2=\"val\" arg3...]\n\nGlobal Arguments:\n    --ansi:[Optional] Force the use of ANSI output.\nAvailable Commands:\n    help:          Display CLI Help. To display help for specific command, use the argument \"--command-name\" with this command.\n    hello:         A command to show greetings.\n    open-file:     Reads a text file and display its content.\n\n```\n\n\u003e Note: Depending on registered commands, output may differ.\n\n#### Command-Specific Help\n\nTo show help instructions for a specific command, the name of the command can be included using the argument `--command-name` as follows:\n\n``` bash\nphp main.php help --command-name=hello\n```\n\nOutput of this command will be as follows:\n\n```\nhello:         A command to show greetings.\n    Supported Arguments:\n                --person-name:[Optional] Name of someone to greet.\n```\n\n## Unit-Testing Commands\n\nThe library provides the helper class `WebFiori\\Cli\\CommandTestCase` which can be used to write unit tests for different commands. The developer has to only extend the class and use utility methods to write tests. The class is based on PHPUnit.\n\nThe class has two methods which can be used to execute tests:\n\n* `CommandTestCase::executeSingleCommand()`: Used to run one command at a time and return its output.\n* `CommandTestCase::executeMultiCommand()`: Used to register multiple commands, set default command and/or run one of registered commands.\n\nFirst method is good to verify the output of one specific command. The second one is useful to simulate the execution of an application with multiple commands.\n\nBoth methods support simulating arguments vector and user inputs.\n\n\n``` php\nnamespace tests\\cli;\n\nuse WebFiori\\Cli\\CommandTestCase;\n\nclass HelloCommandTest extends CommandTestCase {\n    /**\n     * @test\n     */\n    public function test00() {\n        \n        //Verify test results\n        \n        $this-\u003eassertEquals([\n            \"Hello World!\\n\"\n        ], $this-\u003eexecuteSingleCommand(new HelloWorldCommand()));\n        $this-\u003eassertEquals(0, $this-\u003egetExitCode());\n    }\n}\n\n```\n\n**[📖 View Testing Examples](https://github.com/WebFiori/cli/tree/main/examples/10-multi-command-app)**\n\n## Examples\n\nExplore comprehensive examples to learn different aspects of WebFiori CLI:\n\n### Basic Examples\n- **[📁 Basic Command](https://github.com/WebFiori/cli/tree/main/examples/01-basic-hello-world)** - Create your first CLI command\n- **[📁 Command with Arguments](https://github.com/WebFiori/cli/tree/main/examples/02-arguments-and-options)** - Handle command-line arguments\n- **[📁 User Input](https://github.com/WebFiori/cli/tree/main/examples/03-user-input)** - Read and validate user input\n- **[📁 Output Formatting](https://github.com/WebFiori/cli/tree/main/examples/04-output-formatting)** - Colors and text formatting\n\n### Advanced Examples\n- **[📁 Interactive Commands](https://github.com/WebFiori/cli/tree/main/examples/05-interactive-commands)** - Build interactive CLI applications\n- **[📁 Table Display](https://github.com/WebFiori/cli/tree/main/examples/06-table-display)** - Format data in tables\n- **[📁 Progress Bars](https://github.com/WebFiori/cli/tree/main/examples/07-progress-bars)** - Visual progress indicators\n- **[📁 File Processing](https://github.com/WebFiori/cli/tree/main/examples/08-file-processing)** - File manipulation commands\n- **[📁 Database Operations](https://github.com/WebFiori/cli/tree/main/examples/09-database-ops)** - Database CLI commands\n\n### Complete Applications\n- **[📁 Multi-Command Application](https://github.com/WebFiori/cli/tree/main/examples/10-multi-command-app)** - Full-featured CLI application\n\n### Quick Links\n- **[📖 All Examples](https://github.com/WebFiori/cli/tree/main/examples)** - Browse all available examples\n- **[🚀 Sample App](https://github.com/WebFiori/cli/tree/main/examples/10-multi-command-app/main.php)** - Ready-to-run sample application\n\n\n---\n\n**Ready to build amazing CLI applications? Start with the [📁 Basic Command Example](https://github.com/WebFiori/cli/tree/main/examples/01-basic-hello-world) and work your way up!**\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwebfiori%2Fcli","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwebfiori%2Fcli","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwebfiori%2Fcli/lists"}