| Crates.io | mici |
| lib.rs | mici |
| version | 0.1.1 |
| created_at | 2025-10-14 21:41:17.50592+00 |
| updated_at | 2025-10-15 16:49:12.67807+00 |
| description | Lightweight CLI framework based on filesystem hierarchy |
| homepage | |
| repository | https://github.com/rwxdash/mici |
| max_upload_size | |
| id | 1883249 |
| size | 183,412 |
mici is a lightweight CLI framework that automatically discovers and executes your commands based on filesystem hierarchy.
Define your commands as YAML files and mici handles the CLI and its execution for you.
Make sure Rust is installed. See #install for more details.
# Install mici using Cargo
# This will install `mici` as executable.
cargo install mici
Run mici --help to see what's available.
# Initialize mici
mici init
# Create your first command and edit if needed
# at `~/.mici/jobs/commands/hello.yml`
# or run `mici edit hello` to quickly open in an editor.
mici new hello
# See what it is with --help
# Pager can be disabled with `disable_pager: true` in the `config.yml`.
mici hello --help
# Run it
mici hello
Traditional CLI development:
With mici:
Create your commands as YAML files in a directory hierarchy.
~/.mici
├── config.yml # Configuration file
└── jobs
├── commands
│ ├── deploy
│ │ ├── terraform.yml # mici deploy terraform
│ │ └── frontend
│ │ ├── staging.yml # mici deploy frontend staging
│ │ └── production.yml # mici deploy frontend production
│ ├── database
│ │ ├── backup.yml # mici database backup
│ │ └── migrate.yml # mici database migrate
│ └── hello.yml # mici hello
│
└── scripts # Usable as:
├── hello.py # scripts/hello.py
└── run.sh # scripts/run.sh
Each YAML file has CI-like attributes - environment variables, confirmation prompts, parallel execution, and more; allowing mici to customize your run of that command and generate help documentation based on the available information.
For a full reference of how a mici command is structured, see examples/.../hello.yml.
version: "1.0"
name: "hello"
description: "A new mici command"
usage: "mici hello"
configuration:
confirm: false
environment:
VAR_ONE: "SOME_VALUE_123"
VAR_TWO: "SOME_VALUE_123"
IS_FORCED: "@{inputs.force}"
TOKEN: "${MY_PRIVATE_TOKEN}"
working_directory: null
inputs:
name:
type: string
description: "A name to say hello to!"
required: true
secret: false
short: -n
long: --name
default: "World"
force:
type: boolean
description: "Run this with force, maybe?"
short: -f
long: --force
steps:
- id: "say_hello"
name: "Say hello on terminal"
run:
shell: "bash"
working_directory: null
environment:
VAR_TWO: "ANOTHER_VALUE_456"
command: |
echo "Hello, @{inputs.name}!"
That's it. Your filesystem is your CLI structure, and YAML is your command.
Cargo is a package manager for Rust. Make sure to have Rust toolset available on your computer first. See rustup installation guide for easy introduction.
Once you have Rust available, you can run any of the following commands to install mici.
cargo install mici
git clone git@github.com:rwxdash/mici.git
cd ./mici
cargo install --path .
Simply run:
cargo uninstall mici
There are some major stories to complete before I call this project version 1.0. Here's what I have in my mind so far:
script: "scripts/..." usage for stepswhen: in steps
on_failure() # any previous step failedon_success() # all previous steps passedon_platform("linux") # linux/win/darwindepends_on("step_id") # or depends_on(["step1", "step2"])${ENV_VAR} == "production"@{inputs.cleanup}@{inputs.branch} == "main"@{steps.<STEP_ID>.output} == "success" (Or shell code? not sure)secret: trueCode of conduct is simple. Be nice and thoughtful. That's all.
About the Contributions, the project is obviously open to contributions. However, since it's quite early and I'm still shaping what this tool can be, no major refactor or feature PRs, please.
I'd very much appreciate if you open an issue beforehand if you plan to contribute any change.
Distributed under the Apache License 2.0.
See the LICENSE file for more information.
mici: Your filesystem is the best argument parser.