{"id":28481178,"url":"https://github.com/0ghny/shellx","last_synced_at":"2026-04-08T15:00:45.214Z","repository":{"id":144696660,"uuid":"518567873","full_name":"0ghny/shellx","owner":"0ghny","description":"Generic shell session bootstrapper and plugins manager","archived":false,"fork":false,"pushed_at":"2026-04-07T07:56:02.000Z","size":147,"stargazers_count":4,"open_issues_count":3,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-07T09:33:24.657Z","etag":null,"topics":["bash","plugin-manager","shell","zsh"],"latest_commit_sha":null,"homepage":"https://0ghny.github.io/shellx","language":"Shell","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/0ghny.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-07-27T18:19:02.000Z","updated_at":"2026-04-05T02:41:25.000Z","dependencies_parsed_at":"2024-03-28T18:35:17.399Z","dependency_job_id":"4d8969e2-4019-40e6-b361-b6cb8f7835aa","html_url":"https://github.com/0ghny/shellx","commit_stats":null,"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/0ghny/shellx","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/0ghny%2Fshellx","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/0ghny%2Fshellx/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/0ghny%2Fshellx/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/0ghny%2Fshellx/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/0ghny","download_url":"https://codeload.github.com/0ghny/shellx/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/0ghny%2Fshellx/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31560476,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T14:31:17.711Z","status":"ssl_error","status_checked_at":"2026-04-08T14:31:17.202Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["bash","plugin-manager","shell","zsh"],"created_at":"2025-06-07T19:39:32.053Z","updated_at":"2026-04-08T15:00:45.203Z","avatar_url":"https://github.com/0ghny.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# shellx: the (almost) shell-independent plugin manager\n\nZSH/BASH or any other shell has their own plugin managers and configuration managers which, for me:\n\n* Contains plugins that has to be available in other shells managers to work the same\n* Or, if you don't use plugin managers like in bash, you have to setup your environment (like installing pyenv or nvm or any other), and then modify your bashrc to init all the required stuff, which ends up with a big bashrc which depends from your \"pre-configured\" environment. I mean, if you copy  this one to another machine, it won't work till you install all the pre-requirements.\n\nA minimal example could be, installing pyenv, it will require to enables it on the session that you want to use, in a minimal scenario, include these lines in .bashrc and .zshrc.\n\nInitially i was using a generic shell file and just including a source of that file which do all of this, and was working fine, but i found that:\n\n* file lines count increased a lot\n* make file resilience like, don't init pyenv if is not installed into the system, was also making the stuff complex\n* cross-OS like linux/osx had also some additional complexity\n\nSo, i have ended, which probably could be called a generic script/plugin loader. It doesn't do anything special at all but allows me:\n\n* Having \"plugins\" that allows me to do things like installing a package, cloning a repository, export variables, run commands. And cross-shell compatible.\n* Having an unified way of configuring my shells, it uses one of many approaches to standardize home folder with a set of predefined files and folders. it defines a ~/bin folder between others that is auto-included in PATH, so it helps me to use always same approach on all my systems.\n* Having different plugins in different folders, which allows me as example to load certain folders in certains environments to load variables or any other special configurations. It also allows me to clone other users plugins easily.\n* It provides a minimal set of libraries and binaries bundled inside which offers a set of functions/aliases/etc. based on SH/BASH (compatible with other shells) to use in plugins contexts to do certain stuff easily.\n\n## Requirements\n\nShellX requires **Bash 4.0+** or **Zsh 4.0+** for full functionality. For detailed information about shell compatibility and supported shells, see [SHELL_COMPATIBILITY.md](./docs/SHELL_COMPATIBILITY.md).\n\n## Use it\n\nClone this repo to your disk\n\n```shell\ngit clone https://github.com/0ghny/shellx ~/.shellx\n```\n\nAlternatively, you can install ShellX in a single command using the install script:\n\n```shell\ncurl -fsSL https://raw.githubusercontent.com/0ghny/shellx/main/install.sh | bash\n```\n\nTo install a specific version, pass the `--version` flag:\n\n```shell\ncurl -fsSL https://raw.githubusercontent.com/0ghny/shellx/main/install.sh | bash -s -- --version v2.0.0\n```\n\nSee [install.sh](./install.sh) for details on what the script does and the options it accepts.\n\nOnce cloned, modify your .zshrc or .bashrc or any *rc from a compatible shell to start shellx bootstrap with your shell. Below, an example to use it with ZSHell (add lines to end of your .zshrc file)\n\n```shell\n[[ -f ~/.shellx/shellx.sh ]] \u0026\u0026 source ~/.shellx/shellx.sh\n```\n\nOnce you starts a new shell (or `exec zsh` to start a new one) you can check ShellX is in action with the shellx init output\n\n```shell\nShellX initalised for oghny in Hostname\nSession information:\n  Started at 20 hr 10 min 34 sec\n  Loaded in: 00 hr 00 min 01 sec\nLibraries:\n    [*] colors.sh           [*] io.sh               [*] stopwatch.sh        [*] user.sh             [*] debug.sh            [*] plugins.sh\n    [*] command.sh          [*] path.sh             [*] sysinfo.sh          [*] cli.sh              [*] feature.sh          [*] session.sh\n    [*] env.sh              [*] shell.sh            [*] time.sh             [*] config.sh           [*] log.sh              [*] update.sh\nPlugins:\n  Applied filter: @all\n  Packages:\n    [*] [@plugins] ~/.shellx/plugins\n  Loaded:\n    [*] @plugins/shellx_update.sh                                   [*] @plugins/wellcome.sh\n```\n\nWellcome is the bundled plugin as of demo purposes and shellx_update is the one that enables AUTO_UPDATE feature.\n\n## Default features\n\n* Auto-Load of libraries: Load all libraries from ~/.shellx/lib folder, which makes to have in all your sessions specific functions, etc.\n* Auto-Load of .{path,exports,aliases,functions,extra} files: just have your stuff bit more tidy up in files\n* Bundled Plugins: loaded from ~/.shellx/plugins folder\n* Auto include in PATH folder ~/.bin and ~/.local/bin to have your binaries also in control\n* Extended Plugins: variable SHELLX_PLUGINS_EXTRA is an array of locations where (same as plugins folder) will be loaded. It helps you to allow to have your private plugins in another locations.\n\n## Shellx CLI\n\nShellx once initialized, has his own CLI to make easier to interact with shellx functionalities, below you will find the same output as `shellx help`\n\n```raw\nMANAGE SESSION\n-----------------------------------------------------------------------------\nshellx list                             List loaded plugins in current session\nshellx status                           Display current session information\n                                        (start time, load time, plugins, etc)\nshellx reset                            Resets current shell session\n                                        it does a /bin/zsh reset or exec /bin/zsh\nshellx reload                           Reload plugins and configuration at once\nshellx info                             Print Shell,OS and Host information\n                                        current session info\n                                        (start time, load time, plugins, etc)\n\nMANAGE VERSION\n-----------------------------------------------------------------------------\nshellx version                          Prints current ShellX version\nshellx version info                     Prints version with release notes\nshellx version notes [N]                Prints last N release notes (default: 3)\nshellx version check                    Checks if a new version is available\nshellx self-update                      Updates ShellX to latest release\nshellx check-update                     Shows update availability and changelog\n\nTOOLS\n-----------------------------------------------------------------------------\nshellx debug enabled                    Enabled shellx debug output to stdout\nshellx debug disabled                   Disable shellx debug output to stdout\n\nCONFIGURATION\n-----------------------------------------------------------------------------\nshellx config print                     Print config file contents\nshellx config runtime                   Print active SHELLX_* session variables\nshellx config set \u003cKEY\u003e \u003cVALUE\u003e         Set a configuration key\nshellx config unset \u003cKEY\u003e               Remove a configuration key\nshellx config reload                    Reload configuration from file\n\nMANAGE PLUGINS\n-----------------------------------------------------------------------------\nshellx plugins list                     List available plugin packages\n                                        from configured repositories\nshellx plugins install \u003cname|url\u003e       Install plugin by package name\n                                        or direct git URL\nshellx plugins installed                List installed plugin packages\nshellx plugins uninstall \u003cname\u003e         Uninstall the specified plugin package\nshellx plugins update \u003cname\u003e            Update an installed plugin (git pull)\nshellx plugins reload                   Reload plugins into current session\n\n**NEW in v2.0+**: Plugin Registry System\n  - Install plugins by name instead of full URL\n  - Browse available packages with `shellx plugins list`\n  - See [Plugin Registry System](#plugin-registry-system) section for details\n```\n\n**Note**: All CLI commands `under the hood` calls to a shellx shell function in the form of `shellx::\u003cnamespace\u003e::\u003cfunction\u003e \u003cparameters\u003e`. Below in this documentation you will find some internal library functions that can be used, and can be translated of invoked using this cli even if it's not documented in this help.\nYou just need to follow this convention, as example:\n\n```shell\n# Gets the full path for shellx-community-plugins package\n$ shellx::plugins::path shellx-community-plugins\n~/.shellx.plugins.d/shellx-community-plugins\n\n# The same using shellx cli\nshellx plugins path shellx-community-plugins\n~/.shellx.plugins.d/shellx-community-plugins\n```\n\n## Configuration Options\n\nShellX can be customized in behaviour using a configuration file which can be located in different places (in order or priority):\n\n- Environment variable `SHELLX_CONFIG`\n- ~/.shellxrc\n- ~/.config/shellx/config\n\nThis file is loaded at bootstrapping time, so it's useful to avoid having to export variables before starting shellx in your shell session.\n\nCurrent configuration options are:\n\n| KEY              | DESCRIPTION                                                                              |\n| ---------------- | ---------------------------------------------------------------------------------------- |\n| SHELLX_CONFIG    | If you wanna specify an specific location for your shellx configuration file             |\n| SHELLX_PLUGINS_D | By default it's `HOME/.shellx.plugins.d` but in case you wanna set another special location for searching for external plugins directory, you can use this variable |\n| SHELLX_NO_BANNER | If declared with any value, summary banner that contains session information, plugins loaded, etc. won't be displayed |\n| SHELLX_DEBUG     | If declared with any value, debug mode is enabled, lot's of output in your console       |\n| SHELLX_PLUGINS   | By default value is `@all` which means all plugins, it controls the plugin loading feature, you can read more about it in this documentation in `Selective plugin loading` section |\n| SHELLX_HOME      | If you wanna move shellx to another location, you can set that location in this variable, by default it will use the place where the `shellx.sh` script is. |\n\n### Reload configuration from the CLI\n\nNow you can reload configuration from file in your current environment session just running\n\n```shell\n$ shellx config reload\n$ shellx config print\nSHELLX_NO_BANNER=yes\nSHELLX_PATH_BACKUP=....\nSHELLX_DEBUG=           # \u003c- it means disabled\n```\n\n## Bundled session variables\n\nWhen shellx is bootstrapped, there's some variables that can be used inside the session that belongs to shellx, it's quite important that you don't modify them if you don't want unexpected behaviours, but sometimes could be useful to use them in your scripts\n\n| NAME                    | DESCRIPTION                                   |\n| ----------------------- | --------------------------------------------- |\n| __shellx_plugins_loaded | array with list of loaded plugins by name     |\n| __shellx_homedir        | home directory for shellx installation        |\n| __shellx_bindir         | shellx installation bin directory             |\n| __shellx_libdir         | shellx installation lib directory             |\n| __shellx_plugins_d      | shellx extended plugins directory             |\n| __shellx_pluginsdir     | shellx installation bundled plugins directory |\n\n## Bundled library of functions\n\nShellx includes and load a library of functions that can be used inside any plugin but also from your shell session\n\n| LIB       | FUNC NAME               | DESCRIPTION                                                                              |\n| --------- | ----------------------- | ---------------------------------------------------------------------------------------- |\n| command   | command::get_type       | returns the type (as string) of a command by name, like \"command,alias,function,builtin\" |\n| command   | command::exists         | returns true if specified command exists as command,alias or function                    |\n| env       | env::export             | export a variable with a value                                                           |\n| env       | env::is_defined         | checks if a variable is already defined, returns true or false                           |\n| io        | io::exists              | returns true if the path (file or directory) exists, false if not                        |\n| path      | path::add               | adds a new path to the PATH variable (if not already added)                              |\n| path      | path::exists            | checks if a path is already in PATH variable                                             |\n| path      | path::export            | alias of path::add with a different implementation                                       |\n| path      | path::backup            | backups current PATH content into a variable (default PATH_BAK)                          |\n| shell     | shell::alias_exists     | checks if an alias is already defined, returns 0 if exists, 1 if not (POSIX-compatible) |\n| stopwatch | stopwatch::capture      | returns the current date to use in stopwatch::elapsed operation                          |\n| stopwatch | stopwatch::elapsed      | elapsed time between startdate and enddate                                               |\n| sysinfo   | env::arch               | returns os architecture (386, amd64, arm, unknown)                                       |\n| sysinfo   | env::platform           | returns os platform (linux, darwin, unknown)                                             |\n| sysinfo   | env::uptime             | human readable and cross-os uptime                                                       |\n| time      | time::to_human_readable | from elapsed to human readable                                                           |\n| user      | user::current           | returns the name of the current user                                                     |\n\n## Community plugins\n\n[Community Plugins repo](https://github.com/0ghny/shellx-community-plugins)\n\nto installs them, or any other repository with plugins:\n\n```shell\ngit clone https://github.com/0ghny/shellx-community-plugins ~/.shellx.plugins.d/shellx-community-plugins\n# then, just restart your shell (e.g: exec zsh)\n```\n\n## Plugins Management\n\nShellx offer different functions that allows you to install/uninstall plugins created using `ShellX Plugin Framework guidelines` (read in sections below).\nRemember that by default all plugin commands operates with `SHELLX_PLUGINS_D` variable, which is the directory that contains plugins installed.\n\n| CLI                      | LIB              | FUNC NAME                  | DESCRIPTION                                                                            |\n| ------------------------ | ---------------- | -------------------------- | -------------------------------------------------------------------------------------- |\n| shellx plugins install   | shellx/plugins   | shellx::plugins::install   | with a git repository as parameter installs the plugin and reload plugins              |\n| shellx plugins uninstall | shellx/plugins   | shellx::plugins::uninstall | with a plugin name as parameter uninstall the plugin from your shellx installation     |\n| shellx plugins installed | shellx/plugins   | shellx::plugins::installed | prints current installed plugins and their location                                    |\n|                          | shellx/plugins   | shellx::plugins::is_installed | with plugin name as parameter returns true or false if plugins is installed         |\n| shellx plugins loaded    | shellx/plugins   | shellx::plugins::loaded    | prints current loaded plugins into shellx                                              |\n| shellx plugins reload    | shellx/plugins   | shellx::plugins::reload    | reload all plugins                                                                     |\n| shellx plugins update    | shellx/plugins   | shellx::plugins::update    | update specified plugin by name, or all plugins installed                              |\n\n### Get current installed plugins\n\n```shell\n$ shellx installed\nPlugins Installed:\n  [*] plugins (~/.shellx/plugins)\n  [*] shellx-community-plugins (~/.shellx.plugins.d/shellx-community-plugins)\n  [*] shellx-plugins-arch (~/.shellx.plugins.d/shellx-plugins-arch)\n```\n\n### Installing a plugin\n\nNext example installs `shellx-plugins-arch` which contains plugins for arch linux\n\n```shell\n$ shellx install https://github.com/0ghny/shellx-plugins-arch\n[PLUGIN] Cloning plugin into shellx plugins directory... OK\n[PLUGIN] Reloading plugins...\n```\n\n### Uninstalling a plugin\n\nNext example uninstall `shellx-plugins-arch` plugin\n\n```shell\n$ shellx uninstall shellx-plugins-arch\n[PLUGIN] shellx-plugins-arch uninstalling... OK\n```\n\n### Updating Plugins (or a single Plugin)\n\n```shell\n$ shellx plugins update [PLUGIN_NAME]\n  where PLUGIN_NAME is an optional parameter with one of the plugin names.\n\n  If provided, it should be an existing installed plugin name, to retrieve list of plugins installed you can execute\n    shellx plugins installed\n  and pick a proper name.\n\n  If not provided it will try to update ALL plugins.\n\n  The update method is using git pull under plugin directory, it will check also if directory contains a .git directory.\n```\n\nTo update our `shellx-plugins-arch` plugin\n\n```shell\n$ shellx plugins update shellx-plugins-arch\n[+] Updating shellx-plugins-arch... OK\n```\n\n### Selective plugins loading\n\nThe core of shellx is to be able to add or remove functionality by plugins. Some or the allready existing community plugins are ready to skip their functionality if as example the tool is not present into the system. If `dotnet` is not installed, doesn't makes sense to export the OPTOUT variables to disable telemetry.\n\nBut, even doing this, as much plugins you have, in some way, slower the bootstrap process will be.\n\nTo avoid this, shellx offer a selective plugin feature, that, as default is `load all plugins`. But, remember that all `bundled` plugins will be always loaded.\n\nThis configuration is done using the previously defined `SHELLX_PLUGINS` configuration property, which is an array that contains the plugins to be loaded. **BUT**, since a plugin can be named the same in different locations, we have offer different ways of specify `what to load`.\n\n- Load all: In this case `SHELLX_PLUGINS` should be valued `( @all )`. **This is the default value**\n- Load a location completely: Specify the name of the folder inside `shellx plugins d` directory with symbol '@' as prefix. In case of wanna load all community plugins installed, normally it will `( @shellx-community-plugins )`.\n- Load specific plugin from a location: location/plugin-name, like `@shellx-community-plugins/asdf` or `@shellx-community-plugins/pyenv`\n- Load all plugins that are named the same: just specify the name `asdf` or `pyenv` will load all plugins named asdf or pyenv in all locations.\n\nSome examples:\n\n```shell\n# Loads all plugins, in this case variable can be defined in this way, or not be defined\nSHELLX_PLUGINS=( @all )\n\n# Load all community plugins only (+ bundled)\nSHELLX_PLUGINS=( @shellx-community-plugins )\n\n# Load asdf from community plugins + custom cloned plugins repo in a folder called shellx-my-plugins\nSHELLX_PLUGINS=( @shellx-community-plugins/asdf @shellx-my-plugins )\n\n# Load just plugins with names asdf,pyenv,minikube, in ALL locations\nSHELLX_PLUGINS=( asdf pyenv minikube )\n```\n\n## Plugin framework Guidelines\n\nPlugins may use all internal variables and functions bundled in ShellX (in fact, they are declared in session so, you can access to them from your shell anytime).\n\n### Specific plugin configuration\n\nWhen you're developing or using a plugin you may want to define certain \"variables\" that can affect to the plugin behaviour, like, as example, determine if you want to download a binary for a tool or not in case that doesn't exists on the system.\n\nThis is done using Feature Flags inside your plugin, basically you can use any variable named that you want, and the user can include that configuration in `ShellX configuration file` or exporting them into the shell before bootstrapping shellx, BUT, we recommend to follow (as we do) a naming pattern for those variables. Following our previous example, imagine a plugin that will install minikube in case it's not present into the system, you may create a variable called `SHELLX_PLUGIN_MINIKUBE_INSTALL_IF_NOT_PRESENT` or `SHELLX_PLUGIN_MINIKUBE_INSTALL` so basically `SHELLX_PLUGIN_MINIKUBE_` will be the prefix for your plugin variables. We do this to avoid conflicts with other tools or other plugins (even if this is almost impossible to ensure 100%), some people don't like LONG variable names, but, sometimes could be necessary.\n\n### Extend with plugins\n\nYou can see some examples in folder `plugin-examples` or take a look or use [Community Plugins repo](https://github.com/0ghny/shellx-community-plugins).\n\nCreate your own repository with your plugins and clone them inside `SHELLX_PLUGINS_D` directory (usually ~/.shellx.plugins.d/folder_name).\n\nSome ideas for plugins:\n\n* Download a binary if not present in your system\n* Create some aliases for some tools if they are installed\n* Initialize some stuff like nvm, or any other if present tool\n\n## Debugging ShellX\n\nShellx offers some internal logging mechanishm that may help to understand what's happening behind a command or operation.\nDebug can be enabled in two ways:\n\n- adding variable SHELLX_DEBUG to `shellxrc` file with any value (remove to disable)\n- through CLI as `shellx debug enable` or `shellx debug disable`, this is specially useful since allows you to enable/disable for specific command executions during a session\n- defining SHELLX_DEBUG variable before running a command `SHELLX_DEBUG=yes shellx plugins reload`\n- defining SHELLX_DEBUG variable before running a function `SHELLX_DEBUG=yes shellx::plugins::reload`\n\nif you have it declared in `shellxrc` file you will see lot of outputs everytime you start a shell, that's why it's not recommented.\n\n**If you want to debug the shellx initialization process** it's better to do:\n\n```shell\n$ shellx debug enable\n$ shellx reset\n....\n... lot of output\n....\n\n... once you finish debugging\n$ shellx debug disable\n```\n\n## Plugin Registry System\n\nShellX includes a **Plugin Registry System** that enables easy plugin discovery and installation. Instead of remembering full GitHub URLs, users can install plugins by simple names from registered repositories.\n\n### Quick Start\n\n```bash\n# List available plugin packages\nshellx plugins list\n\n# Install by package name (much simpler!)\nshellx plugins install community\n\n# Still works with direct URLs\nshellx plugins install https://github.com/user/my-plugin.git\n```\n\n### Registry File\n\nThe plugin registry is located at: `plugins.repositories` (in ShellX root directory)\n\n**Format**: `NAME|URL|DESCRIPTION`\n\n```\ncommunity|https://github.com/0ghny/shellx-community-plugins|Community-supported plugins\nexamples|https://github.com/0ghny/shellx-plugin-examples|Plugin examples and templates\nenterprise|https://github.com/0ghny/shellx-enterprise-plugins|Enterprise-grade plugins\n```\n\n### Registry Configuration\n\n**Priority order** for registry file location:\n\n1. Environment variable: `SHELLX_PLUGINS_REGISTRY` (if set)\n2. User config: `~/.config/shellx/plugins.repositories`\n3. Repository root: `plugins.repositories`\n4. Bundled: `lib/shellx/plugins.repositories` (backwards compatibility)\n\n### Plugin Management Commands\n\n| Command | Description |\n|---------|-------------|\n| `shellx plugins list` | List all available plugin packages from registered repositories |\n| `shellx plugins add \u003cname\u003e \u003curl\u003e [description]` | Add a custom plugin repository |\n| `shellx plugins repositories` | List all configured plugin repositories |\n| `shellx plugins install \u003cname\\|url\u003e` | Install plugin by package name or direct git URL |\n| `shellx plugins installed` | List installed plugin packages |\n| `shellx plugins uninstall \u003cplugin_name\u003e` | Uninstall a specific plugin |\n| `shellx plugins update [plugin_name]` | Update installed plugins or specific plugin |\n| `shellx plugins reload` | Reload all plugins in current session |\n\n\n### Managing Custom Repositories\n\nAdd your own plugin repository:\n\n```bash\n# Add custom repository\nshellx plugins add myrepo https://github.com/me/my-plugins \"My personal plugins\"\n\n# Now you can install from it\nshellx plugins install myrepo\n```\n\nThis creates `~/.config/shellx/plugins.repositories` extending the default registry.\n\n### For Plugin Authors\n\nTo publish your plugins for ShellX:\n\n1. Create a repository with this structure:\n```\nmy-awesome-plugins/\n├── plugins/\n│   ├── 00-first-plugin.sh\n│   ├── 10-second-plugin.sh\n│   └── README.md\n└── README.md\n```\n\n2. Request registration by opening an issue on the ShellX repository\n\n3. Once approved, users can install with:\n```bash\nshellx plugins install your-package-name\n```\n\n### Usage Examples\n\n**Install from official repositories**:\n```bash\n# Install community plugins\nshellx plugins install community\n\n# Install plugin examples\nshellx plugins install examples\n```\n\n**Direct URL (backward compatible)**:\n```bash\n# Old way still works\nshellx plugins install https://github.com/0ghny/shellx-community-plugins.git\n```\n\n**Provision new systems**:\n```bash\n# In your ~/.shellxrc or setup script\neval \"$(shellx plugins list | grep community)\" \u0026\u0026 \\\n  shellx plugins install community\n```\n\n### Environment Variables\n\n| Variable | Description |\n|----------|-------------|\n| `SHELLX_PLUGINS_REGISTRY` | Path to custom registry file (overrides default lookup) |\n| `SHELLX_CONFIG_DIR` | Base directory for user config files (default: `.config/shellx`) |\n\n---\n\n## More documentation\n\nDetailed documentation is available in the [`docs/`](./docs/) folder:\n\n| Document | Description |\n|---|---|\n| [QUICK_START.md](./docs/QUICK_START.md) | Step-by-step guide for new users: installation, first session, everyday CLI commands, writing your first plugin, and installing community plugins. |\n| [SHELL_COMPATIBILITY.md](./docs/SHELL_COMPATIBILITY.md) | Supported shells (Bash, Zsh, Fish), minimum versions, setup instructions for each, and notes on partially supported shells. |\n| [DEV_SCRIPT.md](./docs/DEV_SCRIPT.md) | Reference for `hack/dev.sh` — the developer task runner used for linting, formatting, testing, and running CI jobs locally. |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F0ghny%2Fshellx","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F0ghny%2Fshellx","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F0ghny%2Fshellx/lists"}