evo
Agent-first command registry with explicit execution and searchable metadata.
Install
From crates.io:
From npm for prebuilt macOS and glibc-based Linux binaries:
Supported npm targets:
x86_64-unknown-linux-gnuaarch64-unknown-linux-gnux86_64-apple-darwinaarch64-apple-darwin
The installed command is always:
CLI
evo create <name>
evo create <name> --description <text> [--tag <tag>]...
evo update <name>
evo update <name> [--description <text>] [--tag <tag>]...
evo ls [--json | --compact]
evo show <name> [--json]
evo rm <name>
evo run <name> [args...]
evo env <name> ls
evo env <name> set <key> <value>
evo env <name> unset <key> [key ...]
evo reindex
evo search [query] [--json] [--limit <n>]
Saved commands are never executed as evo <name>. The only execution path is:
evo run <name> [args...]
Command layout
Commands live under ~/.evo/cmds or $EVO_HOME/cmds.
~/.evo/cmds/<name>/run
~/.evo/cmds/<name>/manifest.json
~/.evo/cmds/<name>/.env
~/.evo/cmds/<name>/README.md
runis required and executable.manifest.jsonis required and is the canonical metadata file..envis optional and loaded on top of the parent process environment for that command.README.mdis optional and indexed for search.
manifest.json
evo run always passes trailing CLI args through unchanged, including --help. If stdin is piped from a file, pipe, or socket, evo run forwards those bytes to the runner unchanged. If stdin is not piped, the runner inherits the caller's stdin normally.
If a command needs help text, argument parsing, argument validation, or JSON validation, that logic belongs in the runner script itself.
Create and update
evo create and evo update support two authoring modes:
- Bare
evo create <name>orevo update <name>launches an interactive terminal wizard. - Explicit flags provide a deterministic non-interactive path for humans and agents.
If you run the bare command without a TTY, evo fails with guidance to use explicit flags instead.
Interactive wizard
evo create prompts for:
- description
- optional comma-separated tags
- a runner template
- a generated README file
evo update prompts for:
- description
- optional comma-separated tags
Interactive update only changes metadata. Edit run and README.md directly in your own editor using the printed file paths if those files need changes.
Non-interactive flags
Create:
Update:
Non-interactive rules:
createrequires--description.- non-interactive
createalways scaffolds bothrunandREADME.md. - non-interactive
createprints the runner and README paths after creation so you can read and edit them directly. - non-interactive
updateonly changes manifest fields and preservesrun,.env, andREADME.md. - non-interactive
updateprints the runner and README paths after the update so you can read and edit them directly.
Listing commands
evo ls renders one block per saved command with:
namedescriptiontagsrunner(the file path torun)env(keys only, never values)readme(the file path toREADME.md, with a missing marker when absent)
evo ls --compact renders a one-line summary per command.
evo ls --json returns structured metadata with absolute runner and readme path values plus readme_exists.
Env management
.env values are managed separately from the manifest:
lsprints sorted keys only.setcreates or updates a key.unsetremoves one or more keys and deletes.envif it becomes empty.showandshow --jsonexpose only env keys, never raw values.
Search
Bare evo search launches an interactive fuzzy picker when stdin/stdout are TTYs. Selecting a result immediately runs that saved command.
If no positional query is provided and stdin is piped, evo search reads the piped text as the query and uses the normal non-interactive search output.
evo maintains an SQLite FTS index at $EVO_HOME/index.db.
Indexed fields:
- command name
- description
- tags
- README text
- full
runfile contents, including the shebang
Not indexed:
.envkeys.envvalues
The index is refreshed on create, update, and rm. If the database is missing or corrupted, evo rebuilds it automatically from the command files.
Run evo reindex to force a full rebuild when command files or README contents changed outside evo.
Quick start