CLI
CLI overview
Install and run the mayura command: its commands, readable and JSON output, help, version, exit codes and errors.
The mayura command ships inside the mayura npm package. You use it to create projects from starters and
templates, to run your application during development and in production, and to operate a running Mayura server
from a terminal or a script.
npx mayura initIn a terminal, mayura init with no options opens a short wizard. Everything else is driven by flags, so the same
commands work in scripts and CI.
Installing and running
You do not need to install anything globally. There are two common ways to run the CLI:
Before you have a project, run it with
npx, which fetches themayurapackage on demand:bashnpx mayura startersInside a project, add
mayuraas a dependency. Every project created bymayura initalready has it, pinned to the exact version of the CLI that created it. Run the command throughnpxor from yourpackage.jsonscripts:bashnpm install mayura npx mayura --versionThe starters' scripts call it this way, for example
"dev": "mayura dev"and"serve": "mayura serve --app dist/src/app.js".
The CLI needs Node.js 22 (22.12 or later) or 24 (24.14.1 or later). See Support.
Commands
mayura --help groups the commands like this:
| Group | Commands | Page |
|---|---|---|
| Create | init, starters, templates, validate, inspect |
Create a project |
| Run an application | dev |
Develop with mayura dev |
| Run an application | serve, worker, migrate |
Serve, worker and migrate |
| Operate a server | server-health, server-tools, run-get, run-wait, run-cancel, human-list, human-get, human-respond, workflow-list, workflow-get, workflow-approve, workflow-cancel, workflow-pause, workflow-resume, workflow-signal, fleet-get, fleet-hold, fleet-release, fleet-sweep |
Operate a server |
Options take the form --name value, or just --name for switches such as --apply. An unknown option, or the
same option given twice, is an error.
Help and version
mayura --help
mayura init --help
mayura --version--help (or -h) shows the command list and wins anywhere on the line, so mayura init --help prints help instead
of an argument error. mayura help does the same. Running mayura with no command in a terminal also prints help.
--version (or -v, or mayura version) prints the version as plain text, so scripts can read it. Add --json to
get it as a JSON document instead.
Readable and JSON output
The CLI picks its output format from where the output goes:
- In a terminal, results are readable: coloured statuses (
✔ succeeded,● waiting,✖ failed), wrapped descriptions, and the next command or flag to use. - When output is piped or redirected, every command prints one JSON document instead. Scripts and CI can parse it directly.
- With
--json, the CLI always prints JSON, even in a terminal.
mayura templates --json
mayura starters | jq -r '.starters[].name'Every JSON document has a status field. Most commands report succeeded; init without --apply reports
planned, migrate reports migrated, serve, worker and dev report stopped when they exit, and a
fleet-sweep that did not finish reports incomplete.
Colour follows the usual conventions: it is off when NO_COLOR is set to any non-empty value or TERM=dumb, and on
when FORCE_COLOR is set to anything other than 0. Colour is never written into JSON output.
Exit codes and errors
| Exit code | Meaning |
|---|---|
0 |
The command succeeded. This includes init printing a plan, and fleet-sweep stopping with incomplete. |
1 |
The command failed, or you cancelled the init wizard. |
Errors go to stderr. In a terminal they read like this:
✖ Unknown template; run mayura templates. (INVALID_INPUT)When stderr is not a terminal, or with --json, the error is a JSON document:
{"status":"failed","error":{"code":"INVALID_INPUT","message":"Unknown command. Run mayura --help to see the commands."}}The code is one of Mayura's error codes (see Outcomes): INVALID_INPUT for a usage
problem the CLI found, INVALID_CONFIG for a bad file or setting, PERMISSION_DENIED, NOT_FOUND, CONFLICT,
TIMEOUT and so on for server commands. Messages are fixed, safe text. The CLI never echoes an unknown command or
argument back, because it might be a credential pasted in the wrong place.
Good to know
- The CLI never prompts for a server token. Authenticated commands read it only from stdin (
--token-stdin); see Operate a server. serve,workerandmigrateimport only the one module you name with--app. Listing and inspecting a project never runs your code.- Everything the commands do is also available as functions from
mayura/cli, for exampleplanProject,inspectWorkflowsanddefineMayuraApplication. See Entry points.