<!-- entire-trail-link-start --> https://entire.com/gh/jdx/-/trails/2967/changes/mise/1104 <!-- entire-trail-link-end --> `--local` means two different things in mise. On `ls`, `outdated`, `upgrade` and `tasks ls` it means "everything except global config", parent directories included. On `settings`, and on the new `uninstall --local`, it means the nearest project config. So `mise ls --local` does not preview what `mise uninstall --local` removes. This stacks on #15079 and renames that PR's flag before it ships. ```console $ cd ~/work/app # ~/work/mise.toml also exists $ mise ls --no-global # app's config and ~/work's, not the global config $ mise ls --project # app's config only $ mise uninstall --project # removes the versions app's config names, after asking ``` ## What changes - **`mise uninstall --project`** replaces `mise uninstall --local` from #15079. Nothing released uses the old name, so there is no alias. - **`mise ls --project`** lists the versions the nearest project's config files request. It uses the same file selection as `uninstall --project`, so it shows what that command works from. A version that a later file in the directory overrides is not listed, as with `--no-global`, while `uninstall --project` still removes it and lists it before asking. `MISE_<TOOL>_VERSION` is ignored. - **`--no-global`** on `ls`, `outdated`, `upgrade` and `tasks ls` does what `--local` did there: only tools or tasks from non-global config. On `ls`, `outdated` and `upgrade` it conflicts with `--global` and `--local`. On `tasks ls`, where `-g` and `-l` already override each other (the later flag wins), `--no-global` follows the same rule. - **`--local` is deprecated** on those four commands in favor of `--no-global`. The flag help and docs say so now, and it keeps working. mise starts warning on 2027.1.0: ```text mise WARN deprecated [cli.ls.local]: `mise ls --local` is deprecated. Use `mise ls --no-global` instead. This will be removed in mise 2027.7.0. ``` `settings --local` and `lock --local` are unchanged. ## Timeline | When | What happens | |---|---| | Now (2026.10) | `--no-global` and `--project` ship. `--local` works as before, without a warning. | | 2027.1.0 | `--local` starts warning. | | 2027.7.0 | `--local` is removed from `ls`, `outdated`, `upgrade` and `tasks ls`. It fails as an unknown flag. | The three silent months are the compatibility window: `--no-global` is new, so older mise versions reject it, and warning people to switch before it is widely available would send them to a flag their other machines do not have. The six months of warning is shorter than the 12-month default, on purpose. `--local` is not coming back: it would read as `mise.local.toml`, which `mise lock --local` and `mise dot --local` already mean, and `--project` and `--no-global` cover both scopes it could take. ## Things to know - **Merge with #15079.** If #15079 shipped alone, `uninstall --local` would ship and then need its own deprecation. Merging them together, or this one right after, avoids that. - `outdated -l` and `upgrade -l` are already deprecated aliases of `--bump`. I dropped the note that `-l` would become shorthand for `--local` after 2027.8.5, since `--local` is going away. - `--no-global` skips global config, system config and `MISE_<TOOL>_VERSION`, as `--local` did. ## Validation New `e2e/cli/test_local_flag_alias` checks that `--local` and `--no-global` select the same tools and do not warn yet. `test_ls` covers `--project` from the project root and a subdirectory and its conflicts. Existing `ls`, `outdated`, `upgrade`, `tasks ls` and `uninstall` e2e tests were switched to the new flags and pass, and clippy with `-D warnings` is clean. 🤖 Generated with [Claude Code](https://claude.com/claude-code) *AI-assisted — Tool: Claude Code; model: anthropic/claude-sonnet-5-5; version: 2.1.308.* <!-- This is an auto-generated comment: release notes by coderabbit.ai --> <!-- coderabbit-ai-generated:v1 --> ## Summary by CodeRabbit * **New Features** * Added `--no-global` to list tools and tasks, check outdated tools, and upgrade tools using non-global configuration. * Added `mise ls --project` to show effective tool requests from the nearest project’s configuration files, excluding parent, global, system, and environment-variable requests. * **Updates** * `--local` is deprecated in favor of `--no-global`; warnings begin in 2027.1.0, with removal scheduled for 2027.7.0. * Renamed `mise uninstall --local` to `--project`. Project uninstall considers requests from the nearest project’s configuration files, including overridden versions, but excludes `path:` and `system` versions. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
8634 lines
464 KiB
KDL
8634 lines
464 KiB
KDL
min_usage_version "6.11"
|
|
name mise
|
|
bin mise
|
|
author "Jeff Dickey <@jdx>"
|
|
about "Dev tools, env vars, and tasks in one CLI"
|
|
source_code_link_template #"""
|
|
{%- set path = path | replace(from='-', to='_') -%}
|
|
{%- if path == "bootstrap/dotfiles" or path is starting_with(pat="bootstrap/dotfiles/") -%}
|
|
{%- set path = path | replace(from="bootstrap/dotfiles", to="dotfiles") -%}
|
|
{%- endif -%}
|
|
{%- if path == "daemons/providers" or path is starting_with(pat="daemons/providers/") -%}
|
|
{%- set path = "daemons/providers.rs" -%}
|
|
{%- elif path == "daemons" or path is starting_with(pat="daemons/") -%}
|
|
{%- set path = "cli/daemons.rs" -%}
|
|
{%- elif path == "dotfiles/history" -%}
|
|
{%- set path = "cli/dotfiles/history/mod.rs" -%}
|
|
{%- elif path == "dotfiles/include" -%}
|
|
{%- set path = "cli/dotfiles/exclude.rs" -%}
|
|
{%- elif path == "dotfiles/origin" or path == "dotfiles/origin/set" -%}
|
|
{%- set path = "cli/dotfiles/origin.rs" -%}
|
|
{%- elif path == "bootstrap/packages/apply" -%}
|
|
{%- set path = "cli/system/install.rs" -%}
|
|
{%- elif path == "bootstrap/packages/export" -%}
|
|
{%- set path = "cli/system/export.rs" -%}
|
|
{%- elif path == "bootstrap/packages/import" -%}
|
|
{%- set path = "cli/system/import.rs" -%}
|
|
{%- elif path == "bootstrap/packages/prune" -%}
|
|
{%- set path = "cli/system/prune.rs" -%}
|
|
{%- elif path == "bootstrap/packages/status" -%}
|
|
{%- set path = "cli/system/status.rs" -%}
|
|
{%- elif path == "bootstrap/packages/upgrade" -%}
|
|
{%- set path = "cli/system/upgrade.rs" -%}
|
|
{%- elif path == "bootstrap/packages/use" -%}
|
|
{%- set path = "cli/system/use.rs" -%}
|
|
{%- elif path == "bootstrap/packages/where" -%}
|
|
{%- set path = "cli/system/where.rs" -%}
|
|
{%- elif path == "bootstrap/packages/brew/tap" -%}
|
|
{%- set path = "cli/system/brew/tap.rs" -%}
|
|
{%- elif path == "bootstrap/packages/brew/untap" -%}
|
|
{%- set path = "cli/system/brew/untap.rs" -%}
|
|
{%- elif path == "bootstrap/packages/brew" -%}
|
|
{%- set path = "cli/system/brew/mod.rs" -%}
|
|
{%- elif path is starting_with(pat="bootstrap") -%}
|
|
{%- set path = "cli/bootstrap.rs" -%}
|
|
{%- elif path == "tasks/run" -%}
|
|
{%- set path = "cli/run.rs" -%}
|
|
{%- elif cmd.subcommands | length > 0 -%}
|
|
{%- set parts = path | split(pat="/") -%}
|
|
{%- set path = "cli/" ~ parts[0] ~ "/mod.rs" -%}
|
|
{%- else -%}
|
|
{%- set path = "cli/" ~ path ~ ".rs" -%}
|
|
{%- endif -%}
|
|
https://github.com/jdx/mise/blob/main/src/{{path}}
|
|
"""#
|
|
long_about #"""
|
|
mise installs the development tools your projects need, sets their environment variables, and runs their tasks.
|
|
|
|
You declare tools, environment variables, and tasks in mise.toml. `mise use <TOOL>` installs a tool and adds it to the project's mise.toml, `mise install` installs everything the config requests, and `mise run <TASK>` runs a task. Docs: https://mise.jdx.dev
|
|
"""#
|
|
logo #"""
|
|
▄▄ ▄▄▄ ▄▄
|
|
▟ ▙▟ ▙▟ ▙
|
|
▜▄▄▄▄▄▄▄▄▄▄▄▛
|
|
▀▀▀▀▀▀▀▀▀▀▀
|
|
▗▄▄▄▄▄▄▄▖
|
|
▌ ▀ ▔ ▐
|
|
▝▄ ▀▄▀ ▄▘
|
|
|
|
"""# style=green
|
|
unknown_flags error
|
|
default_subcommand run
|
|
flag "-c --continue-on-error" help="Continue running tasks even if one fails" hide=#true
|
|
flag "-C --cd" help="Run as if mise were started in DIR" global=#true {
|
|
arg <DIR>
|
|
}
|
|
flag "-E --env" help="Load the `mise.<ENV>.toml` config files (same as MISE_ENV)" var=#true global=#true {
|
|
long_help #"""
|
|
Load the `mise.<ENV>.toml` config files (same as MISE_ENV)
|
|
|
|
Repeat the flag or separate names with commas to load several environments.
|
|
"""#
|
|
arg <ENV>
|
|
}
|
|
flag "-f --force" help="Force the operation" hide=#true
|
|
flag "-j --jobs" help="How many jobs to run in parallel; defaults to the `jobs` setting" global=#true env=MISE_JOBS {
|
|
long_help #"""
|
|
How many jobs to run in parallel; defaults to the `jobs` setting
|
|
|
|
Values below 1 are treated as 1.
|
|
"""#
|
|
arg <JOBS>
|
|
}
|
|
flag "-n --dry-run" help="Dry run, don't actually do anything" hide=#true
|
|
flag "-P --profile" help="Set the profile (environment)" var=#true hide=#true global=#true conflicts=--env {
|
|
arg <PROFILE>
|
|
}
|
|
flag "-q --quiet" help="Suppress non-error messages" global=#true env=MISE_QUIET {
|
|
overrides "--silent" "--trace" "--verbose" "--debug" "--log-level"
|
|
}
|
|
flag "-s --shell" hide=#true {
|
|
arg <SHELL>
|
|
}
|
|
flag "-t --tool" help="Tools to load in addition to those in mise.toml, such as `node@24 python@3.13`" var=#true hide=#true {
|
|
arg <TOOL@VERSION>
|
|
}
|
|
flag "-v --verbose" help="Show extra output (use -vv for even more)" var=#true global=#true count=#true {
|
|
overrides "--quiet" "--silent" "--trace" "--debug"
|
|
}
|
|
flag "-V --version" hide=#true
|
|
flag "-y --yes" help="Answer yes to all confirmation prompts" global=#true
|
|
flag --debug help="Set the log level to debug" hide=#true global=#true {
|
|
overrides "--quiet" "--trace" "--verbose" "--silent" "--log-level"
|
|
}
|
|
flag --log-level hide=#true global=#true {
|
|
overrides "--quiet" "--trace" "--verbose" "--silent" "--debug"
|
|
arg <LEVEL> {
|
|
choices {
|
|
choice trace
|
|
choice debug
|
|
choice info
|
|
choice warn {
|
|
alias warning hide=#true
|
|
}
|
|
choice error
|
|
}
|
|
}
|
|
}
|
|
flag --no-config help="Do not load any config files" {
|
|
long_help #"""
|
|
Do not load any config files
|
|
|
|
Same as `MISE_NO_CONFIG=1`.
|
|
"""#
|
|
}
|
|
flag --no-env help="Do not load environment variables from config files" {
|
|
long_help #"""
|
|
Do not load environment variables from config files
|
|
|
|
Same as `MISE_NO_ENV=1`.
|
|
"""#
|
|
}
|
|
flag --no-hooks help="Do not run hooks from config files" {
|
|
long_help #"""
|
|
Do not run hooks from config files
|
|
|
|
Same as `MISE_NO_HOOKS=1`.
|
|
"""#
|
|
}
|
|
flag --no-timings help="Hide the elapsed time printed after each task completes" hide=#true {
|
|
alias "--no-timing" hide=#true
|
|
long_help #"""
|
|
Hide the elapsed time printed after each task completes
|
|
|
|
Set `MISE_TASK_TIMINGS=0` to hide it by default
|
|
"""#
|
|
}
|
|
flag --output help="How task output is displayed when running a task (same as `mise run --output`)" hide=#true {
|
|
arg <OUTPUT>
|
|
}
|
|
flag --raw help="Connect tasks and install commands directly to the terminal" global=#true {
|
|
long_help #"""
|
|
Connect tasks and install commands directly to the terminal
|
|
|
|
Commands then run one at a time. Same as `MISE_RAW=1` or the `raw` setting.
|
|
"""#
|
|
}
|
|
flag --locked help="Require download URLs from the lockfile when installing" global=#true {
|
|
long_help #"""
|
|
Require download URLs from the lockfile when installing
|
|
|
|
Installing fails when the lockfile has no pre-resolved URL for a tool on the current platform, so mise does not call the GitHub or aqua registry APIs to find one. Same as `MISE_LOCKED=1` or the `locked` setting.
|
|
"""#
|
|
}
|
|
flag --silent help="Suppress all task output and mise non-error messages" global=#true {
|
|
overrides "--quiet" "--trace" "--verbose" "--debug" "--log-level"
|
|
}
|
|
flag --timings help="Show the elapsed time after each task completes" hide=#true {
|
|
alias "--timing" hide=#true
|
|
long_help #"""
|
|
Show the elapsed time after each task completes
|
|
|
|
Set `MISE_TASK_TIMINGS=1` to show it by default
|
|
"""#
|
|
}
|
|
flag --trace help="Set the log level to trace" hide=#true global=#true {
|
|
overrides "--quiet" "--silent" "--verbose" "--debug" "--log-level"
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TASK]" help="Task to run" help_long=#"""
|
|
Task to run
|
|
|
|
Shorthand for `mise run <TASK>`.
|
|
"""# required=#false double_dash=automatic
|
|
arg "[TASK_ARGS]…" help="Task arguments" required=#false var=#true hide=#true
|
|
arg "[-- TASK_ARGS_LAST]…" required=#false var=#true hide=#true
|
|
example "mise use node@24" help="Install node 24 and add it to the project's mise.toml"
|
|
example "mise use -g node@24" help="Make node 24 your global default"
|
|
example "mise install" help="Install every tool the config requests"
|
|
example "mise x -- npm install" help="Run a command with the project's tools on PATH"
|
|
example "mise x python@3.13 -- python app.py" help="Run a command with a tool that is not in the config"
|
|
example "mise set NODE_ENV=production" help="Add an environment variable to mise.toml"
|
|
example "mise run build" help="Run the build task"
|
|
example "mise watch build" help="Rerun the build task when its sources change"
|
|
example "mise upgrade --interactive" help="Choose tools to upgrade from a menu"
|
|
example "mise settings color=0" help="Turn off color in the global config"
|
|
complete dir type=dir
|
|
complete alias run="mise alias ls -- {{words[PREV] | shell_quote}} | awk '{print $2}'"
|
|
complete config_file type=file
|
|
complete new_plugin run="mise plugins --all"
|
|
complete installed_tool run="mise ls -i | awk '{print $1}' | uniq"
|
|
complete plugin run="mise plugins --core --user"
|
|
complete prefix run="mise ls-remote -- {{words[PREV] | shell_quote}}"
|
|
complete setting run="mise settings --complete" descriptions=#true
|
|
complete task run="mise tasks ls --complete" descriptions=#true
|
|
complete tool run="mise search --complete -- {{words[CURRENT] | shell_quote}}" descriptions=#true
|
|
complete env_var run="mise set --complete | awk '{print $1\"=\"}'"
|
|
complete env_key run="mise set --complete"
|
|
complete secret run="mise secrets ls --complete"
|
|
complete backend run="mise backends"
|
|
complete bin_name run="mise which --complete"
|
|
complete tool@version run=#"""
|
|
cur={{words[CURRENT] | shell_quote}}
|
|
case $cur in
|
|
*@*)
|
|
tool="$(echo "$cur" | cut -d'@' -f1)"
|
|
prefix="$(echo "$cur" | cut -d'@' -f2)"
|
|
|
|
versions=$(mise ls-remote -- "$tool" ${prefix:+"$prefix"} | sed '1!G;h;$!d')
|
|
|
|
for version in $versions; do
|
|
echo "$tool@$version"
|
|
done
|
|
;;
|
|
*)
|
|
plugins=$(mise search --complete-ids "$cur")
|
|
for plugin in $plugins; do
|
|
echo "$plugin@"
|
|
done
|
|
;;
|
|
esac
|
|
"""#
|
|
complete installed_tool@version run=#"""
|
|
cur={{words[CURRENT] | shell_quote}}
|
|
case $cur in
|
|
*@*)
|
|
tool="$(echo "$cur" | cut -d'@' -f1)"
|
|
prefix="$(echo "$cur" | cut -d'@' -f2)"
|
|
|
|
versions=$(mise ls --installed ${prefix:+--prefix "$prefix"} -- "$tool" | awk '{print $2}' | sed '1!G;h;$!d')
|
|
|
|
for version in $versions; do
|
|
echo "$tool@$version"
|
|
done
|
|
;;
|
|
*)
|
|
plugins=$(mise ls --installed | awk '{print $1}' | uniq | sed '1!G;h;$!d')
|
|
for plugin in $plugins; do
|
|
echo "$plugin@"
|
|
done
|
|
;;
|
|
esac
|
|
"""#
|
|
cmd activate help="Print the script to activate mise in an interactive shell" effect=read {
|
|
long_help #"""
|
|
Print the script to activate mise in an interactive shell
|
|
|
|
Evaluate this command's output with the syntax for your shell; running it alone
|
|
only prints the script. Activation updates tools and environment variables as
|
|
this shell changes directories.
|
|
|
|
Add the matching example below once to your interactive startup file:
|
|
~/.bashrc for Bash, ~/.zshrc for Zsh, ~/.config/fish/config.fish for Fish,
|
|
or $PROFILE for PowerShell. For Nushell, Elvish and other shells, see
|
|
https://mise.jdx.dev/shell-setup.html.
|
|
|
|
The mise executable must be on PATH before that line runs. Otherwise use its
|
|
absolute path, for example `eval "$(~/.local/bin/mise activate zsh)"`.
|
|
|
|
Use `mise exec -- command` for scripts and CI that do not need interactive hooks.
|
|
The `status.*` settings control the messages mise prints when you change
|
|
directories.
|
|
"""#
|
|
flag "-q --quiet" help="Suppress non-error messages from the hook that runs at each prompt"
|
|
flag "-s --shell" help="Shell type to generate the script for" hide=#true {
|
|
arg <SHELL> {
|
|
choices {
|
|
choice bash
|
|
choice elvish
|
|
choice fish
|
|
choice nu
|
|
choice xonsh
|
|
choice zsh
|
|
choice pwsh {
|
|
alias powershell
|
|
}
|
|
}
|
|
}
|
|
}
|
|
flag --no-hook-env help="Do not run hook-env automatically" {
|
|
long_help #"""
|
|
Do not run hook-env automatically
|
|
|
|
Use it for debugging: after `eval "$(mise activate zsh --no-hook-env)"`, run `mise hook-env` yourself to print the shell code it would evaluate, or `mise hook-env --trace` for more detail.
|
|
"""#
|
|
}
|
|
flag --shims help="Put the shims directory on PATH instead of updating PATH at each prompt" {
|
|
long_help #"""
|
|
Put the shims directory on PATH instead of updating PATH at each prompt
|
|
|
|
Roughly equivalent to:
|
|
|
|
PATH="$HOME/.local/share/mise/shims:$PATH"
|
|
|
|
Shims do not support every feature of `mise activate`; see
|
|
https://mise.jdx.dev/dev-tools/shims.html#shims-vs-path.
|
|
"""#
|
|
}
|
|
flag --status help="Show \"mise: <TOOL>@<VERSION>\" message when changing directories" hide=#true
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[SHELL_TYPE]" help="Shell type to generate the script for" help_long=#"""
|
|
Shell type to generate the script for
|
|
|
|
Defaults to the shell named by MISE_SHELL or SHELL. mise reports an error when neither names a supported shell, as in PowerShell and cmd on Windows.
|
|
"""# required=#false {
|
|
choices {
|
|
choice bash
|
|
choice elvish
|
|
choice fish
|
|
choice nu
|
|
choice xonsh
|
|
choice zsh
|
|
choice pwsh {
|
|
alias powershell
|
|
}
|
|
}
|
|
}
|
|
example "eval \"$(mise activate bash)\"" help="Activate mise in Bash"
|
|
example "eval \"$(mise activate zsh)\"" help="Activate mise in Zsh"
|
|
example "mise activate fish | source" help="Activate mise in Fish"
|
|
example "execx($(mise activate xonsh))" help="Activate mise in Xonsh"
|
|
example "(&mise activate pwsh) | Out-String | Invoke-Expression" help="Activate mise in PowerShell"
|
|
}
|
|
cmd tool-alias help="Manage tool backend and version aliases" effect=read {
|
|
alias alias aliases
|
|
long_help #"""
|
|
Manage tool backend and version aliases
|
|
|
|
A backend alias makes a tool name install from another backend:
|
|
`[tool_alias] ripgrep = "aqua:BurntSushi/ripgrep"`. A version alias names a
|
|
version request: `[tool_alias.node.versions] project = "20"` lets you write
|
|
`node@project`.
|
|
|
|
With no subcommand, lists version aliases (same as `mise tool-alias ls`; the
|
|
flags below are passed to it). See https://mise.jdx.dev/dev-tools/aliases.html
|
|
"""#
|
|
flag "-p --tool" help="Filter aliases by tool" {
|
|
alias "--plugin" hide=#true
|
|
arg <TOOL>
|
|
}
|
|
flag --no-header help="Do not print the table header"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd get help="Show the version a tool's version alias stands for" effect=read {
|
|
long_help #"""
|
|
Show the version a tool's version alias stands for
|
|
|
|
Reads `[tool_alias.TOOL.versions]` from every loaded config file and the
|
|
aliases the tool's backend provides, such as node's `lts-*` aliases. It
|
|
prints the stored request, which may itself be a prefix.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <TOOL> help="The tool to show the alias for"
|
|
arg <ALIAS> help="The alias to show"
|
|
example #"""
|
|
mise tool-alias get node lts
|
|
24
|
|
"""# help="Show the version node's lts alias stands for"
|
|
example #"""
|
|
mise tool-alias set node project 20
|
|
mise tool-alias get node project
|
|
20
|
|
"""# help="Read back an alias you set"
|
|
}
|
|
cmd ls help="List tool version aliases" effect=read {
|
|
alias list
|
|
long_help #"""
|
|
List tool version aliases
|
|
|
|
Lists version aliases from `[tool_alias.<tool>.versions]` in any loaded
|
|
config file and the aliases that tool backends provide, such as node's
|
|
`lts-*` names or an asdf plugin's `bin/list-aliases`. For example:
|
|
|
|
[tool_alias.node.versions]
|
|
project = "20"
|
|
|
|
Backend aliases (`[tool_alias] tool = "backend"`) are not listed; run
|
|
`mise tool <TOOL>` to see the backend a tool uses.
|
|
"""#
|
|
flag --no-header help="Do not print the table header"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TOOL]" help="Only show aliases for this tool" required=#false
|
|
example #"""
|
|
mise tool-alias ls node
|
|
tool alias version
|
|
node lts 24
|
|
node lts-jod 22
|
|
node project 20
|
|
"""# help="List node's version aliases"
|
|
}
|
|
cmd set help="Set a backend alias or a version alias in the global config" effect=write {
|
|
alias add create
|
|
long_help #"""
|
|
Set a backend alias or a version alias in the global config
|
|
|
|
`mise tool-alias set TOOL BACKEND` makes TOOL install from BACKEND, written as
|
|
`[tool_alias] TOOL = "BACKEND"`. `mise tool-alias set TOOL ALIAS VERSION` makes
|
|
`TOOL@ALIAS` mean VERSION, written under `[tool_alias.TOOL.versions]`. Writes
|
|
the global config (~/.config/mise/config.toml by default); add aliases to a
|
|
project's mise.toml to share them.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <TOOL> help="The tool to alias"
|
|
arg <ALIAS> help="The version alias to set, or the backend when VALUE is omitted"
|
|
arg "[VALUE]" help="The version request the alias stands for" required=#false
|
|
example "mise tool-alias set ripgrep aqua:BurntSushi/ripgrep" help="Install ripgrep from its aqua backend"
|
|
example "mise tool-alias set node project 20" help="Make node@project mean node@20"
|
|
}
|
|
cmd unset help="Remove a backend alias or a version alias from the global config" effect=write {
|
|
alias rm remove delete del
|
|
long_help #"""
|
|
Remove a backend alias or a version alias from the global config
|
|
|
|
With only TOOL, removes the tool's backend alias. With TOOL and ALIAS,
|
|
removes that version alias. Edits the global config
|
|
(~/.config/mise/config.toml by default).
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <TOOL> help="The tool to remove the alias from"
|
|
arg "[ALIAS]" help="The version alias to remove; omit it to remove the backend alias" required=#false
|
|
example "mise tool-alias unset ripgrep" help="Remove ripgrep's backend alias"
|
|
example "mise tool-alias unset node project" help="Remove node's project version alias"
|
|
}
|
|
}
|
|
cmd __tool-update hide=#true help="Update globally configured tools for `auto_update`." effect=write {
|
|
long_help #"""
|
|
Update globally configured tools for `auto_update`.
|
|
|
|
With a tool, upgrade it within its global config request. A shim or
|
|
`mise x` runs this before launching a tool whose check is due. Updates run
|
|
one at a time.
|
|
|
|
With `--watch`, run as the `tool-update` service: check every opted-in tool
|
|
once an hour and update the ones that are due. Declare the service with:
|
|
|
|
[bootstrap.services.mise-tool-update]
|
|
builtin = "tool-update"
|
|
"""#
|
|
flag --watch help="Run until stopped, updating due tools once an hour" conflicts=TOOL
|
|
flag --due help="Update every opted-in tool that is due, once (one `--watch` pass)" hide=#true conflicts=TOOL
|
|
flag --id help="The tool id the launch claimed the check under; the result is recorded there, so `mise doctor` finds it under the same id" hide=#true {
|
|
arg <ID>
|
|
}
|
|
flag --background help="Started detached from a shell prompt: stop the update if it runs longer than a service pass may" hide=#true {
|
|
conflicts "--watch" "--due"
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TOOL]" required=#false
|
|
}
|
|
cmd asdf hide=#true help="[internal] simulates asdf for plugins that call \"asdf\" internally" {
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[ARGS]…" help="all arguments" required=#false double_dash=automatic var=#true
|
|
complete args type=command_args
|
|
}
|
|
cmd backends help="Manage backends" effect=read {
|
|
alias b backend backend-list
|
|
long_help #"""
|
|
Manage backends
|
|
|
|
A backend is where mise installs a tool from: a package registry such as npm or
|
|
cargo, a release host such as GitHub, or a plugin. Each tool uses one, either
|
|
written as a prefix (`npm:prettier`) or chosen by the registry. With no
|
|
subcommand, lists the built-in backends. See
|
|
https://mise.jdx.dev/dev-tools/backends/.
|
|
"""#
|
|
after_long_help "\u{1b}[1m\u{1b}[4mDeprecation:\u{1b}[22m\u{1b}[24m\n\nThe `mise b` alias is deprecated and will be removed in mise 2027.4.0; use\n`mise backends`.\n"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd ls help="List built-in backends" effect=read {
|
|
alias list
|
|
long_help #"""
|
|
List built-in backends
|
|
|
|
Backends that plugins add are listed by `mise plugins ls`.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise backends ls" help="List the backends built into mise"
|
|
}
|
|
cmd switch help="Switch tools to the backend the registry now installs them from" effect=write {
|
|
long_help #"""
|
|
Switch tools to the backend the registry now installs them from
|
|
|
|
When the registry moves a tool to another backend, mise keeps installing it
|
|
from the backend recorded in mise.lock and warns that the registry has a
|
|
newer one. This moves those lock entries to the registry's backend at the
|
|
same versions, relocks them to record the new backend's checksums and URLs,
|
|
and reinstalls installed versions so they come from the new backend.
|
|
|
|
It covers the lockfiles `mise lock` writes: the current project's, or the
|
|
global config's with `--global`.
|
|
"""#
|
|
flag "-n --dry-run" help="Show what would switch without changing the lockfile or installs"
|
|
flag "-g --global" help="Switch tools in the global config's lockfile instead of the project's"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TOOL@VERSION]…" help="Tools to switch" help_long=#"""
|
|
Tools to switch
|
|
|
|
Defaults to every configured tool whose locked backend the registry
|
|
has replaced. A version (`hk@1.58.1`) limits the switch to that version.
|
|
"""# required=#false var=#true
|
|
example "mise backends switch communique" help="Move communique to the registry's current backend"
|
|
example "mise backends switch --dry-run" help="List every locked tool the registry now installs from another backend"
|
|
}
|
|
}
|
|
cmd bin-paths help="List the bin directories of the active tools" effect=read {
|
|
long_help #"""
|
|
List the bin directories of the active tools
|
|
|
|
Prints the bin directories of the tool versions the current config selects. It
|
|
does not include `_.path` entries from [env]; `mise doctor path` lists everything
|
|
mise adds to PATH.
|
|
"""#
|
|
flag --bin-names help="Print executable names instead of bin directories"
|
|
flag "-J --json" help="Print executables as JSON objects with `name`, `path`, and `symlink` (implies --bin-names)"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TOOL@VERSION]…" help="Only list these tools, such as `ruby@3`" required=#false var=#true
|
|
example "mise bin-paths" help="Print the bin directory of every active tool"
|
|
example "mise bin-paths node" help="Print only node's bin directory"
|
|
example "mise bin-paths --bin-names" help="List the executables the active tools provide"
|
|
}
|
|
cmd bootstrap help="Set up this machine from your mise config" effect=destructive {
|
|
alias bs
|
|
long_help #"""
|
|
Set up this machine from your mise config
|
|
|
|
Applies each part your config declares, in this order. Each step names its
|
|
parts as `--only` and `--skip` accept them, followed by any condition.
|
|
|
|
1. `accounts`, then `plugins` (package manager plugins)
|
|
2. `files` with `phase = "pre-packages"`, then built-in `packages`
|
|
3. The remaining `files`, then `services`, `firewall`, and `compose`
|
|
4. `repos`, then `dotfiles`
|
|
5. `mise-shell-activate`, `macos-defaults`, and `macos-launchd-agents`
|
|
6. `linux-systemd-units`, then `user` (the login shell)
|
|
7. `tools`
|
|
8. Plugin `packages`, then user `services` with `requires_tools = true`
|
|
9. `task` (the `bootstrap` task, if defined), then `final-hook`
|
|
|
|
Hooks run before and after packages, repos, dotfiles, macOS defaults, the
|
|
login shell, and tools. The post-packages hook runs right after built-in
|
|
packages, or after plugin packages when any are configured. See
|
|
https://mise.jdx.dev/bootstrap.html#how-it-runs.
|
|
|
|
Parts that already match the config are left alone, but hooks and the
|
|
`bootstrap` task run every time, so make them safe to repeat. Checking
|
|
dotfile state can render templates, which may run `exec()`.
|
|
|
|
Preview with `--dry-run`. To inspect without applying, use
|
|
`mise bootstrap status` for current state or `mise bootstrap plan` for
|
|
resource-level changes.
|
|
"""#
|
|
flag --from help="Clone a bootstrap project (a Git repository with a mise.toml) and apply it" {
|
|
long_help #"""
|
|
Clone a bootstrap project (a Git repository with a mise.toml) and apply it
|
|
|
|
The checkout is reused on later runs; add `--update` to fast-forward it first. Append `?ref=<branch|tag|commit>` to check out a ref instead of the default branch, for example `https://github.com/example/workstation.git?ref=v1`. See https://mise.jdx.dev/bootstrap/from-repository.html.
|
|
"""#
|
|
arg <GIT_URL>
|
|
}
|
|
flag --adopt help="Clone a repository of global mise config or dotfile history, then apply it" conflicts=--from {
|
|
long_help #"""
|
|
Clone a repository of global mise config or dotfile history, then apply it
|
|
|
|
A repository of global config (`config.toml`, `conf.d/`, `tasks/`) is cloned into the global config directory, normally ~/.config/mise. A setup repository shared with `mise dotfiles origin set` restores its tracked files instead. `OWNER/REPO` is short for `https://github.com/OWNER/REPO.git`. Append `?ref=<branch>` to adopt a branch other than the default branch.
|
|
"""#
|
|
arg "<GIT_URL|OWNER/REPO>"
|
|
}
|
|
flag --replace-history help="Discard this machine's dotfile history and adopt the repository's" requires=--adopt {
|
|
long_help #"""
|
|
Discard this machine's dotfile history and adopt the repository's
|
|
|
|
Use it with `--adopt` when the two histories are unrelated. Files that differ from the repository still stop the adoption until you resolve them, or add `--take-remote-all` to take the repository's version of each.
|
|
"""#
|
|
}
|
|
flag --take-remote-all help="Take the setup repository's version of every existing file that differs while adopting" requires=--adopt {
|
|
long_help #"""
|
|
Take the setup repository's version of every existing file that differs while adopting
|
|
|
|
The replaced versions are saved first, so `mise dot undo` restores them.
|
|
"""#
|
|
}
|
|
flag --from-dir help="Directory for the `--from` checkout (default: `$MISE_DATA_DIR/bootstrap-repo`)" requires=--from {
|
|
arg <DIR>
|
|
}
|
|
flag --config-dir help="Link the global config directory to this directory of the `--from` checkout" requires=--from {
|
|
long_help #"""
|
|
Link the global config directory to this directory of the `--from` checkout
|
|
|
|
mise links its config directory, normally ~/.config/mise, to the directory, then bootstraps from it, so its `config.toml`, `config.<env>.toml`, `conf.d/`, and `miserc.toml` are the global config from this run on. The directory must exist in the checkout, and the path to it is relative to the checkout and must stay inside it; `.` is the checkout itself. mise's config directory, where the link goes, must be missing, empty, or already this link. See https://mise.jdx.dev/bootstrap/from-repository.html#global-config-elsewhere.
|
|
"""#
|
|
arg <DIR>
|
|
}
|
|
flag "-n --dry-run" help="Show what would change without changing anything" {
|
|
long_help #"""
|
|
Show what would change without changing anything
|
|
|
|
Hooks and the `bootstrap` task are printed instead of run.
|
|
"""#
|
|
}
|
|
flag "-y --yes" help="Skip confirmation prompts"
|
|
flag --skip-dirty help="Skip configured repositories with local changes instead of failing"
|
|
flag --force-dotfiles help="Overwrite existing files that conflict with whole-file dotfile entries"
|
|
flag --prune-dotfiles help="Remove files that dotfile groups deployed but no active entry deploys now" {
|
|
long_help #"""
|
|
Remove files that dotfile groups deployed but no active entry deploys now
|
|
|
|
The same pruning as `mise dot apply --prune`, run at the end of the dotfiles phase before its post hook: files of a group that is no longer selected or declared, and files a group stopped deploying because of a new `exclude` or a deleted source. Changed copies stay in place, and mise asks before removing anything unless `--yes` is given or there is no terminal. With `--dry-run`, nothing is removed.
|
|
"""#
|
|
}
|
|
flag --only help="Run only these parts" var=#true conflicts=--skip {
|
|
long_help #"""
|
|
Run only these parts
|
|
|
|
Repeat the flag or separate parts with commas. Cannot be combined with `--skip`.
|
|
"""#
|
|
arg <PART> delimiter=, {
|
|
choices {
|
|
choice plugins
|
|
choice packages
|
|
choice accounts
|
|
choice files
|
|
choice services
|
|
choice firewall
|
|
choice compose
|
|
choice repos
|
|
choice dotfiles
|
|
choice mise-shell-activate {
|
|
alias shell hide=#true
|
|
}
|
|
choice macos-defaults {
|
|
alias defaults hide=#true
|
|
}
|
|
choice macos-launchd-agents {
|
|
alias launchd hide=#true
|
|
}
|
|
choice linux-systemd-units {
|
|
alias systemd hide=#true
|
|
}
|
|
choice user
|
|
choice tools
|
|
choice task
|
|
choice final-hook
|
|
}
|
|
}
|
|
}
|
|
flag --prompt-secrets help="Prompt securely for missing bootstrap secret inputs"
|
|
flag --prompt-vars help="Ask for `[vars]` entries that declare a `prompt` and have no saved answer" {
|
|
long_help #"""
|
|
Ask for `[vars]` entries that declare a `prompt` and have no saved answer
|
|
|
|
mise saves each answer under `$MISE_STATE_DIR`, not in any config file, and never asks for it again. Without a terminal, a var keeps its default. A `--dry-run` still saves the answers it asks for.
|
|
"""#
|
|
}
|
|
flag --skip help="Skip these parts" var=#true {
|
|
long_help #"""
|
|
Skip these parts
|
|
|
|
Repeat the flag or separate parts with commas. Cannot be combined with `--only`.
|
|
"""#
|
|
arg <PART> delimiter=, {
|
|
choices {
|
|
choice plugins
|
|
choice packages
|
|
choice accounts
|
|
choice files
|
|
choice services
|
|
choice firewall
|
|
choice compose
|
|
choice repos
|
|
choice dotfiles
|
|
choice mise-shell-activate {
|
|
alias shell hide=#true
|
|
}
|
|
choice macos-defaults {
|
|
alias defaults hide=#true
|
|
}
|
|
choice macos-launchd-agents {
|
|
alias launchd hide=#true
|
|
}
|
|
choice linux-systemd-units {
|
|
alias systemd hide=#true
|
|
}
|
|
choice user
|
|
choice tools
|
|
choice task
|
|
choice final-hook
|
|
}
|
|
}
|
|
}
|
|
flag --update help="Refresh package metadata and update repositories before applying" {
|
|
long_help #"""
|
|
Refresh package metadata and update repositories before applying
|
|
|
|
Also fast-forwards a checkout that `--from` or `--adopt` reuses. Without `--update`, a reused checkout stays at its current commit.
|
|
"""#
|
|
}
|
|
flag --upgrade help="Upgrade installed packages and tools as well as installing missing ones" {
|
|
long_help #"""
|
|
Upgrade installed packages and tools as well as installing missing ones
|
|
|
|
In the packages phase, runs the equivalent of `mise bootstrap packages upgrade` after installing; in the tools phase, runs `mise upgrade` (without `--bump`) after installing. Package pins and tool version ranges are respected. Does not update mise itself, repositories, or container images, and does not restart services; see `--update` for repositories and `mise self-update` for mise.
|
|
"""#
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd __apply-account-plan hide=#true effect=destructive {
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
cmd __apply-service-plan hide=#true effect=destructive {
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
cmd __apply-firewall-plan hide=#true effect=destructive {
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
cmd __apply-system-plan hide=#true effect=destructive {
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
cmd __inspect-system-files hide=#true effect=read {
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
cmd __inspect-firewall-plan hide=#true effect=read {
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
cmd __service-exec hide=#true help="Run a user service that carries an environment (Windows, internal)" {
|
|
long_help #"""
|
|
Run a user service that carries an environment (Windows, internal)
|
|
|
|
Task Scheduler's task XML has no environment block, so a service that
|
|
sets `environment` registers this as its action instead of naming its
|
|
program directly. It applies the stored environment, starts the service,
|
|
and stays for its lifetime as the process Task Scheduler tracks.
|
|
"""#
|
|
flag --launch help="The stored launch to run it from" required=#true {
|
|
arg <PATH>
|
|
}
|
|
flag --digest help="The digest of the launch the task was registered with" required=#true {
|
|
arg <HASH>
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <NAME> help="The user service to run"
|
|
}
|
|
cmd accounts subcommand_required=#true help="Manage Linux users and groups" effect=read {
|
|
long_help #"""
|
|
Manage Linux users and groups
|
|
|
|
Creates, updates, or removes the local accounts declared in
|
|
`[bootstrap.users]` and `[bootstrap.groups]` on Linux. Run `status` or
|
|
`apply --dry-run` before changing user IDs, group memberships, or account
|
|
state.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd apply help="Create, update, or remove the configured Linux users and groups" effect=destructive {
|
|
flag "-n --dry-run" help="Show what would change without changing anything"
|
|
flag "-y --yes" help="Skip the confirmation prompt"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
cmd status help="Show the state of the configured Linux users and groups" effect=read {
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --missing help="Exit with status 1 if any account differs from the config (all are still listed)"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
}
|
|
cmd config-roots hide=#true help="Show non-composed bootstrap declarations in each selected configuration root (deprecated)" effect=read {
|
|
long_help #"""
|
|
Show non-composed bootstrap declarations in each selected configuration root (deprecated)
|
|
|
|
Use this to locate the origin of declarations before composition. For the
|
|
combined desired state and its changes, use `mise bootstrap plan`.
|
|
"""#
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
cmd compose subcommand_required=#true help="Manage Docker Compose projects from `[bootstrap.compose]`" effect=read {
|
|
long_help #"""
|
|
Manage Docker Compose projects from `[bootstrap.compose]`
|
|
|
|
Needs a running Docker engine and the Docker Compose command on this
|
|
machine.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd apply help="Apply Docker Compose projects from `[bootstrap.compose]`" effect=destructive {
|
|
flag "-n --dry-run" help="Show what would change without changing anything"
|
|
flag "-y --yes" help="Skip the confirmation prompt"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
cmd status help="Show the state of Docker Compose projects from `[bootstrap.compose]`" effect=read {
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --missing help="Exit with status 1 if any Compose project differs from the config (all are still listed)"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
example "mise bootstrap compose status" help="Show the state of every declared project"
|
|
example "mise bootstrap compose apply --dry-run" help="Show what would change"
|
|
}
|
|
cmd dotfiles hide=#true subcommand_required=#true help="Deploy, track, and sync dotfiles" effect=read {
|
|
long_help #"""
|
|
Deploy, track, and sync dotfiles
|
|
|
|
A `[dotfiles]` entry deploys a file (from a source with `symlink`, `symlink-each`, `copy`, or `template`, or from inline `content`), removes one (`mode = "absent"`), sets an existing path's `permissions`, edits part of a file, or tracks a live file where it is (`mode = "track"`). mise saves tracked files to a local Git history that you can browse and roll back, and syncs it with other machines through an origin repository. `mise dot` is a shorter alias.
|
|
|
|
Deploy files with `add`, `apply`, `diff`, `status`, and `unapply`. Track and restore files with `track`, `save`, `history`, `rollback`, and `undo`. Sync them with `origin`, `sync`, and `pull`.
|
|
|
|
See https://mise.jdx.dev/dotfiles.html and https://mise.jdx.dev/dotfiles/history.html
|
|
"""#
|
|
flag --local help="Work on this machine's local-only history (`mode = \"track-local\"`), which is never shared"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd add help="Start deploying a file, or copy its edits back to the source" effect=write {
|
|
long_help #"""
|
|
Start deploying a file, or copy its edits back to the source
|
|
|
|
For a target that is not managed yet, saves its contents as a source under `dotfiles.root` (or at the path given with `--source`), adds a `[dotfiles]` entry, and applies it unless you pass `--no-apply`. For a target that is already managed, updates its source from the live file. `--dry-run` previews the source and config changes without writing them.
|
|
|
|
A target inside the tree of a dotfile group is captured into that group's source instead, without a new `[dotfiles]` entry: the deepest group whose target contains it, or the one named with `--group`.
|
|
"""#
|
|
flag --changed help="Update the sources of every changed file managed in copy mode"
|
|
flag "-f --force" help="Overwrite existing sources without prompting"
|
|
flag "-g --global" help="Write to the global config (the default)" {
|
|
long_help #"""
|
|
Write to the global config (the default)
|
|
|
|
New entries go to the `write_targets.dotfiles` file when that setting is set.
|
|
"""#
|
|
conflicts "--local" "--path"
|
|
}
|
|
flag "-l --local" help="Write to the project config instead of the global config" {
|
|
conflicts "--global" "--path"
|
|
}
|
|
flag "-m --mode" help="Mode for a target that is not managed yet: symlink, symlink-each, copy, or template (default: the `dotfiles.default_mode` setting)" {
|
|
long_help #"""
|
|
Mode for a target that is not managed yet: symlink, symlink-each, copy, or template (default: the `dotfiles.default_mode` setting)
|
|
|
|
A target that is already managed keeps its mode.
|
|
"""#
|
|
arg <MODE>
|
|
}
|
|
flag "-n --dry-run" help="Print the config and source changes without writing anything"
|
|
flag --no-apply help="Add the entry without applying it"
|
|
flag "-p --path" help="Write to this config file or directory" {
|
|
conflicts "--global" "--local"
|
|
arg <PATH>
|
|
}
|
|
flag "-s --source" help="Source path to use for a single target" {
|
|
long_help #"""
|
|
Source path to use for a single target
|
|
|
|
A relative path starts from the current directory. The entry records it relative to the config file's directory when it lies inside it, and as an absolute path otherwise.
|
|
"""#
|
|
arg <PATH>
|
|
}
|
|
flag "-y --yes" help="Skip the confirmation prompt"
|
|
flag --prompt-secrets help="Prompt for `[bootstrap.secrets]` values that templates need and the environment does not set"
|
|
flag --group help="Capture into the tree of this dotfile group" conflicts=--source {
|
|
arg <NAME>
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TARGET]…" help="Targets to add or update" required=#false var=#true
|
|
example "mise dot add ~/.zshrc" help="Start managing ~/.zshrc from your dotfiles directory"
|
|
example "mise dot add --mode copy ~/.config/starship.toml" help="Copy the file into place instead of symlinking it"
|
|
example "mise dot add --source dotfiles/gitconfig ~/.gitconfig" help="Choose where the source is stored"
|
|
example "mise dot add --group home ~/.config/starship.toml" help="Capture the file into a dotfile group's tree"
|
|
example "mise dot add --changed" help="Copy edits of every changed copy-mode file back to its source"
|
|
}
|
|
cmd apply help="Link, copy, and render `[dotfiles]` entries into place" effect=destructive {
|
|
long_help #"""
|
|
Link, copy, and render `[dotfiles]` entries into place
|
|
|
|
Applies the whole-file entries and edits that are not in their desired state. Whole-file entries symlink, copy, render templates, write inline `content`, set `permissions`, or remove targets declared `mode = "absent"`. Edit entries manage a marker-delimited block, a single line, or merged keys in a file mise does not otherwise own.
|
|
|
|
Entries that deploy mise's own configuration are applied first and the configuration is read again, so a rule the new file adds applies in the same run.
|
|
|
|
`apply` works from the files on this machine. It never fetches or pulls: to bring in changes from other machines, run `mise dot sync`, `mise dot pull`, then `mise dot apply`.
|
|
|
|
The `pre-dotfiles` and `post-dotfiles` bootstrap hooks run before and after the apply (with `--dry-run` they are printed, not run), and the matching `[history.reload]` commands run for the targets it wrote.
|
|
|
|
With `--prune`, also removes files that dotfile groups deployed but no active entry deploys now: files of a group that is no longer selected or declared, and files a group stopped deploying because of a new `exclude` or a deleted source.
|
|
"""#
|
|
flag "-f --force" help="Overwrite existing files that conflict with whole-file dotfile entries"
|
|
flag "-n --dry-run" help="Print the actions that would run without writing anything"
|
|
flag "-y --yes" help="Skip the confirmation prompt"
|
|
flag --prune help="Also remove files that dotfile groups deployed but no active entry deploys now"
|
|
flag --prompt-secrets help="Prompt for `[bootstrap.secrets]` values that templates need and the environment does not set"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TARGET]…" help="Only apply these targets" required=#false var=#true
|
|
example "mise dot apply" help="Deploy every entry that is out of date"
|
|
example "mise dot apply --dry-run" help="Print what would change"
|
|
example "mise dot apply --prune" help="Also remove files left by dotfile groups"
|
|
example "mise dot apply --force --yes" help="Overwrite conflicting files without prompting"
|
|
}
|
|
cmd capture help="Run a command and save tracked files before and after it" {
|
|
long_help #"""
|
|
Run a command and save tracked files before and after it
|
|
|
|
Runs the command with your terminal and environment and saves a checkpoint before and after it, even when the command fails or changes nothing, so `mise dot undo` can reverse what it did to your tracked files. Edits you make while it runs are part of the same operation. Packages, services, and other system changes are not recorded and cannot be undone. If saving fails, mise warns and still exits with the command's status.
|
|
"""#
|
|
flag --label help="Describe this operation in history" {
|
|
arg <LABEL>
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "<-- COMMAND>…" help="Command and arguments to run, after --" var=#true
|
|
example "mise dot capture -- brew upgrade" help="Record what an upgrade changes"
|
|
example "mise dot capture --label \"theme switch\" -- ./switch-theme.sh" help="Label the operation in history"
|
|
}
|
|
cmd conflicts help="Compare both sides of a sync conflict" effect=read {
|
|
long_help #"""
|
|
Compare both sides of a sync conflict
|
|
|
|
Prints a unified diff from this machine's saved version to the version fetched from the origin. `--difftool` opens the comparison in Git's configured diff tool; when `diff.tool` is unset, Git falls back to `merge.tool`. This command changes neither side. Resolve a conflict with `mise dot pull --take-remote` or `--keep-local`.
|
|
"""#
|
|
flag --difftool help="Open the comparison in Git's configured diff or merge tool"
|
|
flag --tool help="Use this Git diff tool instead of the configured default" requires=--difftool {
|
|
arg <TOOL>
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[PATH]…" help="Only inspect these conflicted paths" required=#false var=#true
|
|
example "mise dot conflicts" help="Show every conflict"
|
|
example "mise dot conflicts ~/.zshrc" help="Show one conflicted file"
|
|
example "mise dot conflicts --difftool ~/.zshrc" help="Open the comparison in Git's diff tool"
|
|
example "mise dot conflicts --difftool --tool meld ~/.zshrc" help="Use a specific diff tool"
|
|
}
|
|
cmd diff help="Show what `mise dot apply` would change" effect=read {
|
|
long_help #"""
|
|
Show what `mise dot apply` would change
|
|
|
|
Prints a unified diff for every whole-file entry and edit that `mise dot apply` would change. Templates are rendered first, so trusted template functions may run. Tracked entries have nothing to apply; use `mise dot history diff` to see their unsaved changes.
|
|
"""#
|
|
flag --prompt-secrets help="Prompt for `[bootstrap.secrets]` values that templates need and the environment does not set"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TARGET]…" help="Only show these targets" required=#false var=#true
|
|
example "mise dot diff" help="Show every pending change"
|
|
example "mise dot diff ~/.zshrc" help="Show the change for one target"
|
|
}
|
|
cmd edit help="Open a dotfile's source in your editor" effect=write {
|
|
long_help #"""
|
|
Open a dotfile's source in your editor
|
|
|
|
Opens the file that defines TARGET in `$VISUAL` or `$EDITOR`: the source for symlink, copy, and template entries; the file itself for tracked and permissions-only entries; and the declaring config for inline `content`, `absent` entries, and edits without a source file.
|
|
|
|
An unmanaged target is first added to the global `[dotfiles]`, as `mise dot add --no-apply` would add it, after a prompt that `--yes` skips. Without a terminal, an unmanaged target needs `--yes`. With `--apply`, applies the target after the editor exits.
|
|
"""#
|
|
flag --apply help="Apply this target after the editor exits"
|
|
flag "-m --mode" help="Mode to use if the target is not managed yet: symlink, symlink-each, copy, or template (default: the `dotfiles.default_mode` setting)" {
|
|
arg <MODE>
|
|
}
|
|
flag "-s --source" help="Source path to use if the target is not yet managed" {
|
|
arg <PATH>
|
|
}
|
|
flag "-y --yes" help="Skip the confirmation prompt when adding an unmanaged target"
|
|
flag --group help="Dotfile group whose tree holds the target, when several groups deploy into its directory" conflicts=--source {
|
|
arg <NAME>
|
|
}
|
|
flag --prompt-secrets help="Prompt for `[bootstrap.secrets]` values that templates need and the environment does not set"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <TARGET> help="Target to edit"
|
|
example "mise dot edit ~/.zshrc" help="Edit the source of ~/.zshrc"
|
|
example "mise dot edit --apply ~/.config/starship.toml" help="Edit the source, then deploy it"
|
|
}
|
|
cmd exclude help="Never save paths matching a glob" effect=write {
|
|
long_help #"""
|
|
Never save paths matching a glob
|
|
|
|
Adds a glob to `[history] exclude` in the global config. The rule applies to every tracked path. Quote the glob so your shell does not expand it.
|
|
|
|
Use exclusions for logs, caches, databases, and session state. For files you want to save only on demand, track them with `mise dot track --no-autosave` instead. To limit what one tracked directory saves, edit the `exclude` or `include` list of its `[dotfiles]` entry.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <GLOB> help="A glob such as `~/.config/hypr/plugins/**`"
|
|
example "mise dot exclude '~/.codex/sessions/**'" help="Never save Codex session logs"
|
|
}
|
|
cmd history help="Browse saved versions of your tracked files" effect=read {
|
|
long_help #"""
|
|
Browse saved versions of your tracked files
|
|
|
|
A checkpoint is a saved version of every `[dotfiles]` entry with `mode = "track"`. `mise dot save`, the watcher, and every command that changes tracked files (such as `mise bootstrap`, `mise dot apply`, `rollback`, `pull`, and `undo`) record one. Checkpoints hold file contents only, not packages or services. Files deployed in other modes are saved only if you also track them. With no subcommand, lists checkpoints newest first.
|
|
|
|
See https://mise.jdx.dev/dotfiles/history.html
|
|
"""#
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag "-n --limit" help="Show at most this many checkpoints (0 for all)" default="20" {
|
|
arg <LIMIT>
|
|
}
|
|
flag --path help="Only checkpoints where this path (or something under it) changed" {
|
|
arg <PATH>
|
|
}
|
|
flag --trigger help="Only checkpoints with this trigger, such as edit, save, agent, bootstrap, apply, rollback, or undo" {
|
|
long_help #"""
|
|
Only checkpoints with this trigger, such as edit, save, agent, bootstrap, apply, rollback, or undo
|
|
|
|
`bootstrap` covers `mise bootstrap`, its `packages` commands, and `mise dot add`, `apply`, `edit`, and `unapply`. `apply` covers incoming changes written by `mise dot pull` or the watcher.
|
|
"""#
|
|
arg <TRIGGER>
|
|
}
|
|
flag --label help="Only checkpoints with this label" {
|
|
arg <LABEL>
|
|
}
|
|
flag --pending help="Only checkpoints recorded by operations that did not finish"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd describe help="Set the description of a checkpoint" effect=write {
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <REF> help="Numeric checkpoint ID, `latest`, `latest~N`, or `commit:<sha>`"
|
|
arg <TEXT> help="The new description"
|
|
example "mise dot history describe latest \"before the theme change\"" help="Describe the newest checkpoint"
|
|
}
|
|
cmd diff help="Compare checkpoints, or your files against one" effect=read {
|
|
long_help #"""
|
|
Compare checkpoints, or your files against one
|
|
|
|
Without arguments, shows unsaved changes: the files on disk against the latest checkpoint. With one reference, shows what that checkpoint changed since the one before it. With two, compares them.
|
|
"""#
|
|
flag --operation help="Compare an operation with the checkpoint it saved before it ran" {
|
|
long_help #"""
|
|
Compare an operation with the checkpoint it saved before it ran
|
|
|
|
With no reference, uses the newest operation, ignoring later saves. With one reference, uses that operation. Fails if the operation's earlier checkpoint is unavailable instead of comparing an unrelated save.
|
|
"""#
|
|
}
|
|
flag "-p --patch" help="Print the full patch instead of a per-file summary"
|
|
flag --path help="Restrict to one path (a file or a directory)" {
|
|
arg <PATH>
|
|
}
|
|
flag --exit-code help="Exit 1 when the two sides differ"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[A]" help="Numeric checkpoint ID, `latest`, `latest~N`, or `commit:<sha>`" required=#false
|
|
arg "[B]" help="Compare `A` with this checkpoint instead of its predecessor" required=#false
|
|
example "mise dot history diff" help="Show unsaved changes"
|
|
example "mise dot history diff 12" help="Show what checkpoint 12 changed"
|
|
example "mise dot history diff 11 12 --patch" help="Print the full patch between two checkpoints"
|
|
example "mise dot history diff --operation" help="Show what the newest operation changed"
|
|
}
|
|
cmd ls help="List checkpoints, newest first" effect=read {
|
|
alias list
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag "-n --limit" help="Show at most this many checkpoints (0 for all)" default="20" {
|
|
arg <LIMIT>
|
|
}
|
|
flag --path help="Only checkpoints where this path (or something under it) changed" {
|
|
arg <PATH>
|
|
}
|
|
flag --trigger help="Only checkpoints with this trigger, such as edit, save, agent, bootstrap, apply, rollback, or undo" {
|
|
long_help #"""
|
|
Only checkpoints with this trigger, such as edit, save, agent, bootstrap, apply, rollback, or undo
|
|
|
|
`bootstrap` covers `mise bootstrap`, its `packages` commands, and `mise dot add`, `apply`, `edit`, and `unapply`. `apply` covers incoming changes written by `mise dot pull` or the watcher.
|
|
"""#
|
|
arg <TRIGGER>
|
|
}
|
|
flag --label help="Only checkpoints with this label" {
|
|
arg <LABEL>
|
|
}
|
|
flag --pending help="Only checkpoints recorded by operations that did not finish"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise dot history ls -n 0" help="List every checkpoint"
|
|
example "mise dot history ls --pending" help="List operations that did not finish"
|
|
}
|
|
cmd purge help="Erase a path's saved versions from history" effect=destructive {
|
|
long_help #"""
|
|
Erase a path's saved versions from history
|
|
|
|
Rewrites the history without the path, for a file you tracked by mistake that holds a secret. `untrack`, `rollback`, and `undo` only add checkpoints; they leave the old versions readable.
|
|
|
|
Checkpoints that changed only this path are removed. The others stay, with their descriptions, dates, and IDs, minus the path. Without `--yes`, the command lists what would change and asks first.
|
|
|
|
mise never rewrites history that is on the origin: if a saved version of the path was ever published, the command refuses. Rotate the secret, then see https://mise.jdx.dev/dotfiles/encryption.html#remove-plaintext-from-history.
|
|
|
|
This does not stop tracking the path. If the file is still tracked, the next save records its current contents again, so run `mise dot untrack` first (or encrypt it). Stop the watcher service while this runs.
|
|
"""#
|
|
flag "-n --dry-run" help="Show what would change without changing anything"
|
|
flag "-y --yes" help="Rewrite without prompting"
|
|
flag --backup help="Keep the replaced history in the repository under `refs/mise/purge-backup/`" {
|
|
long_help #"""
|
|
Keep the replaced history in the repository under `refs/mise/purge-backup/`
|
|
|
|
The backup still holds the content you are erasing; delete it with `git update-ref -d` once you are sure.
|
|
"""#
|
|
}
|
|
flag --keep-objects help="Leave the replaced objects on disk instead of deleting them"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <PATH>… help="Files or directories to erase from history" var=#true
|
|
example "mise dot history purge ~/.aws/credentials --dry-run" help="List the checkpoints that hold the file"
|
|
example "mise dot history purge ~/.aws/credentials --yes" help="Erase every saved version of the file"
|
|
}
|
|
cmd show help="Show a checkpoint: its trigger, changes, and operation journal" effect=read {
|
|
long_help #"""
|
|
Show a checkpoint: its trigger, changes, and operation journal
|
|
|
|
Prints the checkpoint's trigger, description, time, and machine, the files that changed since the previous checkpoint, and the tracked entries it covers. For a checkpoint that an operation recorded, also prints the operation's journal of the files it wrote.
|
|
"""#
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --files help="List every file in the snapshot"
|
|
flag --path help="Resolve `latest~N` among the checkpoints where this path changed" {
|
|
arg <PATH>
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[REF]" help="Numeric checkpoint ID, `latest` (the default), `latest~N`, or `commit:<sha>`" required=#false
|
|
example "mise dot history show" help="Show the newest checkpoint"
|
|
example "mise dot history show latest~2 --files" help="List every file in an older checkpoint"
|
|
}
|
|
example "mise dot history" help="List recent checkpoints"
|
|
example "mise dot history --path ~/.config/hypr/bindings.lua" help="List checkpoints that changed one file"
|
|
example "mise dot history --trigger bootstrap -n 5" help="List the last five checkpoints from mise bootstrap or mise dot apply"
|
|
example "mise dot history show latest" help="Show the newest checkpoint"
|
|
example "mise dot history diff" help="Show unsaved changes"
|
|
}
|
|
cmd include help="Stop excluding paths matching a glob" effect=write {
|
|
long_help #"""
|
|
Stop excluding paths matching a glob
|
|
|
|
Removes a glob that `mise dot exclude` added to `[history] exclude` in the global config. Pass the pattern exactly as you excluded it. Other matching exclusion rules still apply. This command does not edit a tracked directory's `include` list; change that list in its `[dotfiles]` entry.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <GLOB> help="The glob as written by `mise dot exclude`"
|
|
example "mise dot include '~/.codex/sessions/**'" help="Save Codex session logs again"
|
|
}
|
|
cmd notify help="Send a test desktop notification" effect=write {
|
|
long_help #"""
|
|
Send a test desktop notification
|
|
|
|
Checks that `history.notify` can reach you. On macOS the first notification asks for permission, so run this once to be prompted now instead of at the first sync conflict. Fails with the reason when this build or machine cannot show notifications: a macOS build that is not mise's signed release (such as Homebrew's), a missing `notify-send` on Linux, denied permission, or `history.notify = false`.
|
|
|
|
mise notifies you only when a sync conflict pauses syncing. Other problems, such as a watcher that cannot save, appear in `mise doctor` and `mise dot status`.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise dot notify" help="Send a test notification"
|
|
}
|
|
cmd origin help="Show, connect, or disconnect the origin repository" effect=destructive {
|
|
long_help #"""
|
|
Show, connect, or disconnect the origin repository
|
|
|
|
The origin is a Git repository that shares the history of your tracked files with your other machines. With no subcommand, prints the connected URL, its branch, the config file that declares it, and the sync mode (the `history.sync` setting). `--remove` disconnects; local checkpoints and fetched history stay.
|
|
|
|
See https://mise.jdx.dev/dotfiles/sync.html
|
|
"""#
|
|
flag --remove help="Disconnect the origin by removing `[history.origin]`; local checkpoints and fetched history stay" effect=destructive
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd set help="Connect an origin repository" effect=write {
|
|
long_help #"""
|
|
Connect an origin repository
|
|
|
|
Use a private repository: every saved checkpoint is shared, including those saved before you connect. mise shows the sync mode and the tracked files before you confirm, then runs the first sync. It never replaces a repository that has unrelated history, and it refuses to push older plaintext versions of files you now encrypt. The connection is written to `[history.origin]` in `config.local.toml` next to your global config, so it stays on this machine.
|
|
|
|
The origin holds tracked-file history, not a checkout of your global config: connect a repository of its own, or a separate branch (`--branch`) of the one you adopt as global config with `mise bootstrap --adopt`.
|
|
"""#
|
|
flag --branch help="The branch to sync (default: the repository's default branch)" {
|
|
long_help #"""
|
|
The branch to sync (default: the repository's default branch)
|
|
|
|
Reconnecting a repository this machine already follows keeps that connection's branch. A repository with no branches gets `main`, which the first push creates.
|
|
"""#
|
|
arg <BRANCH>
|
|
}
|
|
flag --sync help="How to sync with the repository: sync, fetch-only, or manual" {
|
|
long_help #"""
|
|
How to sync with the repository: sync, fetch-only, or manual
|
|
|
|
`sync` pushes saved checkpoints and applies incoming changes automatically. `fetch-only` fetches automatically and never pushes. `manual` makes no automatic network calls: `mise dot sync` pushes and fetches, and `mise dot pull` applies, only when you run them; local history is still saved automatically. When omitted, mise prompts; with `--yes`, it uses the `history.sync` setting.
|
|
"""#
|
|
arg <MODE>
|
|
}
|
|
flag "-y --yes" help="Skip the confirmation prompt"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <URL> help="The repository URL (any Git URL; use a private repository)"
|
|
example "mise dot origin set https://github.com/you/dotfiles.git" help="Connect and choose a sync mode at the prompt"
|
|
example "mise dot origin set git@github.com:you/dotfiles.git --sync manual" help="Connect without automatic network activity"
|
|
}
|
|
example "mise dot origin" help="Show the connected repository"
|
|
example "mise dot origin set git@github.com:you/dotfiles.git" help="Connect a repository"
|
|
example "mise dot origin --remove" help="Disconnect the repository"
|
|
}
|
|
cmd paths help="List tracked paths and how they are saved" effect=read {
|
|
long_help #"""
|
|
List tracked paths and how they are saved
|
|
|
|
Shows each tracked entry with the config file that declares it, whether it saves automatically, and how many files it covers. Entries mise cannot save are listed as invalid, omitted, or incomplete, so you can see what is not protected.
|
|
"""#
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --preview help="List the files that tracking this path would save, without tracking it" {
|
|
arg <PATH>
|
|
}
|
|
flag --noisy help="List the paths the watcher found changing constantly and saves less often"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise dot paths" help="List tracked paths"
|
|
example "mise dot paths --preview ~/.codex" help="List the files tracking ~/.codex would save"
|
|
example "mise dot paths --noisy" help="List files the watcher saves less often"
|
|
}
|
|
cmd pull help="Write fetched changes from other machines to tracked files" effect=destructive {
|
|
long_help #"""
|
|
Write fetched changes from other machines to tracked files
|
|
|
|
Writes the changes that the last `mise dot sync` fetched from your other machines. (`mise dot apply` deploys your own `[dotfiles]` entries; `pull` writes what other machines pushed.) `pull` restores tracked paths, including tracked symlinks, but never deploys `copy`, `symlink`, or `template` entries: when a tracked file is the source of one, `pull` updates the source, and `mise dot apply` then writes the target your application reads. mise saves a checkpoint first, so `mise dot undo` reverses the whole pull, and runs the matching `[history.reload]` commands after writing.
|
|
|
|
A pull applies every incoming change together, including config files and the files they reference; it does not take paths. Nothing is written if an incoming config file does not parse, a file has unsaved local edits, your own checkout has staged Git changes, or a file changed on both sides. A file that changed on both sides is a conflict: compare the two versions with `mise dot conflicts`, then resolve it with `--take-remote` or `--keep-local`, or resolve every conflict with `--take-remote-all` or `--keep-local-all`. While any conflict remains, pushing and applying stop for all tracked files; local history and fetching continue.
|
|
|
|
In `sync` mode the watcher pulls on its own when there are no conflicts. When incoming config declares more tracked files, their versions from the origin are written in the same pull.
|
|
"""#
|
|
flag "-n --dry-run" help="Show the plan without changing anything"
|
|
flag "-y --yes" help="Accepted for compatibility; pull skips the apply confirmation"
|
|
flag --take-remote help="Resolve a conflict with the origin's version" var=#true {
|
|
arg <PATH>
|
|
}
|
|
flag --keep-local help="Resolve a conflict by keeping this machine's version; the next sync pushes it" var=#true {
|
|
arg <PATH>
|
|
}
|
|
flag --take-remote-all help="Resolve every remaining conflict with the origin's version" conflicts=--keep-local-all {
|
|
long_help #"""
|
|
Resolve every remaining conflict with the origin's version
|
|
|
|
Paths named by `--keep-local` keep this machine's version; every other conflict takes the origin's. Use it on a newly connected machine, where each existing file that differs is a separate conflict.
|
|
"""#
|
|
}
|
|
flag --keep-local-all help="Resolve every remaining conflict by keeping this machine's version" conflicts=--take-remote-all {
|
|
long_help #"""
|
|
Resolve every remaining conflict by keeping this machine's version
|
|
|
|
Paths named by `--take-remote` take the origin's version; every other conflict keeps this machine's. Each kept path must already be saved.
|
|
"""#
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[PATH]…" help="Not supported; a pull always applies every incoming change" required=#false var=#true hide=#true
|
|
example "mise dot pull --dry-run" help="Show what would be written"
|
|
example "mise dot pull --take-remote ~/.zshrc" help="Resolve a conflict with the origin's version"
|
|
example "mise dot pull --keep-local ~/.zshrc" help="Resolve a conflict by keeping this machine's version"
|
|
example "mise dot pull --take-remote-all --keep-local ~/.zshrc" help="Take the origin's version of every conflict except one"
|
|
}
|
|
cmd recover help="Recover an interrupted dotfile operation" effect=destructive {
|
|
long_help #"""
|
|
Recover an interrupted dotfile operation
|
|
|
|
Finishes recovering from an operation that was interrupted, for example by a crash or Ctrl-C. With no argument, recovers every interrupted operation. mise restores files from the operation's recovery copies unless you have edited them since. When it cannot tell which version is safe, it lists the files: check them, then rerun with `--keep-current` to keep what is on disk and discard the operation's recovery copies. When several operations were interrupted, `--keep-current` needs the ID of one. Git history is not changed.
|
|
"""#
|
|
flag --keep-current help="Keep the files on disk instead of restoring the recovery copies"
|
|
flag "-y --yes" help="Discard the operation's recovery copies without prompting"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[OPERATION]" help="The operation's checkpoint ID (see `mise dot history --pending`) or a unique prefix of its UUID" required=#false
|
|
example "mise dot recover" help="Recover every interrupted operation"
|
|
example "mise dot recover 42 --keep-current --yes" help="Keep the files on disk for operation 42"
|
|
}
|
|
cmd rollback help="Return files to the version a checkpoint holds" effect=destructive {
|
|
long_help #"""
|
|
Return files to the version a checkpoint holds
|
|
|
|
Without `--to`, each path returns to its most recent saved version that differs from what is on disk; other checkpoints do not affect the choice. With `--to REF`, the named checkpoint is the source, and `--all` restores everything it covers. mise saves the current state in a checkpoint first, so `mise dot undo` can reverse the rollback.
|
|
"""#
|
|
flag --to help="The checkpoint to roll back to: numeric ID, `latest`, `latest~N`, or `commit:<sha>`" {
|
|
arg <REF>
|
|
}
|
|
flag --all help="With `--to`, restore everything the checkpoint covers"
|
|
flag "-n --dry-run" help="Show the plan without changing anything"
|
|
flag "-y --yes" help="Apply without prompting"
|
|
flag --force help="Replace a path whose type changed (file, symlink, directory)"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[PATH]…" help="Paths to roll back (files or directories)" required=#false var=#true
|
|
example "mise dot rollback ~/.config/hypr/bindings.lua" help="Restore the latest saved version that differs from the file"
|
|
example "mise dot rollback ~/.zshrc --to 42" help="Restore ~/.zshrc as checkpoint 42 holds it"
|
|
example "mise dot rollback --to latest~3 --all --dry-run" help="Preview restoring every file from three checkpoints ago"
|
|
}
|
|
cmd save help="Save a checkpoint of the tracked files now" effect=write {
|
|
long_help #"""
|
|
Save a checkpoint of the tracked files now
|
|
|
|
Exits non-zero when history cannot save or a named path is not tracked. With no changes since the latest checkpoint, nothing is saved unless you pass `--description`, `--label`, `--task`, or a `--trigger` other than `save`.
|
|
|
|
`--best-effort` turns a failure to write the checkpoint, such as missing Git, into a warning for update scripts that run under `set -e`. A disabled history or an untracked path still fails.
|
|
|
|
A save re-encrypts the files it captures to the current `[history.encryption] recipients`. `--re-encrypt` also re-encrypts the encrypted files it does not capture: files with `autosave = false` that it does not name, and variants for other platforms. It re-encrypts their saved versions and saves no unsaved edit. Run it after changing recipients so a machine added to the list can read every file. This machine must be able to unlock each one; otherwise nothing is saved and the error lists each file it cannot unlock.
|
|
"""#
|
|
flag "-d --description" help="A description for the checkpoint" {
|
|
arg <TEXT>
|
|
}
|
|
flag --trigger help="Record the checkpoint as a save, agent, or update checkpoint" default=save {
|
|
arg <TRIGGER>
|
|
}
|
|
flag --task help="The ID of the task an agent is working on, recorded with the checkpoint" {
|
|
arg <ID>
|
|
}
|
|
flag --label help="A label to find the checkpoint by later" var=#true {
|
|
arg <LABEL>
|
|
}
|
|
flag --best-effort help="Warn instead of failing when the checkpoint cannot be written"
|
|
flag --re-encrypt help="Re-encrypt every saved encrypted file to the current recipients"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[PATH]…" help="Paths to save; every one must be tracked" required=#false var=#true
|
|
example "mise dot save" help="Save every tracked file that changed"
|
|
example "mise dot save ~/.zshrc -d \"before the theme change\"" help="Save one file with a description"
|
|
example "mise dot save --best-effort" help="Warn instead of failing in a script"
|
|
example "mise dot save --re-encrypt" help="Re-encrypt every encrypted file after changing recipients"
|
|
}
|
|
cmd status help="Show the state of your dotfiles and their history" effect=read {
|
|
alias ls
|
|
long_help #"""
|
|
Show the state of your dotfiles and their history
|
|
|
|
Lists the `[dotfiles]` entries that need attention, and counts the rest; `--verbose` lists every entry. Each has a state: `applied`, `missing`, `differs`, `source missing`, `tracked`, `would remove` for an `absent` entry whose target is still there, or `absent` for a removal that is done. A tracked entry whose variants all select other machines, such as one for an inactive profile, says `not on this machine`. Then shows the history state in sections: Tracking, Repository, Conflicts, Automatic capture, and Bootstrap, ending with the next steps.
|
|
|
|
Files a dotfile group deployed that no active entry deploys now are listed as `orphaned`: the group was deselected or removed, or a new `exclude` or a deleted source dropped them. `mise dot apply --prune` removes them.
|
|
|
|
Template entries are rendered to compare their output, so trusted template functions may run. `--json` prints `files`, `edits`, and `history`, with each entry's origin and a state of `applied`, `missing`, `differs`, `source_missing`, or `tracked`. Orphaned files appear in a separate `orphaned` array with the state `orphaned`, or `orphaned_changed` when the file was modified after it was deployed. See https://mise.jdx.dev/dotfiles/reference.html#status-states for every state.
|
|
"""#
|
|
flag --truncate help="Truncate long terminal output to fit the available width" negate=--no-truncate default="true"
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --missing help="Exit with code 1 if any dotfile is not in its desired state (missing, source missing, or differs)"
|
|
flag "-v --verbose" help="List every entry, including those already applied or tracked" {
|
|
long_help #"""
|
|
List every entry, including those already applied or tracked
|
|
|
|
By default the table lists only entries that need attention or have omitted files, with a one-line summary of the rest. Naming targets lists them regardless.
|
|
"""#
|
|
}
|
|
flag --prompt-secrets help="Prompt for `[bootstrap.secrets]` values that templates need and the environment does not set"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TARGET]…" help="Only show these targets" required=#false var=#true
|
|
example "mise dot status" help="Show what needs attention"
|
|
example "mise dot status --verbose" help="List every entry"
|
|
example "mise dot status ~/.zshrc" help="Show one target"
|
|
example "mise dot status --json" help="Print the state as JSON"
|
|
example "mise dot status --missing" help="Exit 1 if anything is out of date, for scripts and CI"
|
|
}
|
|
cmd sync help="Push saved checkpoints and fetch incoming changes" effect=write {
|
|
long_help #"""
|
|
Push saved checkpoints and fetch incoming changes
|
|
|
|
Fetches the origin branch and pushes your local history to it. If the push is rejected, mise fetches again and reconciles the two histories without rewriting either. Incoming changes and conflicts are recorded for `mise dot pull`; this command never changes your files. With `--fetch-only`, or in `fetch-only` mode, nothing is pushed.
|
|
|
|
The watcher does this on its own in `sync` and `fetch-only` mode (the `history.sync` setting). See https://mise.jdx.dev/dotfiles/sync.html
|
|
"""#
|
|
flag --fetch-only help="Fetch without pushing"
|
|
flag --allow-plaintext-history help="Allow pushing older unencrypted versions of files that are now encrypted, and versions that look like they contain secrets"
|
|
flag --best-effort help="Warn instead of failing when the origin is unreachable"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise dot sync" help="Push and fetch now"
|
|
example "mise dot sync --fetch-only" help="Fetch without pushing"
|
|
}
|
|
cmd track help="Track a file or directory in place" effect=write {
|
|
long_help #"""
|
|
Track a file or directory in place
|
|
|
|
Adds a `[dotfiles]` entry with `mode = "track"` to your global config: the file stays where it is, nothing is copied or linked, and mise saves a checkpoint of it right away. While the watcher service runs, later edits are saved automatically; without it, `mise dot save` saves them. Use `--dry-run` to see what a large directory would add before tracking it.
|
|
|
|
`--os` and `--profile` declare a variant: machines that match the platform or config environment keep their own version of the file, so a Mac and a Linux machine can have different contents at the same path. `--machine` gives every machine its own version instead, for files such as a monitor layout that should never be applied on another machine.
|
|
|
|
See https://mise.jdx.dev/dotfiles/history.html
|
|
"""#
|
|
flag --os help="Declare a variant for this platform (macos, linux, linux/arm64, …)" {
|
|
arg <OS>
|
|
}
|
|
flag --profile help="Declare a variant for this config environment (`MISE_ENV` or `-E`)" {
|
|
arg <PROFILE>
|
|
}
|
|
flag --local help="Keep this file's history on this machine only; it is never shared"
|
|
flag --machine help="Keep a separate stream on every machine, never applied on another"
|
|
flag --no-autosave help="Save only on `mise dot save <path>`, never automatically"
|
|
flag --encrypt help="Encrypt contents before saving them to history (requires `[history.encryption] recipients`)"
|
|
flag --allow-plaintext help="Save an explicitly tracked credential-named file in plaintext"
|
|
flag "-y --yes" help="Accepted for compatibility; track no longer asks to confirm the paths"
|
|
flag "-n --dry-run" help="Show what each path expands to (files, size, what is left out) without tracking it"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <PATH>… help="Paths to track (absolute or starting with ~/)" var=#true
|
|
example "mise dot track ~/.zshrc ~/.config/hypr" help="Track a file and a directory"
|
|
example "mise dot track --dry-run ~/.codex" help="Show what tracking a directory would save"
|
|
example "mise dot track ~/.zshrc --os macos" help="Keep a separate version for macOS machines"
|
|
example "mise dot track ~/.config/hypr/monitors.lua --machine" help="Keep a separate version on every machine"
|
|
example "mise dot track ~/.config/app/state.json --local" help="Keep the file's history on this machine only"
|
|
example "mise dot track ~/.config/app/credentials --encrypt" help="Encrypt the file before saving it"
|
|
example "mise dot track ~/.config/app/state.json --no-autosave" help="Save the file only when you run mise dot save"
|
|
}
|
|
cmd unapply help="Remove files that `mise dot apply` deployed" effect=destructive {
|
|
long_help #"""
|
|
Remove files that `mise dot apply` deployed
|
|
|
|
Removes the targets of whole-file entries and the blocks and lines that edit entries added, but only what mise can identify as its own. Modified copies, modified templates, and plain-line edits need `--force`. Merged keys, `absent` entries, and permissions-only targets are left alone. Sources and config entries are kept, so run this before you delete a declaration, while mise can still identify its targets.
|
|
|
|
With `--group`, removes only that dotfile group's files, using what mise recorded when it applied them, so it works even after the group is deselected or deleted from the config.
|
|
"""#
|
|
flag "-f --force" help="Remove modified or otherwise ambiguous managed files and lines"
|
|
flag "-n --dry-run" help="Print the actions that would run without writing anything"
|
|
flag "-y --yes" help="Skip the confirmation prompt"
|
|
flag --group help="Only unapply the files of this dotfile group, even one that is no longer selected or declared" var=#true {
|
|
arg <NAME>
|
|
}
|
|
flag --prompt-secrets help="Prompt for `[bootstrap.secrets]` values that templates need and the environment does not set"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TARGET]…" help="Only unapply these targets" required=#false var=#true
|
|
example "mise dot unapply" help="Remove every target mise can identify"
|
|
example "mise dot unapply ~/.zshrc" help="Remove one target"
|
|
example "mise dot unapply --group work" help="Remove one dotfile group's files"
|
|
example "mise dot unapply --dry-run" help="Preview what would be removed"
|
|
example "mise dot unapply --force --yes" help="Also remove modified targets, without prompting"
|
|
}
|
|
cmd undo help="Reverse the tracked-file changes from an operation" effect=destructive {
|
|
long_help #"""
|
|
Reverse the tracked-file changes from an operation
|
|
|
|
Restores exactly the paths that an operation changed from the checkpoint it saved first, and leaves everything else as it is now. Without a reference, reverses the newest operation that has not been undone.
|
|
|
|
Works for operations that changed tracked files: `mise bootstrap`, `mise dot add`, `apply`, `edit`, `unapply`, `capture`, `rollback`, `pull` (including changes the watcher applied), and `undo` itself. Package installations, service state, and untracked files are not reversed.
|
|
"""#
|
|
flag "-n --dry-run" help="Show the plan without changing anything"
|
|
flag "-y --yes" help="Apply without prompting"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[REF]" help="The operation's checkpoint: numeric ID, `latest`, `latest~N`, or `commit:<sha>`" required=#false
|
|
example "mise dot undo" help="Reverse the newest operation"
|
|
example "mise dot undo --dry-run" help="Show what would be restored"
|
|
example "mise dot undo 42" help="Reverse the operation recorded as checkpoint 42"
|
|
}
|
|
cmd untrack help="Stop tracking a file or directory" effect=write {
|
|
long_help #"""
|
|
Stop tracking a file or directory
|
|
|
|
Removes the path's `mode = "track"` entry from your global config. When a project or system config declares the entry, mise turns it off on this machine in `config.local.toml` next to your global config instead.
|
|
|
|
A path inside a tracked directory has no entry of its own: mise adds a rule for it to `[history] exclude` in the global config, and `mise dot include <path>` removes that rule. The file itself and its existing checkpoints are not changed.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <PATH>… help="Paths to stop tracking" var=#true
|
|
example "mise dot untrack ~/.zshrc" help="Stop saving ~/.zshrc"
|
|
example "mise dot untrack ~/.config/hypr/plugins" help="Exclude one directory inside a tracked directory"
|
|
}
|
|
cmd watch help="Save tracked files as they change" effect=write {
|
|
long_help #"""
|
|
Save tracked files as they change
|
|
|
|
Runs in the foreground and saves a checkpoint once a changed file has been quiet for `history.watch.debounce`. A file that keeps changing does not delay the others and is still saved every `history.watch.max_interval`. The watcher also rescans every tracked path at startup, every `history.watch.reconcile`, and when the configuration changes. Entries tracked with `--no-autosave` are not watched.
|
|
|
|
With an origin connected, the watcher also syncs according to the `history.sync` setting. In `sync` mode it pushes within `history.sync_interval` of a save, fetches every `history.fetch_interval`, and applies incoming changes when there are no conflicts. In `fetch-only` mode it only fetches; in `manual` mode it does not use the network. A failed sync is retried with backoff while saving continues. `--once` runs one rescan and one sync, then exits.
|
|
|
|
The built-in `history-watch` service runs this for you:
|
|
|
|
[bootstrap.services.mise-history]
|
|
builtin = "history-watch"
|
|
|
|
Exits 0 when history is disabled or another watcher is already running, and 1 when Git is unusable, the store cannot be opened, or no watch can be installed. A failed save is retried with backoff and never drops the pending changes, and a save that would overlap another history operation is deferred. With `--once`, nothing is retried: a save that fails or is deferred, or a sync that fails, exits 1.
|
|
"""#
|
|
flag --once help="Rescan and sync once, then exit (for timers and cron)"
|
|
flag "-J --json" help="Print one JSON object per line instead of log lines"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise dot watch" help="Watch and save until stopped"
|
|
example "mise dot watch --once" help="Rescan and sync once, for a timer"
|
|
example "mise dot watch --json" help="Print JSON lines instead of log lines"
|
|
}
|
|
example "mise dot add ~/.zshrc" help="Start managing ~/.zshrc from your dotfiles directory"
|
|
example "mise dot apply" help="Deploy every [dotfiles] entry"
|
|
example "mise dot status" help="Show the state of your dotfiles and their history"
|
|
example "mise dot track ~/.config/nvim" help="Save the history of a directory in place"
|
|
example "mise dot history" help="List saved checkpoints"
|
|
}
|
|
cmd files subcommand_required=#true help="Manage system files and directories declared in `[bootstrap]`" effect=read {
|
|
long_help #"""
|
|
Manage system files and directories declared in `[bootstrap]`
|
|
|
|
Applies `[bootstrap.files]` and `[bootstrap.directories]`: paths that need a
|
|
specific owner, group, or mode, or that must exist or be absent system-wide,
|
|
such as configuration under /etc. For files in your home directory that you
|
|
edit, use `[dotfiles]` and `mise dotfiles`.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd apply help="Create, update, or remove the configured system files and directories" effect=destructive {
|
|
flag "-n --dry-run" help="Show what would change without changing anything"
|
|
flag "-y --yes" help="Skip the confirmation prompt"
|
|
flag --prompt-secrets help="Prompt securely for missing bootstrap secret inputs"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
cmd status help="Show the state of the configured system files and directories" effect=read {
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --missing help="Exit with status 1 if any file or directory differs from the config (all are still listed)"
|
|
flag --prompt-secrets help="Prompt securely for missing bootstrap secret inputs"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
example "mise bootstrap files status --missing" help="Exit with status 1 if any file or directory differs from the config"
|
|
example "mise bootstrap files apply --dry-run" help="Show what would change"
|
|
example "mise bootstrap files apply --yes" help="Apply without a prompt"
|
|
}
|
|
cmd firewall subcommand_required=#true help="Manage the Linux host firewall from `[bootstrap.linux.firewall]`" effect=read {
|
|
long_help #"""
|
|
Manage the Linux host firewall from `[bootstrap.linux.firewall]`
|
|
|
|
Works with nftables, firewalld, or UFW, and keeps mise's rules separate from
|
|
other host rules. Over SSH, mise refuses a default incoming policy of deny
|
|
or reject unless a rule allows the current connection or the config sets
|
|
`allow_lockout = true`. Check `apply --dry-run` before applying a policy to
|
|
a remote machine.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd apply help="Apply the firewall from `[bootstrap.linux.firewall]`" effect=destructive {
|
|
flag "-n --dry-run" help="Show what would change without changing anything"
|
|
flag "-y --yes" help="Skip the confirmation prompt"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
cmd status help="Show the state of the firewall from `[bootstrap.linux.firewall]`" effect=read {
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --missing help="Exit with status 1 if the firewall differs from the config"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
example "mise bootstrap firewall status" help="Show the firewall's state"
|
|
example "mise bootstrap firewall apply --dry-run" help="Show the policy and rules that would change"
|
|
}
|
|
cmd launchd hide=#true subcommand_required=#true help="Manage macOS LaunchAgents (use `mise bootstrap macos launchd-agents`)" effect=read {
|
|
long_help #"""
|
|
Manage macOS LaunchAgents (use `mise bootstrap macos launchd-agents`)
|
|
|
|
This older spelling keeps working.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd apply hide=#true help="Install and load LaunchAgents from `[bootstrap.macos.launchd.agents]`" effect=write {
|
|
flag "-n --dry-run" help="Show what would change without changing anything"
|
|
flag "-y --yes" help="Skip the confirmation prompt"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
cmd status hide=#true help="Show the state of the configured LaunchAgents" effect=read {
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --missing help="Exit with status 1 if any LaunchAgent differs from the config (all are still listed)"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
}
|
|
cmd linux subcommand_required=#true help="Manage systemd user units from `[bootstrap.linux.systemd.units]`" effect=read {
|
|
long_help #"""
|
|
Manage systemd user units from `[bootstrap.linux.systemd.units]`
|
|
|
|
The host firewall in `[bootstrap.linux.firewall]` is managed by
|
|
`mise bootstrap firewall`.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd systemd-units subcommand_required=#true help="Manage systemd user units from `[bootstrap.linux.systemd.units]`" effect=read {
|
|
alias systemd
|
|
long_help #"""
|
|
Manage systemd user units from `[bootstrap.linux.systemd.units]`
|
|
|
|
Writes unit files to ~/.config/systemd/user, then enables and starts them
|
|
as configured. An entry with `state = "absent"` is stopped, disabled, and
|
|
deleted instead. Units run with your permissions and need a reachable
|
|
systemd user manager. For system units, or a user service that also works
|
|
on macOS and Windows, use `[bootstrap.services]`.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd apply help="Install and start the configured systemd user units" effect=write {
|
|
flag "-n --dry-run" help="Show what would change without changing anything"
|
|
flag "-y --yes" help="Skip the confirmation prompt"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
cmd status help="Show the state of the configured systemd user units" effect=read {
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --missing help="Exit with status 1 if any unit differs from the config (all are still listed)"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
}
|
|
}
|
|
cmd macos subcommand_required=#true help="Manage macOS preferences and LaunchAgents from `[bootstrap.macos]`" effect=read {
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd defaults subcommand_required=#true help="Manage macOS preferences such as Dock, Finder, and keyboard settings" effect=read {
|
|
long_help #"""
|
|
Manage macOS preferences such as Dock, Finder, and keyboard settings
|
|
|
|
Applies `[bootstrap.macos.defaults]`, `[[bootstrap.macos.defaults_entries]]`,
|
|
and the `[bootstrap.macos.dock]`, `finder`, `keyboard`, and `trackpad`
|
|
sections. Preferences are written the way `defaults write` writes them.
|
|
mise does not restart apps: Dock, Finder, and some others show a change
|
|
only after they relaunch.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd apply help="Write the configured macOS preferences" effect=write {
|
|
flag "-n --dry-run" help="Show what would change without changing anything"
|
|
flag "-y --yes" help="Skip the confirmation prompt"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
cmd status help="Show the state of the configured macOS preferences" effect=read {
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --missing help="Exit with status 1 if any preference differs from the config (all are still listed)"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
}
|
|
cmd launchd-agents subcommand_required=#true help="Manage macOS LaunchAgents from `[bootstrap.macos.launchd.agents]`" effect=read {
|
|
alias launchd
|
|
long_help #"""
|
|
Manage macOS LaunchAgents from `[bootstrap.macos.launchd.agents]`
|
|
|
|
Writes each agent to ~/Library/LaunchAgents/dev.mise.<name>.plist and loads
|
|
it into your GUI login session. Run it as the user who owns the agents; an
|
|
SSH session without a GUI login may not be able to load them. For a user
|
|
service that also works on Linux and Windows, use `[bootstrap.services]`
|
|
with `scope = "user"`.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd apply help="Install and load LaunchAgents from `[bootstrap.macos.launchd.agents]`" effect=write {
|
|
flag "-n --dry-run" help="Show what would change without changing anything"
|
|
flag "-y --yes" help="Skip the confirmation prompt"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
cmd status help="Show the state of the configured LaunchAgents" effect=read {
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --missing help="Exit with status 1 if any LaunchAgent differs from the config (all are still listed)"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
}
|
|
}
|
|
cmd macos-defaults hide=#true subcommand_required=#true help="Manage macOS preferences (use `mise bootstrap macos defaults`)" effect=read {
|
|
long_help #"""
|
|
Manage macOS preferences (use `mise bootstrap macos defaults`)
|
|
|
|
This older spelling keeps working.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd apply hide=#true help="Write the configured macOS preferences" effect=write {
|
|
flag "-n --dry-run" help="Show what would change without changing anything"
|
|
flag "-y --yes" help="Skip the confirmation prompt"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
cmd status hide=#true help="Show the state of the configured macOS preferences" effect=read {
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --missing help="Exit with status 1 if any preference differs from the config (all are still listed)"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
}
|
|
cmd mise-shell-activate subcommand_required=#true help="Manage mise shell activation from `[bootstrap.mise_shell_activate]`" effect=read {
|
|
alias shell
|
|
long_help #"""
|
|
Manage mise shell activation from `[bootstrap.mise_shell_activate]`
|
|
|
|
Writes a managed activation block into each configured shell startup file.
|
|
It does not activate mise in the shell you run it from; open a new shell
|
|
afterward.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd apply help="Write mise activation into the configured shell startup files" effect=write {
|
|
flag "-n --dry-run" help="Show what would change without changing anything"
|
|
flag "-y --yes" help="Skip the confirmation prompt"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
cmd status help="Show the state of the configured shell activation" effect=read {
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --missing help="Exit with status 1 if any shell activation differs from the config (all are still listed)"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
}
|
|
cmd packages subcommand_required=#true help="Manage packages from `[bootstrap.packages]`" effect=read {
|
|
long_help #"""
|
|
Manage packages from `[bootstrap.packages]`
|
|
|
|
Declare packages as `"manager:package" = "version"`. `apply` installs what
|
|
is missing and removes what is declared absent, `use` adds an entry and
|
|
installs it, and `upgrade` updates configured packages that are installed.
|
|
`prune` uninstalls Homebrew formulae, casks, or package plugin packages that
|
|
no config declares. `import` records installed Homebrew formulae, and
|
|
`status` shows what differs from the config. See
|
|
https://mise.jdx.dev/bootstrap/packages/ for each package manager.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd apply help="Install or remove packages to match `[bootstrap.packages]`" effect=destructive {
|
|
alias i install
|
|
long_help #"""
|
|
Install or remove packages to match `[bootstrap.packages]`
|
|
|
|
Installs each configured package that is missing or does not match its
|
|
declared version, and removes packages declared `state = "absent"` on the
|
|
managers that support removal (pacman, scoop, snap, and zypper). On other
|
|
managers, an installed package declared absent is left in place with a
|
|
warning; `apply` fails for it only when you pass `--manager` or name the
|
|
package.
|
|
Built-in managers may use sudo when not running as root (see the
|
|
`system_packages.sudo` setting); package plugins never do. Managers that
|
|
are not available on this machine are skipped.
|
|
|
|
Name packages as `manager:package`, for example `apt:curl` or `brew:jq`, to
|
|
install them without adding them to config; use
|
|
`mise bootstrap packages use` to record them as well. When you name packages
|
|
or pass `--manager`, an unavailable manager is an error instead of a skip.
|
|
"""#
|
|
flag "-m --manager" help="Only apply packages for this built-in or plugin manager" {
|
|
arg <MANAGER>
|
|
}
|
|
flag "-n --dry-run" help="Show what would change without changing anything"
|
|
flag "-y --yes" help="Skip the confirmation prompt"
|
|
flag --update help="Refresh package manager metadata first, where the manager supports it" {
|
|
long_help #"""
|
|
Refresh package manager metadata first, where the manager supports it
|
|
|
|
For example, apt runs `apt-get update` and dnf adds `--refresh`. brew, brew-cask, flatpak, flatpak-user, macos-app, mas, and snap ignore this flag.
|
|
"""#
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[PACKAGE]…" help="Packages as `manager:package`; defaults to every package in `[bootstrap.packages]`" required=#false var=#true
|
|
example "mise bootstrap packages apply" help="Install missing packages and remove ones declared absent"
|
|
example "mise bootstrap packages apply --dry-run" help="Show what would change"
|
|
example "mise bootstrap packages apply --manager apt --yes" help="Apply only apt packages, without a prompt"
|
|
example "mise bootstrap packages apply apt:curl" help="On Debian or Ubuntu, install one package without adding it to config"
|
|
example "mise bootstrap packages apply brew:jq brew-cask:firefox" help="On macOS, install a formula and a cask without adding them to config"
|
|
}
|
|
cmd brew subcommand_required=#true help="Manage Homebrew tap URLs in `[bootstrap.brew.taps]`" effect=read {
|
|
long_help #"""
|
|
Manage Homebrew tap URLs in `[bootstrap.brew.taps]`
|
|
|
|
mise finds a third-party tap such as `acme/tools` at
|
|
`https://github.com/acme/homebrew-tools` without an entry. Add one only
|
|
when the tap's repository lives at a different GitHub URL; only GitHub taps
|
|
are supported. These commands edit config; they do not run Homebrew.
|
|
|
|
Not available on Windows.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd tap help="Add a Homebrew tap URL to the global `[bootstrap.brew.taps]`" effect=write {
|
|
flag "-l --local" help="Write to the local config instead of the global config"
|
|
flag "-n --dry-run" help="Show the config change without writing it"
|
|
flag "-p --path --file" help="Write to this config file or directory" conflicts=--local {
|
|
arg <PATH>
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <TAP> help="Tap name, e.g. `owner/repo`"
|
|
arg "[URL]" help="GitHub URL of the tap; defaults to `https://github.com/<owner>/homebrew-<repo>.git`" required=#false
|
|
example "mise bootstrap packages brew tap acme/tools https://github.com/acme/brew-tools.git" help="Record a tap whose repository is not acme/homebrew-tools"
|
|
example "mise bootstrap packages brew tap acme/tools https://github.com/acme/brew-tools.git --local" help="Write the entry to the local config instead"
|
|
complete url type=url
|
|
}
|
|
cmd untap help="Remove Homebrew tap URLs from `[bootstrap.brew.taps]`" effect=write {
|
|
alias remove rm
|
|
flag "-l --local" help="Write to the local config instead of the global config"
|
|
flag "-n --dry-run" help="Show the config change without writing it"
|
|
flag "-p --path --file" help="Write to this config file or directory" conflicts=--local {
|
|
arg <PATH>
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <TAPS>… help="Tap names, e.g. `owner/repo`" var=#true
|
|
example "mise bootstrap packages brew untap acme/tools" help="Remove a tap entry from the global config"
|
|
}
|
|
}
|
|
cmd export help="Print the configured `nix:` packages as a NixOS module" effect=read {
|
|
long_help #"""
|
|
Print the configured `nix:` packages as a NixOS module
|
|
|
|
Prints a module that adds each package to `environment.systemPackages`,
|
|
without running Nix. Import it into a NixOS configuration; packages resolve
|
|
against that configuration's `pkgs`. Entries for another OS or environment,
|
|
and entries with `state = "absent"`, are left out. Only shorthand
|
|
attributes such as `nix:ripgrep` can be exported: a flake reference or a
|
|
version pin is an error, because the importing configuration decides where
|
|
packages come from.
|
|
"""#
|
|
flag --format help="Output format" required=#true {
|
|
arg <FORMAT> {
|
|
choices nix
|
|
}
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise bootstrap packages export --format nix > packages.nix" help="Write the module to a file you can import from a NixOS configuration"
|
|
}
|
|
cmd import help="Record installed Homebrew formulae in `[bootstrap.packages]`" effect=write {
|
|
long_help #"""
|
|
Record installed Homebrew formulae in `[bootstrap.packages]`
|
|
|
|
Adds a `brew:` entry for each linked formula you installed yourself,
|
|
skipping formulae that were installed only as dependencies; `--all`
|
|
includes those too. Formulae from third-party taps are written with their
|
|
full name, and each tap gets a `[bootstrap.brew.taps]` entry with the URL
|
|
already in your config or the default GitHub URL. Writes the local config
|
|
unless you pass `-g`, `-e`, or `-p`.
|
|
"""#
|
|
flag "-e --env" help="Write to the config file for this environment (mise.<ENV>.toml)" {
|
|
conflicts "--global" "--path"
|
|
arg <ENV>
|
|
}
|
|
flag "-g --global" help="Write to the global config (~/.config/mise/config.toml)" {
|
|
long_help #"""
|
|
Write to the global config (~/.config/mise/config.toml)
|
|
|
|
New entries go to the `write_targets.packages` file when that setting is set.
|
|
"""#
|
|
conflicts "--env" "--path"
|
|
}
|
|
flag "-m --manager" help="Package manager to import from" default=brew {
|
|
arg <MANAGER> {
|
|
choices brew
|
|
}
|
|
}
|
|
flag --all help="Import every linked formula, including dependencies"
|
|
flag "-n --dry-run" help="Show the entries that would be written without writing them"
|
|
flag "-p --path --file" help="Write to this config file or directory" conflicts=--global {
|
|
arg <PATH>
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise bootstrap packages import --dry-run" help="Show the entries that would be written"
|
|
example "mise bootstrap packages import" help="Write them to the local config"
|
|
example "mise bootstrap packages import --all" help="Include formulae installed as dependencies"
|
|
example "mise bootstrap packages import -g" help="Write to the global config"
|
|
}
|
|
cmd prune help="Uninstall packages that no config declares" effect=destructive {
|
|
long_help #"""
|
|
Uninstall packages that no config declares
|
|
|
|
For `brew` (the default), removes every linked formula that is neither
|
|
declared nor needed by a declared formula or cask, including formulae you
|
|
installed with Homebrew itself. Run with `--dry-run` first, or record
|
|
existing formulae with `mise bootstrap packages import`.
|
|
|
|
For `brew-cask`, removes only casks mise installed and can prove are
|
|
unchanged. For a package plugin that supports uninstalling, removes only
|
|
packages mise installed. A package is kept while the current config, or any
|
|
trusted config mise has tracked, still declares it.
|
|
"""#
|
|
flag "-m --manager" help="Package manager to prune: `brew`, `brew-cask`, or a package plugin" default=brew {
|
|
arg <MANAGER>
|
|
}
|
|
flag "-n --dry-run" help="Show what would be removed without removing anything"
|
|
flag "-y --yes" help="Skip the confirmation prompt"
|
|
flag --force help="Remove `brew-cask` casks that mise installed even when it cannot prove they are unchanged, such as self-updating apps or casks with install scripts" {
|
|
long_help #"""
|
|
Remove `brew-cask` casks that mise installed even when it cannot prove they are unchanged, such as self-updating apps or casks with install scripts
|
|
|
|
mise removes the files it recorded installing that are still in place, but not what a cask's own install scripts created.
|
|
"""#
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise bootstrap packages prune --dry-run" help="Preview which Homebrew formulae would be removed"
|
|
example "mise bootstrap packages prune --yes" help="Remove them without a prompt"
|
|
example "mise bootstrap packages prune --manager brew-cask --dry-run" help="Preview which casks would be removed"
|
|
example "mise bootstrap packages prune --manager vscode --dry-run" help="Preview removals for a package plugin named vscode"
|
|
}
|
|
cmd status help="Show the state of packages from `[bootstrap.packages]`" effect=read {
|
|
alias ls list
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --missing help="Exit with status 1 if any package differs from the config (all are still listed)"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise bootstrap packages status" help="List every configured package and its state"
|
|
example "mise bootstrap packages status --json" help="Print the state as JSON"
|
|
example "mise bootstrap packages status --missing" help="Exit with status 1 if any package differs from the config"
|
|
}
|
|
cmd upgrade help="Upgrade installed packages from `[bootstrap.packages]`" effect=write {
|
|
alias up
|
|
long_help #"""
|
|
Upgrade installed packages from `[bootstrap.packages]`
|
|
|
|
Refreshes package manager metadata, then upgrades the configured packages
|
|
that are already installed. Each manager decides which version is current.
|
|
Version pins in config are honored where the manager can install them;
|
|
other pinned entries are skipped with a warning. Packages that are not
|
|
installed yet are skipped; install them with `mise bootstrap packages apply`.
|
|
See https://mise.jdx.dev/bootstrap/packages/ for what each manager does.
|
|
|
|
Name packages as `manager:package` to upgrade only those.
|
|
"""#
|
|
flag "-m --manager" help="Only upgrade packages for this built-in or plugin manager" {
|
|
arg <MANAGER>
|
|
}
|
|
flag "-n --dry-run" help="Show what would change without changing anything"
|
|
flag "-y --yes" help="Skip the confirmation prompt"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[PACKAGE]…" help="Packages as `manager:package`; defaults to every package in `[bootstrap.packages]`" required=#false var=#true
|
|
example "mise bootstrap packages upgrade --dry-run" help="Show what would be upgraded"
|
|
example "mise bootstrap packages upgrade" help="Upgrade every configured package that is already installed"
|
|
example "mise bootstrap packages upgrade --manager apt --yes" help="Upgrade only apt packages, without a prompt"
|
|
example "mise bootstrap packages upgrade brew:postgresql@17" help="Upgrade one Homebrew formula"
|
|
}
|
|
cmd use help="Add packages to `[bootstrap.packages]` and install them" effect=write {
|
|
alias u
|
|
long_help #"""
|
|
Add packages to `[bootstrap.packages]` and install them
|
|
|
|
Like `mise use` for tools: writes a `"manager:package" = "version"` entry to
|
|
the local mise.toml (or the global config with `-g`), then installs anything
|
|
missing. If the manager is not available on this machine, such as `apt:` on
|
|
macOS, the entry is written without installing.
|
|
|
|
Pin a version with `@`, as in `apt:curl@8.5.0-2`; without `@`, or with
|
|
`@latest`, the entry is `"latest"`. Homebrew puts versions in formula and
|
|
cask names (`brew:postgresql@17`, `brew-cask:temurin@17`), so there `@` is
|
|
part of the name. mas takes numeric App Store IDs and nix takes attribute
|
|
paths or flake references, so neither accepts `@version`. aur, flatpak,
|
|
flatpak-user, pacman, and snap accept `@version` but cannot install a pin,
|
|
so installing skips those entries with a warning.
|
|
"""#
|
|
flag "-e --env" help="Write to the config file for this environment (mise.<ENV>.toml)" {
|
|
conflicts "--global" "--path"
|
|
arg <ENV>
|
|
}
|
|
flag "-g --global" help="Write to the global config (~/.config/mise/config.toml) instead of the local one" {
|
|
long_help #"""
|
|
Write to the global config (~/.config/mise/config.toml) instead of the local one
|
|
|
|
New entries go to the `write_targets.packages` file when that setting is set.
|
|
"""#
|
|
}
|
|
flag "-n --dry-run" help="Show what would change without writing config or installing"
|
|
flag "-p --path --file" help="Write to this config file or directory" conflicts=--global {
|
|
arg <PATH>
|
|
}
|
|
flag "-y --yes" help="Skip the confirmation prompt"
|
|
flag --no-install help="Write the package declarations without checking or installing packages"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <PACKAGE>… help="Packages in `manager:package[@version]` form" var=#true
|
|
example "mise bootstrap packages use apt:curl winget:BurntSushi.ripgrep.MSVC" help="Declare apt and winget packages; each machine installs the ones it can"
|
|
example "mise bootstrap packages use brew:jq brew-cask:firefox" help="On macOS, add a formula and a cask"
|
|
example "mise bootstrap packages use -g brew:postgresql@17" help="Add a versioned Homebrew formula to the global config"
|
|
example "mise bootstrap packages use apt:curl@8.5.0-2" help="Pin an apt package to a version"
|
|
}
|
|
cmd where help="Print the `opt` path of an installed Homebrew formula" effect=read {
|
|
long_help #"""
|
|
Print the `opt` path of an installed Homebrew formula
|
|
|
|
Prints a path such as /opt/homebrew/opt/openssl@3 that keeps pointing at
|
|
the installed version across upgrades. Name the formula as `brew:<formula>`
|
|
or `brew:<owner>/<tap>/<formula>`, using its installed name; aliases are not
|
|
resolved, and a tap-qualified name matches by formula name only. The
|
|
command does not read mise config files, so only environment variables and
|
|
global flags apply. If the formula is not installed, it prints nothing and
|
|
exits with a nonzero status. Works on macOS on Apple silicon and on Linux
|
|
(x86_64 and arm64).
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <PACKAGE> help="Formula to locate, as `brew:<formula>` or `brew:<owner>/<tap>/<formula>`"
|
|
example #"""
|
|
if root="$(mise bootstrap packages where brew:unzip)"; then
|
|
export PATH="$root/bin:$PATH"
|
|
fi
|
|
"""# help="Put a formula's bin directory on PATH when it is installed"
|
|
}
|
|
}
|
|
cmd plan help="Show what applying bootstrap resources would change" effect=read {
|
|
long_help #"""
|
|
Show what applying bootstrap resources would change
|
|
|
|
Covers accounts, packages, files and directories, system and user services,
|
|
the firewall, and Compose projects, in dependency order. Repositories,
|
|
dotfiles, shell activation, macOS defaults, LaunchAgents, systemd user
|
|
units, the login shell, tools, hooks, and the `bootstrap` task are not
|
|
planned; preview the whole run with `mise bootstrap --dry-run`.
|
|
"""#
|
|
flag "-J --json" help="Output a stable machine-readable plan in JSON format"
|
|
flag --detailed-exitcode help="Exit 0 if nothing would change, 2 if something would, 1 on errors or unknown state" {
|
|
long_help #"""
|
|
Exit 0 if nothing would change, 2 if something would, 1 on errors or unknown state
|
|
|
|
A resource's state is unknown when mise cannot reach its declared state on its own, for example a package whose manager is not available on this machine or cannot install the pinned version, or a service whose unit does not exist.
|
|
"""#
|
|
}
|
|
flag --prompt-secrets help="Prompt securely for missing bootstrap secret inputs"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise bootstrap plan" help="Show the planned changes"
|
|
example "mise bootstrap plan --json" help="Print the plan as JSON"
|
|
example "mise bootstrap plan --detailed-exitcode" help="Exit with status 2 if anything would change"
|
|
}
|
|
cmd plugins subcommand_required=#true help="Manage package manager plugins declared in `[bootstrap.plugins]`" effect=read {
|
|
long_help #"""
|
|
Manage package manager plugins declared in `[bootstrap.plugins]`
|
|
|
|
A package plugin adds a package manager, such as one for VS Code extensions,
|
|
that `[bootstrap.packages]` entries can use. `mise bootstrap` installs
|
|
plugins before packages; when you run the narrower commands, run
|
|
`plugins apply` before `packages apply`. Installing a plugin does not
|
|
install its packages.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd apply help="Install package manager plugins declared in `[bootstrap.plugins]`" effect=write {
|
|
long_help #"""
|
|
Install package manager plugins declared in `[bootstrap.plugins]`
|
|
|
|
It does not ask for confirmation.
|
|
"""#
|
|
flag "-n --dry-run" help="Show which plugins would be installed without installing them"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
cmd status help="Show whether declared package manager plugins are installed" effect=read {
|
|
flag --missing help="Exit with status 1 if a declared plugin is not installed"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
}
|
|
cmd remote help="Bootstrap one or more machines over SSH" effect=destructive {
|
|
long_help #"""
|
|
Bootstrap one or more machines over SSH
|
|
|
|
Packs a local project directory, copies it to each target, stages mise
|
|
there, and runs `mise bootstrap`. The directory is `--source`. Without it,
|
|
an inventory host uses its own `source`, then the one in
|
|
`[bootstrap.remote]`, then the current directory; a `--host` target uses
|
|
the current directory. Pick targets by name, `--tag`, or `--all` from
|
|
`[bootstrap.remote.hosts]`, or give any SSH destination with `--host`.
|
|
|
|
Targets need a POSIX shell plus `tar`, `mktemp`, `cksum`, and `uname`;
|
|
Windows targets are not supported. `--dry-run` still connects, uploads, and
|
|
inspects each target, but changes nothing there. With `--adopt`, each target
|
|
adopts the repository as `mise bootstrap --adopt` does, instead of receiving
|
|
a project directory.
|
|
|
|
The `--github-relay-*` flags let targets read private GitHub repositories
|
|
through this machine's credentials for the length of the run, without
|
|
copying a token to them. See https://mise.jdx.dev/bootstrap/github-relay.html.
|
|
"""#
|
|
flag --adopt help="Adopt global configuration or shared dotfile history on each target" {
|
|
conflicts "--source" "--copy-link" "--copy-links" "--exclude"
|
|
arg "<GIT_URL|OWNER/REPO>"
|
|
}
|
|
flag --all help="Select every inventory host"
|
|
flag --bootstrap-command help="Shell command, run on each target, that installs mise and puts it on PATH" {
|
|
conflicts "--mise-bin" "--remote-mise" "--install-mise"
|
|
arg <COMMAND>
|
|
}
|
|
flag --connect-timeout help="SSH connection timeout in seconds" default="10" {
|
|
arg <SECONDS>
|
|
}
|
|
flag --copy-link help="Copy the target of this source-relative symbolic link instead of the link; repeat for more" var=#true {
|
|
arg <PATH>
|
|
}
|
|
flag --copy-links help="Copy the targets of every symbolic link in the source instead of the links"
|
|
flag --exclude help="Another pattern to leave out of the archive; repeat for more" var=#true {
|
|
arg <PATTERN>
|
|
}
|
|
flag --fail-fast help="Stop after the first failed target"
|
|
flag --force-dotfiles help="Overwrite files on each target that conflict with whole-file dotfile entries"
|
|
flag --host help="SSH destination that is not in the inventory (`[user@]host`); repeat for more" var=#true {
|
|
arg "<[USER@]HOST>"
|
|
}
|
|
flag "-i --identity-file" help="SSH identity file, overriding the inventory and SSH config" {
|
|
arg <PATH>
|
|
}
|
|
flag "-n --dry-run" help="Show what would change on each target without changing it" {
|
|
long_help #"""
|
|
Show what would change on each target without changing it
|
|
|
|
It still connects to each target, uploads the project, stages mise, and inspects the target.
|
|
"""#
|
|
}
|
|
flag --install-mise help="Install the provisioned mise on each host instead of only staging it" require_equals=#true value_optional=#true default_missing="~/.local/bin/mise" {
|
|
long_help #"""
|
|
Install the provisioned mise on each host instead of only staging it
|
|
|
|
Defaults to `~/.local/bin/mise`; pass `--install-mise=<PATH>` for another path.
|
|
"""#
|
|
conflicts "--remote-mise" "--bootstrap-command" "--no-install-mise"
|
|
arg "[PATH]" required=#false var_min=0 var_max=1
|
|
}
|
|
flag --keep-staging help="Keep the remote staging directory for debugging"
|
|
flag --mise-bin help="Upload this local mise executable, for platforms without an official release binary" {
|
|
conflicts "--remote-mise" "--bootstrap-command"
|
|
arg <PATH>
|
|
}
|
|
flag --no-install-mise help="Do not install mise on the host, even when the selected hosts configure it"
|
|
flag --only help="Run only these parts on each target" var=#true conflicts=--skip {
|
|
long_help #"""
|
|
Run only these parts on each target
|
|
|
|
Repeat the flag or separate parts with commas. Cannot be combined with `--skip`.
|
|
"""#
|
|
arg <PART> delimiter=, {
|
|
choices {
|
|
choice plugins
|
|
choice packages
|
|
choice accounts
|
|
choice files
|
|
choice services
|
|
choice firewall
|
|
choice compose
|
|
choice repos
|
|
choice dotfiles
|
|
choice mise-shell-activate {
|
|
alias shell hide=#true
|
|
}
|
|
choice macos-defaults {
|
|
alias defaults hide=#true
|
|
}
|
|
choice macos-launchd-agents {
|
|
alias launchd hide=#true
|
|
}
|
|
choice linux-systemd-units {
|
|
alias systemd hide=#true
|
|
}
|
|
choice user
|
|
choice tools
|
|
choice task
|
|
choice final-hook
|
|
}
|
|
}
|
|
}
|
|
flag --port help="SSH port, overriding the inventory and SSH config" {
|
|
arg <PORT>
|
|
}
|
|
flag --prompt-secrets help="Prompt securely for missing secret inputs on the remote host"
|
|
flag --remote-env help="Config environments to load on each target; repeat or separate with commas (for example, ci,dotfiles)" var=#true {
|
|
arg <ENV> delimiter=,
|
|
}
|
|
flag --remote-mise help="Existing mise executable name or path; relative paths use the staged project" {
|
|
conflicts "--mise-bin" "--bootstrap-command" "--install-mise"
|
|
arg <COMMAND>
|
|
}
|
|
flag --skip help="Skip these parts on each target" var=#true {
|
|
long_help #"""
|
|
Skip these parts on each target
|
|
|
|
Repeat the flag or separate parts with commas. Cannot be combined with `--only`.
|
|
"""#
|
|
arg <PART> delimiter=, {
|
|
choices {
|
|
choice plugins
|
|
choice packages
|
|
choice accounts
|
|
choice files
|
|
choice services
|
|
choice firewall
|
|
choice compose
|
|
choice repos
|
|
choice dotfiles
|
|
choice mise-shell-activate {
|
|
alias shell hide=#true
|
|
}
|
|
choice macos-defaults {
|
|
alias defaults hide=#true
|
|
}
|
|
choice macos-launchd-agents {
|
|
alias launchd hide=#true
|
|
}
|
|
choice linux-systemd-units {
|
|
alias systemd hide=#true
|
|
}
|
|
choice user
|
|
choice tools
|
|
choice task
|
|
choice final-hook
|
|
}
|
|
}
|
|
}
|
|
flag --source help="Local directory to archive and send to each target" {
|
|
arg <DIR>
|
|
}
|
|
flag --ssh-option help="OpenSSH `-o` option; repeat for multiple options" var=#true {
|
|
arg <OPTION>
|
|
}
|
|
flag --tag help="Select configured hosts with this tag; repeat to match any tag" var=#true {
|
|
arg <TAG>
|
|
}
|
|
flag --update help="Refresh package metadata and update repositories on each target"
|
|
flag "-y --yes" help="Skip confirmation prompts on each target"
|
|
flag --github-relay-read-only help="Borrow read-only GitHub access for this run (Linux and macOS only)" {
|
|
long_help #"""
|
|
Borrow read-only GitHub access for this run (Linux and macOS only)
|
|
|
|
Needs exactly one of `--github-relay-repo` or `--github-relay-all-repos`.
|
|
"""#
|
|
}
|
|
flag --github-relay-repo help="Repository the targets may read through the relay; repeat for more (needs `--github-relay-read-only`)" var=#true {
|
|
arg "<OWNER/REPO>"
|
|
}
|
|
flag --github-relay-all-repos help="Let targets read every repository your local credentials can read (needs `--github-relay-read-only`)"
|
|
flag --github-relay-log-requests help="Log sanitized relay requests on local stderr (needs `--github-relay-read-only`)" conflicts=--github-relay-no-log-requests
|
|
flag --github-relay-no-log-requests help="Turn off request logging, overriding the `github_relay` settings (needs `--github-relay-read-only`)"
|
|
flag --github-relay-log-format help="Relay log and summary format, `text` or `jsonl` (needs `--github-relay-read-only`)" {
|
|
arg <FORMAT>
|
|
}
|
|
flag --github-relay-max-duration help="End borrowed access after a duration such as `1h`; `0s` lasts the whole run (needs `--github-relay-read-only`)" {
|
|
arg <DURATION>
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TARGET]…" help="Inventory host names from `[bootstrap.remote.hosts]`" required=#false var=#true
|
|
example "mise bootstrap remote --host devbox --dry-run" help="Preview a run on a host that is not in the inventory"
|
|
example "mise bootstrap remote cache" help="Bootstrap one inventory host"
|
|
example "mise bootstrap remote --tag canary --yes" help="Bootstrap every inventory host tagged canary, without prompts"
|
|
example "mise bootstrap remote --all --fail-fast" help="Bootstrap every inventory host and stop at the first failure"
|
|
example "mise bootstrap remote --host ubuntu@cache.example.com -i ~/.ssh/mise-cache --install-mise" help="Leave mise installed on the host after the run"
|
|
example "mise bootstrap remote --host devbox --github-relay-read-only --github-relay-repo example/setup" help="Let the host read one private GitHub repository during the run"
|
|
complete path type=path
|
|
complete dir type=dir
|
|
}
|
|
cmd repos subcommand_required=#true help="Manage Git repositories from `[bootstrap.repos]`" effect=read {
|
|
long_help #"""
|
|
Manage Git repositories from `[bootstrap.repos]`
|
|
|
|
A repository with uncommitted changes, a different origin, or something
|
|
other than a Git checkout at its path stops `apply` and `update` before
|
|
anything changes. Pass `--skip-dirty` to skip repositories with uncommitted
|
|
changes and continue with the rest.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd apply help="Clone missing Git repositories and check out configured refs" effect=write {
|
|
flag "-n --dry-run" help="Show what would change without changing anything"
|
|
flag "-y --yes" help="Skip the confirmation prompt"
|
|
flag --skip-dirty help="Skip repositories with local changes instead of failing"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
cmd exec help="Run a command in each configured Git repository" {
|
|
long_help #"""
|
|
Run a command in each configured Git repository
|
|
|
|
Put the command and its arguments after `--`. Paths before `--` select
|
|
repositories. The command runs directly, without a shell, so pipes and `&&`
|
|
do not work. Missing or conflicting repositories are skipped with a
|
|
warning. Use `--continue-on-error` to visit the rest after a failure.
|
|
"""#
|
|
flag "-c --continue-on-error" help="Continue running in other repositories after a command fails"
|
|
flag "-n --dry-run" help="Print the commands that would run without running them"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[PATH]…" help="Run only in repositories at these paths, as written in config or expanded" required=#false var=#true
|
|
arg "<-- COMMAND>…" help="Command and arguments to run in each repository" var=#true
|
|
example "mise bootstrap repos exec -- git status --short" help="Show uncommitted changes in every repository"
|
|
example "mise bootstrap repos exec ~/src/mise -- git log -1" help="Run a command in one repository"
|
|
example "mise bootstrap repos exec --continue-on-error -- git fetch" help="Fetch every repository, even after one fails"
|
|
}
|
|
cmd status help="Show the state of Git repositories from `[bootstrap.repos]`" effect=read {
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --missing help="Exit with status 1 if any repository differs from the config (all are still listed)"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
cmd update help="Clone missing Git repositories and fast-forward the rest" effect=write {
|
|
long_help #"""
|
|
Clone missing Git repositories and fast-forward the rest
|
|
|
|
For a repository without a `ref`, fetches and fast-forwards the current
|
|
branch; one with a detached HEAD is skipped with a warning. A repository
|
|
with a `ref` is checked out at that ref.
|
|
"""#
|
|
flag "-n --dry-run" help="Show what would change without changing anything"
|
|
flag "-y --yes" help="Skip the confirmation prompt"
|
|
flag --skip-dirty help="Skip repositories with local changes instead of failing"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[PATH]…" help="Only update repositories at these paths, as written in config or expanded (for example ~/src/mise)" required=#false var=#true
|
|
example "mise bootstrap repos update --dry-run" help="Show the Git commands that would run"
|
|
example "mise bootstrap repos update ~/src/mise" help="Update one repository"
|
|
}
|
|
}
|
|
cmd secrets subcommand_required=#true help="Inspect bootstrap secret inputs without revealing their values" effect=read {
|
|
long_help #"""
|
|
Inspect bootstrap secret inputs without revealing their values
|
|
|
|
Secret inputs are values declared in `[bootstrap.secrets]` that file and
|
|
dotfile templates read with `secret()`. mise reads them from environment
|
|
variables, or prompts for missing ones with `--prompt-secrets`.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd status help="Show whether declared bootstrap secret inputs are available" effect=read {
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --missing help="Exit with status 1 if a declared secret input is unset, empty, or not valid Unicode"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
}
|
|
cmd services subcommand_required=#true help="Manage services from `[bootstrap.services]`" effect=read {
|
|
long_help #"""
|
|
Manage services from `[bootstrap.services]`
|
|
|
|
System-scope entries, the default for entries without `builtin`, start,
|
|
stop, enable, disable, or mask systemd units that already exist on Linux.
|
|
User-scope entries (`scope = "user"`, or any `builtin` service) define a
|
|
service for the current user on every platform: a systemd user unit on
|
|
Linux, a LaunchAgent on macOS, or a Scheduled Task on Windows. For options
|
|
that only one platform has, see `mise bootstrap linux systemd-units` and
|
|
`mise bootstrap macos launchd-agents`.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd apply help="Apply the service state declared in `[bootstrap.services]`" effect=destructive {
|
|
flag "-n --dry-run" help="Show what would change without changing anything"
|
|
flag "-y --yes" help="Skip the confirmation prompt"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
cmd remove help="Uninstall a user-scope service" effect=destructive {
|
|
long_help #"""
|
|
Uninstall a user-scope service
|
|
|
|
Removing a user-scope entry from config does not uninstall its systemd
|
|
unit, LaunchAgent, or Scheduled Task. Use this command to uninstall it,
|
|
whether or not it is still declared. If the entry is still declared, the
|
|
next `mise bootstrap` installs it again.
|
|
|
|
It removes the dev.mise.NAME.service unit or dev.mise.NAME.plist agent, so it
|
|
also removes one that [bootstrap.linux.systemd.units] or
|
|
[bootstrap.macos.launchd.agents] wrote under that name. It does not remove
|
|
.timer units.
|
|
"""#
|
|
flag "-n --dry-run" help="Show what would be removed without removing it"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <NAME> help="Name of the installed user service"
|
|
example "mise bootstrap services remove mise-history --dry-run" help="Preview uninstalling the user service named mise-history"
|
|
}
|
|
cmd status help="Show the state of services from `[bootstrap.services]`" effect=read {
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --missing help="Exit with status 1 if any service differs from the config (all are still listed)"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
example "mise bootstrap services status" help="Show the state of every declared service"
|
|
example "mise bootstrap services apply --dry-run" help="Show what would change"
|
|
example "mise bootstrap services remove mise-history" help="Uninstall a user service"
|
|
}
|
|
cmd status help="Show the state of every configured bootstrap part" effect=read {
|
|
alias ls
|
|
long_help #"""
|
|
Show the state of every configured bootstrap part
|
|
|
|
Lists secret inputs, packages, accounts, files and directories, services,
|
|
the firewall, Compose projects, repositories, dotfiles, shell activation,
|
|
macOS defaults, LaunchAgents, systemd user units, the login shell, `[tools]`,
|
|
and the system dependencies of those tools, without changing anything.
|
|
Checking dotfiles can render trusted templates, which may run `exec()`.
|
|
|
|
`--missing` exits with status 1 if anything differs from the config; it
|
|
still lists every entry.
|
|
"""#
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --missing help="Exit with status 1 if anything differs from the config (all entries are still listed)"
|
|
flag --prompt-secrets help="Prompt securely for missing bootstrap secret inputs"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise bootstrap status" help="List every configured part and its state"
|
|
example "mise bootstrap status --missing" help="Exit with status 1 if anything differs from the config"
|
|
example "mise bootstrap status --json" help="Print the state as JSON"
|
|
}
|
|
cmd systemd hide=#true subcommand_required=#true help="Manage systemd user units (use `mise bootstrap linux systemd-units`)" effect=read {
|
|
long_help #"""
|
|
Manage systemd user units (use `mise bootstrap linux systemd-units`)
|
|
|
|
This older spelling keeps working.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd apply hide=#true help="Install and start the configured systemd user units" effect=write {
|
|
flag "-n --dry-run" help="Show what would change without changing anything"
|
|
flag "-y --yes" help="Skip the confirmation prompt"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
cmd status hide=#true help="Show the state of the configured systemd user units" effect=read {
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --missing help="Exit with status 1 if any unit differs from the config (all are still listed)"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
}
|
|
cmd unapply help="Remove what a config environment's bootstrap sections created" effect=destructive {
|
|
long_help #"""
|
|
Remove what a config environment's bootstrap sections created
|
|
|
|
Removes the files, directories, user services, systemd user units, and
|
|
dotfile entries and edits that the named environments declare. Each named
|
|
environment's config is loaded for this command even when `-E` or
|
|
`MISE_ENV` does not select it.
|
|
|
|
mise plans the removal from the current config, not from a record of past
|
|
runs, so keep the environment's config files until cleanup is done. Anything
|
|
another selected config still declares is kept, and so is anything changed
|
|
since it was applied unless you pass `--force`. A directory is removed only
|
|
if it is empty afterward. Dotfile sources and config entries are left in
|
|
place.
|
|
|
|
It asks before removing anything unless `--yes`, `MISE_YES`, or the `yes`
|
|
setting is set, and fails when there is no terminal to ask. mise turns on
|
|
the `yes` setting when `CI` is set.
|
|
|
|
Packages, repositories, and Compose projects are not removed; the output
|
|
says how to clean them up. Accounts, system services, the firewall, and
|
|
other sections are left alone.
|
|
"""#
|
|
flag "-f --force" help="Remove targets that changed since they were applied"
|
|
flag "-n --dry-run" help="Show what would be removed without removing anything"
|
|
flag "-y --yes" help="Skip the confirmation prompt"
|
|
flag --prompt-secrets help="Prompt securely for missing bootstrap secret inputs"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <ENV>… help="Config environments whose resources should be removed" var=#true
|
|
example "mise bootstrap unapply ssh --dry-run" help="Preview what removing the `ssh` environment's resources would do"
|
|
example "mise bootstrap unapply ssh" help="Remove them after a confirmation prompt"
|
|
example "mise bootstrap unapply ssh gpg --yes" help="Remove the resources of two environments without a prompt"
|
|
}
|
|
cmd user subcommand_required=#true help="Manage your login shell from `[bootstrap.user]`" effect=read {
|
|
long_help #"""
|
|
Manage your login shell from `[bootstrap.user]`
|
|
|
|
Run it as the user whose shell should change. The new shell applies to
|
|
future logins, not to the shell running this command.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd apply help="Set your login shell from `[bootstrap.user]`" effect=write {
|
|
flag "-n --dry-run" help="Show what would change without changing anything"
|
|
flag "-y --yes" help="Skip the confirmation prompt"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
cmd status help="Show whether your login shell matches `[bootstrap.user]`" effect=read {
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --missing help="Exit with status 1 if your login shell differs from the config"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
}
|
|
example "mise bootstrap --dry-run" help="Preview every configured part"
|
|
example "mise bootstrap" help="Apply every configured part"
|
|
example "mise bootstrap --only dotfiles,tools" help="Apply only dotfiles and tools"
|
|
example "mise bootstrap --skip tools,task" help="Apply everything except tools and the bootstrap task"
|
|
example "mise bootstrap --force-dotfiles" help="Replace files that conflict with whole-file dotfile entries"
|
|
example "mise bootstrap --from git@github.com:example/workstation.git" help="Clone a bootstrap project and apply it"
|
|
example "mise -E work bootstrap --from git@github.com:example/workstation.git" help="Do the same and also load the project's mise.work.toml"
|
|
example "mise bootstrap --from https://github.com/example/dotfiles.git --from-dir ~/.dotfiles --config-dir .config/mise" help="Clone a dotfiles repository and link ~/.config/mise to its .config/mise"
|
|
example "mise bootstrap --adopt example/mise-config" help="Clone global config into ~/.config/mise, then apply it"
|
|
example "mise bootstrap --adopt example/setup --replace-history --yes" help="Use a setup repository's dotfile history instead of this machine's"
|
|
example "mise bootstrap --update" help="Refresh package metadata and fast-forward repositories first"
|
|
}
|
|
cmd cache help="Manage the mise cache" effect=read {
|
|
long_help #"""
|
|
Manage the mise cache
|
|
|
|
The cache holds data mise can fetch or rebuild again, such as version lists and
|
|
release metadata. With no subcommand, prints the cache directory, like
|
|
`mise cache path`. See https://mise.jdx.dev/cache-behavior.html.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd clear help="Delete cached data" effect=write {
|
|
alias c clean
|
|
long_help #"""
|
|
Delete cached data
|
|
|
|
With no arguments, deletes the whole cache directory, the cached environment,
|
|
and every task's cached artifacts. With TOOL arguments, deletes only the cached
|
|
data of those tools, such as their version lists. With --task, deletes only that
|
|
task's cached artifacts. Installed tools are not removed; mise downloads or
|
|
rebuilds what it needs again.
|
|
"""#
|
|
flag --outdate help="Mark all cache files as old" hide=#true
|
|
flag --task help="[experimental] Clear task artifact cache entries for a task name or pattern" {
|
|
conflicts TOOL "--outdate"
|
|
arg <TASK>
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TOOL]…" help="Only clear the cache of these tools, such as `node`" required=#false var=#true
|
|
example "mise cache clear" help="Clear the whole cache"
|
|
example "mise cache clear node" help="Refresh node's version list"
|
|
example "mise cache clear --task build" help="[experimental] Forget the build task's cached artifacts"
|
|
}
|
|
cmd path help="Print the cache directory path" effect=read {
|
|
alias dir
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
cmd prune help="Remove cache files that have not been accessed recently" effect=write {
|
|
alias p
|
|
long_help #"""
|
|
Remove cache files that have not been accessed recently
|
|
|
|
Removes cache files not accessed within the `cache_prune_age` setting. Set it to
|
|
`0s` to keep cache files indefinitely. mise also prunes the cache now and then
|
|
on its own.
|
|
"""#
|
|
flag "-v --verbose" help="Show pruned files" var=#true count=#true
|
|
flag --dry-run help="Show what would be pruned without deleting anything"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TOOL]…" help="Only prune the cache of these tools, such as `node`" required=#false var=#true
|
|
example "mise cache prune --dry-run" help="List what would be removed"
|
|
}
|
|
cmd task help="[experimental] Inspect artifact cache entries for a task" effect=read {
|
|
long_help #"""
|
|
[experimental] Inspect artifact cache entries for a task
|
|
|
|
Lists the artifact cache entries of the tasks matching TASK with their key,
|
|
size, run time, last access, and outputs, and marks the entry that matches the
|
|
task's current inputs. Remove entries with `mise cache clear --task TASK`. See
|
|
https://mise.jdx.dev/tasks/caching.html#enable-artifact-caching.
|
|
"""#
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <TASK> help="Task name or pattern to inspect"
|
|
example "mise cache task build" help="List the build task's cache entries"
|
|
}
|
|
}
|
|
cmd completion help="Generate shell completions" effect=read {
|
|
alias complete completions
|
|
long_help #"""
|
|
Generate shell completions
|
|
|
|
Prints a completion script for SHELL, or with --install writes it where that
|
|
shell loads completions from. The script asks mise for candidates as you type,
|
|
so it also completes your project's task names and tool versions. See
|
|
https://mise.jdx.dev/shell-setup.html#autocompletion.
|
|
"""#
|
|
flag "-s --shell" help="Shell type to generate completions for" hide=#true {
|
|
arg <SHELL> {
|
|
choices {
|
|
choice bash
|
|
choice fish
|
|
choice nu {
|
|
alias nushell
|
|
}
|
|
choice powershell {
|
|
alias pwsh
|
|
}
|
|
choice zsh
|
|
}
|
|
}
|
|
}
|
|
flag --include-bash-completion-lib help="No longer has any effect; kept so older setup scripts keep working" hide=#true
|
|
flag --usage help="No longer has any effect; kept so older setup scripts keep working" hide=#true
|
|
flag --install help="Install the script where this shell looks for it, instead of printing it" effect=write {
|
|
long_help #"""
|
|
Install the script where this shell looks for it, instead of printing it
|
|
|
|
It writes only the script file, never a shell startup file or PowerShell
|
|
profile. If your shell needs a one-time setup line, such as zsh's `fpath+=`
|
|
or PowerShell's dot-source, mise prints it for you to add.
|
|
"""#
|
|
}
|
|
flag --force help="Replace a file at the target path that mise did not write" requires=--install effect=write
|
|
flag --tool help="Generate completions for a tool installed with the `packslip:` backend" {
|
|
long_help #"""
|
|
Generate completions for a tool installed with the `packslip:` backend
|
|
|
|
TOOL is the tool or one of its executables; with --install, pass the
|
|
executable's name. The script matches the version active in the current
|
|
directory and comes from the most verifiable source its packslip offers: a
|
|
file the vendor shipped, a script derived from its CLI spec, or a command of
|
|
the tool's own. With --install, mise writes a small stub that asks mise for
|
|
the script each time the shell completes the tool, so it follows version
|
|
changes without being rewritten.
|
|
"""#
|
|
arg <TOOL>
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[SHELL]" help="Shell type to generate completions for (required)" required=#false required_unless=--shell {
|
|
choices {
|
|
choice bash
|
|
choice fish
|
|
choice nu {
|
|
alias nushell
|
|
}
|
|
choice powershell {
|
|
alias pwsh
|
|
}
|
|
choice zsh
|
|
}
|
|
}
|
|
example "mise completion zsh --install" help="Install completions for zsh; bash, fish, and powershell work the same way"
|
|
example "mise completion zsh" help="Print the script to inspect it or save it somewhere else"
|
|
example "mise completion zsh --tool hk --install" help="Install completions for hk, a tool installed with the packslip backend"
|
|
}
|
|
cmd config help="Manage config files" effect=read {
|
|
alias cfg toml
|
|
long_help #"""
|
|
Manage config files
|
|
|
|
With no subcommand, lists the config files mise loads, from lowest to highest precedence, like `mise config ls`; the flags below apply to that listing.
|
|
"""#
|
|
flag --truncate help="Truncate long terminal output to fit the available width" negate=--no-truncate default="true"
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --no-header help="Do not print the table header" {
|
|
alias "--no-headers" hide=#true
|
|
}
|
|
flag --tracked-configs help="List every config file mise has loaded, in any project" {
|
|
long_help #"""
|
|
List every config file mise has loaded, in any project
|
|
|
|
mise remembers the config files it loads so `mise prune` keeps the versions
|
|
they use.
|
|
"""#
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd explain help="Describe each key in a mise TOML file" effect=read {
|
|
long_help #"""
|
|
Describe each key in a mise TOML file
|
|
|
|
Lists every key the file sets, with its line and what it does, from the same schema
|
|
editors use to check a config. A key mise does not read is marked, with the known key it
|
|
most likely meant, and so is a deprecated one. Reads the highest-precedence loaded TOML
|
|
file by default; select another with `--file`, `--global`, or `--system`.
|
|
"""#
|
|
flag "-f --file --path" help="Config file to read, or a directory whose config file to read" {
|
|
long_help #"""
|
|
Config file to read, or a directory whose config file to read
|
|
|
|
Defaults to the highest-precedence loaded TOML file other than the global override files.
|
|
"""#
|
|
arg <FILE>
|
|
}
|
|
flag "-g --global" help="Read the global config file" {
|
|
conflicts "--file" "--system"
|
|
}
|
|
flag --system help="Read the system config file" {
|
|
conflicts "--file" "--global"
|
|
}
|
|
flag --override help="Read the global override file, `config.override.toml`" {
|
|
conflicts "--file" "--global" "--system"
|
|
}
|
|
flag "-J --json" help="Print the keys as JSON"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[KEY]" help="Dotted key path to describe, with the keys under it; omit for the whole file" help_long=#"""
|
|
Dotted key path to describe, with the keys under it; omit for the whole file
|
|
|
|
Quote a key with a dot in its name as TOML does, inside shell quotes: `'tasks."build.sh"'`. Unquoted, `tasks.build.sh` still finds the task `build.sh` when there is no key `build` in the way.
|
|
"""# required=#false
|
|
example #"""
|
|
mise config explain
|
|
~/src/app/mise.toml
|
|
1 tools dev tools to use
|
|
2 tools.node a version of the tool, or a table with its version and options
|
|
4 settings mise settings
|
|
5 settings.experimantal not a key mise reads; did you mean experimental?
|
|
"""# help="Describe the keys of the project config"
|
|
example "mise config explain tasks" help="Describe only the keys under [tasks]"
|
|
complete file type=path
|
|
complete key run="mise __complete_word__ --candidates key --line={{ words | shell_join | shell_quote }}"
|
|
}
|
|
cmd get help="Print a value from one mise TOML file" effect=read {
|
|
long_help #"""
|
|
Print a value from one mise TOML file
|
|
|
|
Reads the highest-precedence loaded TOML file by default. Select another with
|
|
`--file`, `--global`, or `--system`. This reads stored values, not the merged or
|
|
template-expanded environment; use `mise env` for the resolved environment.
|
|
"""#
|
|
flag "-f --file --path" help="Config file to read, or a directory whose config file to read" {
|
|
long_help #"""
|
|
Config file to read, or a directory whose config file to read
|
|
|
|
For a directory, mise reads the TOML config file already there, such as `.mise.toml`, or `mise.toml` when there is none. Defaults to the highest-precedence loaded TOML file other than the global override files.
|
|
"""#
|
|
arg <FILE>
|
|
}
|
|
flag "-g --global" help="Read the global config file" {
|
|
conflicts "--file" "--system"
|
|
}
|
|
flag --system help="Read the system config file" {
|
|
conflicts "--file" "--global"
|
|
}
|
|
flag --override help="Read the global override file, `config.override.toml`" {
|
|
conflicts "--file" "--global" "--system"
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[KEY]" help="Dotted key path to print, such as `tools.python`; omit to print the whole file" help_long=#"""
|
|
Dotted key path to print, such as `tools.python`; omit to print the whole file
|
|
|
|
Quote a key with a dot in its name as TOML does, inside shell quotes: `'tasks."build.sh"'`. Unquoted, `tasks.build.sh` still finds the task `build.sh` when there is no key `build` in the way.
|
|
"""# required=#false
|
|
example #"""
|
|
mise config get tools.python
|
|
3.13
|
|
"""# help="Print the python request"
|
|
example "mise config get" help="Print the whole file"
|
|
complete file type=path
|
|
complete key run="mise __complete_word__ --candidates key --line={{ words | shell_join | shell_quote }}"
|
|
}
|
|
cmd ls help="List config files currently in use, from lowest to highest precedence" effect=read {
|
|
alias list
|
|
long_help #"""
|
|
List config files currently in use, from lowest to highest precedence
|
|
|
|
Later files override earlier ones. Global override files
|
|
(`config.override.toml`) rank above all project config and are labeled
|
|
`override`.
|
|
"""#
|
|
flag --truncate help="Truncate long terminal output to fit the available width" negate=--no-truncate default="true"
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --no-header help="Do not print the table header" {
|
|
alias "--no-headers" hide=#true
|
|
}
|
|
flag --tracked-configs help="List every config file mise has loaded, in any project" {
|
|
long_help #"""
|
|
List every config file mise has loaded, in any project
|
|
|
|
mise remembers the config files it loads so `mise prune` keeps the versions
|
|
they use.
|
|
"""#
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example #"""
|
|
mise config ls
|
|
Path Tools
|
|
~/.config/mise/config.toml node, python
|
|
~/work/api/mise.toml node, terraform
|
|
"""# help="List the loaded config files and the tools each one requests"
|
|
}
|
|
cmd set help="Set a value in one mise TOML file" effect=write {
|
|
long_help #"""
|
|
Set a value in one mise TOML file
|
|
|
|
Edits the highest-precedence loaded TOML file by default, which may be an
|
|
environment-specific override. Use `--file` to select an existing project file,
|
|
or `--global`/`--system` to edit or create those config files.
|
|
|
|
This edits configuration without installing tools. Use `mise use` to install and
|
|
select a version together. For environment variables and settings, `mise set`
|
|
and `mise settings set` are shorter, but they choose their file differently:
|
|
`mise set` writes the nearest `mise.toml`, and `mise settings set` writes the
|
|
global config unless you pass `--local`.
|
|
|
|
Known settings use their declared type; boolean settings accept `true`,
|
|
`false`, `yes`, `no`, `1`, and `0`. For other keys, `true` and `false` become
|
|
booleans and every other value is stored as a string. Use `--type bool` to
|
|
store `yes`, `no`, `1` or `0` as a boolean, `--type string` to store `true`
|
|
or `false` as text, and `--type integer` for a number.
|
|
"""#
|
|
flag "-f --file --path" help="Config file to edit, or a directory whose config file to edit" {
|
|
long_help #"""
|
|
Config file to edit, or a directory whose config file to edit
|
|
|
|
For a directory, mise edits the TOML config file already there, such as `.mise.toml`, or `mise.toml` when there is none. Defaults to the highest-precedence loaded TOML file other than the global override files.
|
|
"""#
|
|
arg <FILE>
|
|
}
|
|
flag "-g --global" help="Edit the global config file" {
|
|
conflicts "--file" "--system"
|
|
}
|
|
flag --override help="Edit the global override file, `config.override.toml`" {
|
|
conflicts "--file" "--global" "--system"
|
|
}
|
|
flag --system help="Edit the system config file" {
|
|
conflicts "--file" "--global"
|
|
}
|
|
flag --append help="Append the value to a list without duplicating an existing entry" conflicts=--remove
|
|
flag --remove help="Remove the value from an existing list" conflicts=--append
|
|
flag "-t --type" help="TOML type to store the value as; inferred from the value by default" default=infer {
|
|
arg <TYPE> {
|
|
choices {
|
|
choice infer
|
|
choice string
|
|
choice integer
|
|
choice float
|
|
choice bool
|
|
choice list
|
|
choice set
|
|
}
|
|
}
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <KEY> help="Dotted key path to set, such as `tools.python`" help_long=#"""
|
|
Dotted key path to set, such as `tools.python`
|
|
|
|
Quote a key with a dot in its name as TOML does, inside shell quotes: `'tasks."build.sh"'`. Unquoted, `tasks.build.sh` still finds the task `build.sh` when there is no key `build` in the way.
|
|
"""#
|
|
arg "[VALUE]" help="The value to set the key to (optional if provided as KEY=VALUE)" required=#false
|
|
example "mise config set tools.python 3.13" help="Request python 3.13"
|
|
example "mise config set env.NODE_ENV production" help="Set an environment variable"
|
|
example "mise config set settings.jobs 4" help="Settings get their declared type, here an integer"
|
|
example "mise config set settings.disable_tools node,rust" help="List settings take comma-separated values"
|
|
example "mise config set --append env._.path ~/.local/bin" help="Add a PATH entry unless it is already there"
|
|
example "mise config set --remove env._.path ~/.local/bin" help="Remove that PATH entry"
|
|
example "mise config set -g settings.experimental true" help="Edit the global config"
|
|
complete file type=path
|
|
complete key run="mise __complete_word__ --candidates key --line={{ words | shell_join | shell_quote }}"
|
|
}
|
|
}
|
|
cmd current hide=#true help="Show the active tool versions" effect=read {
|
|
long_help #"""
|
|
Show the active tool versions
|
|
|
|
Similar to `mise ls --current`, but prints only the tool and its versions, which
|
|
is easier to use in scripts. Versions that are not installed are printed too;
|
|
when listing every tool, mise also warns about them.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[PLUGIN]" help="Only show this tool, such as `node` or `npm:prettier`" required=#false
|
|
example #"""
|
|
mise current
|
|
python 3.13.1 3.12.8
|
|
shfmt 3.10.0
|
|
node 24.11.0
|
|
"""# help="Print every active tool in `.tool-versions` format"
|
|
example #"""
|
|
mise current node
|
|
24.11.0
|
|
"""# help="Print the active node version"
|
|
example #"""
|
|
mise current python
|
|
3.13.1 3.12.8
|
|
"""# help="A tool can have several active versions"
|
|
}
|
|
cmd deactivate help="Print the script to disable mise in the current shell session" effect=read {
|
|
long_help #"""
|
|
Print the script to disable mise in the current shell session
|
|
|
|
In a shell where mise is activated, run `mise deactivate`: the activation
|
|
function evaluates the script for you. Calling the executable directly
|
|
(`command mise deactivate`) only prints the script, so evaluate it yourself as
|
|
in the examples below. New shells still activate mise; remove the line from your
|
|
shell startup file to stop that.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise deactivate" help="Turn mise off in an activated shell"
|
|
example "eval \"$(command mise deactivate)\"" help="Bash or Zsh, calling the executable rather than the activation function"
|
|
example "command mise deactivate | source" help="Fish, calling the executable rather than the activation function"
|
|
}
|
|
cmd daemons args_conflicts_with_subcommands=#true help="[experimental] Manage project daemons with pitchfork" effect=read {
|
|
alias daemon
|
|
long_help #"""
|
|
[experimental] Manage project daemons with pitchfork
|
|
|
|
Declare long-running processes in `[daemons]`, either as commands or as service presets such as `postgres` and `redis`, and mise runs them under pitchfork with the project's tools and environment. Requires `experimental = true`.
|
|
|
|
With no subcommand, lists the project's daemons like `mise daemons ls`.
|
|
|
|
See https://mise.jdx.dev/daemons.html
|
|
"""#
|
|
flag --json help="Output in JSON format, including ports, URLs, and data directories"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd providers help="[experimental] Manage shared servers from global `[daemon_providers]`" effect=read {
|
|
long_help #"""
|
|
[experimental] Manage shared servers from global `[daemon_providers]`
|
|
|
|
A shared server is one PostgreSQL, CockroachDB, or NATS server declared in your global config, with a separate database or account for each checkout that uses it. Not supported on Windows. See https://mise.jdx.dev/daemons/sharing.html#shared-server-providers
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd ls help="[experimental] List shared servers" effect=read {
|
|
flag --json help="Output in JSON format"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
cmd start help="[experimental] Start shared servers" {
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[NAMES]…" required=#false var=#true
|
|
}
|
|
cmd stop help="[experimental] Stop shared servers (data is kept)" {
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[NAMES]…" required=#false var=#true
|
|
}
|
|
cmd restart help="[experimental] Restart shared servers with their current configuration" {
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[NAMES]…" required=#false var=#true
|
|
}
|
|
example "mise daemons providers ls" help="List shared servers"
|
|
example "mise daemons providers start local-postgres" help="Start the shared server named local-postgres"
|
|
}
|
|
cmd __provider-exec hide=#true {
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <MANIFEST>
|
|
arg <COMMAND>
|
|
}
|
|
cmd __resource hide=#true help="A project-owned readiness process: it never starts or stops the server itself." {
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <PROVIDER>
|
|
arg <RESOURCE>
|
|
}
|
|
cmd start help="[experimental] Start project daemons and the daemons they depend on" unknown_flags=value {
|
|
long_help #"""
|
|
[experimental] Start project daemons and the daemons they depend on
|
|
|
|
Installs missing tools and registers the project's daemons with pitchfork, then starts the selected daemons and waits until they are ready. With no names, starts the `default` group from `[daemon_groups]` when the project declares one, otherwise every project daemon.
|
|
|
|
Select daemons by name (`api` or a qualified ID such as `shop/api`), by group with `--group NAME`, or all of them with `--all`. `--all` covers every daemon in this project, including those the `default` group leaves out; unlike pitchfork's own `--all`, it never reaches other projects, and it cannot be combined with names or `--group`. Other flags pass through to `pitchfork start`.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[ARGS]…" help="Daemon names (short, such as `api`, or qualified, such as `shop/api`), `--group NAME`, and flags passed to pitchfork" required=#false double_dash=automatic var=#true
|
|
example "mise daemons start" help="Start the default group, or every daemon"
|
|
example "mise daemons start api" help="Start api and the daemons it depends on"
|
|
example "mise daemons start --group backend" help="Start a group declared in [daemon_groups]"
|
|
}
|
|
cmd register help="[experimental] Register project daemons for on-demand startup" effect=write {
|
|
long_help #"""
|
|
[experimental] Register project daemons for on-demand startup
|
|
|
|
Installs missing tools, validates daemon definitions and dependencies, and registers the generated configuration with pitchfork without starting anything. Covers every project daemon, including imported dependencies and daemons outside the `default` group. Daemons that are already running keep running.
|
|
|
|
A running pitchfork supervisor with its proxy enabled can then start a registered HTTP daemon when a request reaches its hostname. See https://mise.jdx.dev/daemons/worktrees.html#register-for-on-demand-startup
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise daemons register" help="Register every project daemon"
|
|
}
|
|
cmd stop help="[experimental] Stop project daemons" unknown_flags=value {
|
|
long_help #"""
|
|
[experimental] Stop project daemons
|
|
|
|
With no names, stops every daemon the project has registered, including daemons a removed group started. Data is kept. Select daemons as `mise daemons start` does: by name, with `--group NAME`, or with `--all`. Other flags pass through to `pitchfork stop`.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[ARGS]…" help="Daemon names (short, such as `api`, or qualified, such as `shop/api`), `--group NAME`, and flags passed to pitchfork" required=#false double_dash=automatic var=#true
|
|
example "mise daemons stop postgres" help="Stop one daemon"
|
|
}
|
|
cmd restart help="[experimental] Restart project daemons" unknown_flags=value {
|
|
long_help #"""
|
|
[experimental] Restart project daemons
|
|
|
|
Installs missing tools first and selects daemons as `mise daemons start` does: with no names, the `default` group when the project declares one, otherwise every project daemon. A changed daemon declaration takes effect on restart. Other flags pass through to `pitchfork restart`.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[ARGS]…" help="Daemon names (short, such as `api`, or qualified, such as `shop/api`), `--group NAME`, and flags passed to pitchfork" required=#false double_dash=automatic var=#true
|
|
example "mise daemons restart api" help="Restart api with its current declaration"
|
|
}
|
|
cmd ls help="[experimental] List project daemons" effect=read {
|
|
alias list
|
|
long_help #"""
|
|
[experimental] List project daemons
|
|
|
|
Shows each daemon's ID, status, and source without starting a supervisor or registering configuration.
|
|
"""#
|
|
flag --json help="Output in JSON format, including ports, URLs, and data directories"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise daemons ls --json" help="Include ports, URLs, and data directories"
|
|
}
|
|
cmd urls help="[experimental] Show each daemon's URL and port" effect=read {
|
|
long_help #"""
|
|
[experimental] Show each daemon's URL and port
|
|
|
|
Lists every project daemon with its proxy hostname URL, the port it binds, its proxy mode, and its status. A daemon's hostname does not change when its port does, so an HTTP service can be addressed by URL while concurrent checkouts keep separate ports. A daemon with no `port`, or with `proxy = false`, gets no hostname and is listed without a URL. Each project's table is followed by its project page URL and, in a linked Git worktree, its stack page URL.
|
|
|
|
See https://mise.jdx.dev/daemons/worktrees.html#stable-urls-per-worktree
|
|
"""#
|
|
flag --json help="Output in JSON format, including ports, URLs, and data directories"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise daemons urls" help="Show the URLs for this checkout"
|
|
}
|
|
cmd logs help="[experimental] Show the output of project daemons" unknown_flags=value {
|
|
long_help #"""
|
|
[experimental] Show the output of project daemons
|
|
|
|
Requires a running pitchfork supervisor. With no names, shows every daemon the project has registered. Flags such as `-n`, `--since`, and `--grep` pass through to `pitchfork logs`.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[ARGS]…" help="Daemon names (short, such as `api`, or qualified, such as `shop/api`), `--group NAME`, and flags passed to pitchfork" required=#false double_dash=automatic var=#true
|
|
example "mise daemons logs api -n 50" help="Show the last 50 lines of api's output"
|
|
example "mise daemons logs --since 5min" help="Show the last five minutes of output"
|
|
}
|
|
cmd status help="[experimental] Show the status of project daemons" effect=read unknown_flags=value {
|
|
long_help #"""
|
|
[experimental] Show the status of project daemons
|
|
|
|
Prints pitchfork's status for each selected daemon. With no names, covers every daemon the project has registered.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[ARGS]…" help="Daemon names (short, such as `api`, or qualified, such as `shop/api`), `--group NAME`, and flags passed to pitchfork" required=#false double_dash=automatic var=#true
|
|
example "mise daemons status api" help="Show the status of api"
|
|
}
|
|
cmd tui help="[experimental] Open the pitchfork dashboard" unknown_flags=value {
|
|
long_help #"""
|
|
[experimental] Open the pitchfork dashboard
|
|
|
|
Requires a running pitchfork supervisor. Takes `pitchfork tui` flags, not daemon names.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[ARGS]…" help="Flags passed to `pitchfork tui`" required=#false double_dash=automatic var=#true
|
|
}
|
|
cmd prune help="[experimental] Remove daemon state left by deleted projects" effect=destructive {
|
|
long_help #"""
|
|
[experimental] Remove daemon state left by deleted projects
|
|
|
|
Scans `$MISE_STATE_DIR/daemons/` for state that belongs to deleted projects, including removed Git worktrees. For each one, stops its daemons, unregisters its configuration, and deletes its state and data. Existing projects are not touched.
|
|
|
|
Use `--dry-run` to preview the paths and sizes. Removal cannot be undone and asks for confirmation. Pass the global `--yes` flag to prune without a prompt; entries that may belong to an unmounted volume or a deleted symlink are then skipped and need a separate interactive confirmation.
|
|
|
|
pitchfork must be available. State is kept when mise cannot confirm that the daemons have stopped or cannot unregister their configuration.
|
|
"""#
|
|
flag "-n --dry-run" help="Show what would be removed without deleting anything"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise daemons prune --dry-run" help="Preview what would be removed"
|
|
example "mise daemons prune" help="Review the list and confirm removal"
|
|
}
|
|
cmd __init hide=#true {
|
|
flag --context help="Resolved preset ports and options as a JSON object." {
|
|
arg <CONTEXT>
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <PRESET>
|
|
arg <DATA>
|
|
arg "[LEGACY_DATABASE]" help="Database name, as configurations generated before `--context` passed it." required=#false
|
|
}
|
|
example "mise daemons start" help="Start the default group, or every project daemon"
|
|
example "mise daemons logs api -n 50" help="Show the last 50 lines of api's output"
|
|
example "mise daemons stop" help="Stop every registered project daemon"
|
|
}
|
|
cmd direnv hide=#true help="Print `use_mise`, a direnv function that loads mise inside direnv" effect=read {
|
|
long_help #"""
|
|
Print `use_mise`, a direnv function that loads mise inside direnv
|
|
|
|
Running mise inside direnv is unsupported. To move a project from direnv to mise,
|
|
see https://mise.jdx.dev/direnv.html.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd activate hide=#true help="Print `use_mise`, a direnv function that loads mise inside direnv" effect=read {
|
|
long_help #"""
|
|
Print `use_mise`, a direnv function that loads mise inside direnv
|
|
|
|
Running mise inside direnv is unsupported. To move a project from direnv to mise,
|
|
see https://mise.jdx.dev/direnv.html.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise direnv activate > ~/.config/direnv/lib/use_mise.sh" help="Install the function; then put `use mise` in .envrc and run `direnv allow`"
|
|
}
|
|
cmd envrc hide=#true help="[internal] Write an envrc file for direnv to consume" effect=write {
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
cmd exec hide=#true help="[internal] Print the environment for direnv to load" {
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
}
|
|
cmd dotfiles subcommand_required=#true help="Deploy, track, and sync dotfiles" effect=read {
|
|
alias dot
|
|
long_help #"""
|
|
Deploy, track, and sync dotfiles
|
|
|
|
A `[dotfiles]` entry deploys a file (from a source with `symlink`, `symlink-each`, `copy`, or `template`, or from inline `content`), removes one (`mode = "absent"`), sets an existing path's `permissions`, edits part of a file, or tracks a live file where it is (`mode = "track"`). mise saves tracked files to a local Git history that you can browse and roll back, and syncs it with other machines through an origin repository. `mise dot` is a shorter alias.
|
|
|
|
Deploy files with `add`, `apply`, `diff`, `status`, and `unapply`. Track and restore files with `track`, `save`, `history`, `rollback`, and `undo`. Sync them with `origin`, `sync`, and `pull`.
|
|
|
|
See https://mise.jdx.dev/dotfiles.html and https://mise.jdx.dev/dotfiles/history.html
|
|
"""#
|
|
flag --local help="Work on this machine's local-only history (`mode = \"track-local\"`), which is never shared"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd add help="Start deploying a file, or copy its edits back to the source" effect=write {
|
|
long_help #"""
|
|
Start deploying a file, or copy its edits back to the source
|
|
|
|
For a target that is not managed yet, saves its contents as a source under `dotfiles.root` (or at the path given with `--source`), adds a `[dotfiles]` entry, and applies it unless you pass `--no-apply`. For a target that is already managed, updates its source from the live file. `--dry-run` previews the source and config changes without writing them.
|
|
|
|
A target inside the tree of a dotfile group is captured into that group's source instead, without a new `[dotfiles]` entry: the deepest group whose target contains it, or the one named with `--group`.
|
|
"""#
|
|
flag --changed help="Update the sources of every changed file managed in copy mode"
|
|
flag "-f --force" help="Overwrite existing sources without prompting"
|
|
flag "-g --global" help="Write to the global config (the default)" {
|
|
long_help #"""
|
|
Write to the global config (the default)
|
|
|
|
New entries go to the `write_targets.dotfiles` file when that setting is set.
|
|
"""#
|
|
conflicts "--local" "--path"
|
|
}
|
|
flag "-l --local" help="Write to the project config instead of the global config" {
|
|
conflicts "--global" "--path"
|
|
}
|
|
flag "-m --mode" help="Mode for a target that is not managed yet: symlink, symlink-each, copy, or template (default: the `dotfiles.default_mode` setting)" {
|
|
long_help #"""
|
|
Mode for a target that is not managed yet: symlink, symlink-each, copy, or template (default: the `dotfiles.default_mode` setting)
|
|
|
|
A target that is already managed keeps its mode.
|
|
"""#
|
|
arg <MODE>
|
|
}
|
|
flag "-n --dry-run" help="Print the config and source changes without writing anything"
|
|
flag --no-apply help="Add the entry without applying it"
|
|
flag "-p --path" help="Write to this config file or directory" {
|
|
conflicts "--global" "--local"
|
|
arg <PATH>
|
|
}
|
|
flag "-s --source" help="Source path to use for a single target" {
|
|
long_help #"""
|
|
Source path to use for a single target
|
|
|
|
A relative path starts from the current directory. The entry records it relative to the config file's directory when it lies inside it, and as an absolute path otherwise.
|
|
"""#
|
|
arg <PATH>
|
|
}
|
|
flag "-y --yes" help="Skip the confirmation prompt"
|
|
flag --prompt-secrets help="Prompt for `[bootstrap.secrets]` values that templates need and the environment does not set"
|
|
flag --group help="Capture into the tree of this dotfile group" conflicts=--source {
|
|
arg <NAME>
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TARGET]…" help="Targets to add or update" required=#false var=#true
|
|
example "mise dot add ~/.zshrc" help="Start managing ~/.zshrc from your dotfiles directory"
|
|
example "mise dot add --mode copy ~/.config/starship.toml" help="Copy the file into place instead of symlinking it"
|
|
example "mise dot add --source dotfiles/gitconfig ~/.gitconfig" help="Choose where the source is stored"
|
|
example "mise dot add --group home ~/.config/starship.toml" help="Capture the file into a dotfile group's tree"
|
|
example "mise dot add --changed" help="Copy edits of every changed copy-mode file back to its source"
|
|
}
|
|
cmd apply help="Link, copy, and render `[dotfiles]` entries into place" effect=destructive {
|
|
long_help #"""
|
|
Link, copy, and render `[dotfiles]` entries into place
|
|
|
|
Applies the whole-file entries and edits that are not in their desired state. Whole-file entries symlink, copy, render templates, write inline `content`, set `permissions`, or remove targets declared `mode = "absent"`. Edit entries manage a marker-delimited block, a single line, or merged keys in a file mise does not otherwise own.
|
|
|
|
Entries that deploy mise's own configuration are applied first and the configuration is read again, so a rule the new file adds applies in the same run.
|
|
|
|
`apply` works from the files on this machine. It never fetches or pulls: to bring in changes from other machines, run `mise dot sync`, `mise dot pull`, then `mise dot apply`.
|
|
|
|
The `pre-dotfiles` and `post-dotfiles` bootstrap hooks run before and after the apply (with `--dry-run` they are printed, not run), and the matching `[history.reload]` commands run for the targets it wrote.
|
|
|
|
With `--prune`, also removes files that dotfile groups deployed but no active entry deploys now: files of a group that is no longer selected or declared, and files a group stopped deploying because of a new `exclude` or a deleted source.
|
|
"""#
|
|
flag "-f --force" help="Overwrite existing files that conflict with whole-file dotfile entries"
|
|
flag "-n --dry-run" help="Print the actions that would run without writing anything"
|
|
flag "-y --yes" help="Skip the confirmation prompt"
|
|
flag --prune help="Also remove files that dotfile groups deployed but no active entry deploys now"
|
|
flag --prompt-secrets help="Prompt for `[bootstrap.secrets]` values that templates need and the environment does not set"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TARGET]…" help="Only apply these targets" required=#false var=#true
|
|
example "mise dot apply" help="Deploy every entry that is out of date"
|
|
example "mise dot apply --dry-run" help="Print what would change"
|
|
example "mise dot apply --prune" help="Also remove files left by dotfile groups"
|
|
example "mise dot apply --force --yes" help="Overwrite conflicting files without prompting"
|
|
}
|
|
cmd capture help="Run a command and save tracked files before and after it" {
|
|
long_help #"""
|
|
Run a command and save tracked files before and after it
|
|
|
|
Runs the command with your terminal and environment and saves a checkpoint before and after it, even when the command fails or changes nothing, so `mise dot undo` can reverse what it did to your tracked files. Edits you make while it runs are part of the same operation. Packages, services, and other system changes are not recorded and cannot be undone. If saving fails, mise warns and still exits with the command's status.
|
|
"""#
|
|
flag --label help="Describe this operation in history" {
|
|
arg <LABEL>
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "<-- COMMAND>…" help="Command and arguments to run, after --" var=#true
|
|
example "mise dot capture -- brew upgrade" help="Record what an upgrade changes"
|
|
example "mise dot capture --label \"theme switch\" -- ./switch-theme.sh" help="Label the operation in history"
|
|
}
|
|
cmd conflicts help="Compare both sides of a sync conflict" effect=read {
|
|
long_help #"""
|
|
Compare both sides of a sync conflict
|
|
|
|
Prints a unified diff from this machine's saved version to the version fetched from the origin. `--difftool` opens the comparison in Git's configured diff tool; when `diff.tool` is unset, Git falls back to `merge.tool`. This command changes neither side. Resolve a conflict with `mise dot pull --take-remote` or `--keep-local`.
|
|
"""#
|
|
flag --difftool help="Open the comparison in Git's configured diff or merge tool"
|
|
flag --tool help="Use this Git diff tool instead of the configured default" requires=--difftool {
|
|
arg <TOOL>
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[PATH]…" help="Only inspect these conflicted paths" required=#false var=#true
|
|
example "mise dot conflicts" help="Show every conflict"
|
|
example "mise dot conflicts ~/.zshrc" help="Show one conflicted file"
|
|
example "mise dot conflicts --difftool ~/.zshrc" help="Open the comparison in Git's diff tool"
|
|
example "mise dot conflicts --difftool --tool meld ~/.zshrc" help="Use a specific diff tool"
|
|
}
|
|
cmd diff help="Show what `mise dot apply` would change" effect=read {
|
|
long_help #"""
|
|
Show what `mise dot apply` would change
|
|
|
|
Prints a unified diff for every whole-file entry and edit that `mise dot apply` would change. Templates are rendered first, so trusted template functions may run. Tracked entries have nothing to apply; use `mise dot history diff` to see their unsaved changes.
|
|
"""#
|
|
flag --prompt-secrets help="Prompt for `[bootstrap.secrets]` values that templates need and the environment does not set"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TARGET]…" help="Only show these targets" required=#false var=#true
|
|
example "mise dot diff" help="Show every pending change"
|
|
example "mise dot diff ~/.zshrc" help="Show the change for one target"
|
|
}
|
|
cmd edit help="Open a dotfile's source in your editor" effect=write {
|
|
long_help #"""
|
|
Open a dotfile's source in your editor
|
|
|
|
Opens the file that defines TARGET in `$VISUAL` or `$EDITOR`: the source for symlink, copy, and template entries; the file itself for tracked and permissions-only entries; and the declaring config for inline `content`, `absent` entries, and edits without a source file.
|
|
|
|
An unmanaged target is first added to the global `[dotfiles]`, as `mise dot add --no-apply` would add it, after a prompt that `--yes` skips. Without a terminal, an unmanaged target needs `--yes`. With `--apply`, applies the target after the editor exits.
|
|
"""#
|
|
flag --apply help="Apply this target after the editor exits"
|
|
flag "-m --mode" help="Mode to use if the target is not managed yet: symlink, symlink-each, copy, or template (default: the `dotfiles.default_mode` setting)" {
|
|
arg <MODE>
|
|
}
|
|
flag "-s --source" help="Source path to use if the target is not yet managed" {
|
|
arg <PATH>
|
|
}
|
|
flag "-y --yes" help="Skip the confirmation prompt when adding an unmanaged target"
|
|
flag --group help="Dotfile group whose tree holds the target, when several groups deploy into its directory" conflicts=--source {
|
|
arg <NAME>
|
|
}
|
|
flag --prompt-secrets help="Prompt for `[bootstrap.secrets]` values that templates need and the environment does not set"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <TARGET> help="Target to edit"
|
|
example "mise dot edit ~/.zshrc" help="Edit the source of ~/.zshrc"
|
|
example "mise dot edit --apply ~/.config/starship.toml" help="Edit the source, then deploy it"
|
|
}
|
|
cmd exclude help="Never save paths matching a glob" effect=write {
|
|
long_help #"""
|
|
Never save paths matching a glob
|
|
|
|
Adds a glob to `[history] exclude` in the global config. The rule applies to every tracked path. Quote the glob so your shell does not expand it.
|
|
|
|
Use exclusions for logs, caches, databases, and session state. For files you want to save only on demand, track them with `mise dot track --no-autosave` instead. To limit what one tracked directory saves, edit the `exclude` or `include` list of its `[dotfiles]` entry.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <GLOB> help="A glob such as `~/.config/hypr/plugins/**`"
|
|
example "mise dot exclude '~/.codex/sessions/**'" help="Never save Codex session logs"
|
|
}
|
|
cmd history help="Browse saved versions of your tracked files" effect=read {
|
|
long_help #"""
|
|
Browse saved versions of your tracked files
|
|
|
|
A checkpoint is a saved version of every `[dotfiles]` entry with `mode = "track"`. `mise dot save`, the watcher, and every command that changes tracked files (such as `mise bootstrap`, `mise dot apply`, `rollback`, `pull`, and `undo`) record one. Checkpoints hold file contents only, not packages or services. Files deployed in other modes are saved only if you also track them. With no subcommand, lists checkpoints newest first.
|
|
|
|
See https://mise.jdx.dev/dotfiles/history.html
|
|
"""#
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag "-n --limit" help="Show at most this many checkpoints (0 for all)" default="20" {
|
|
arg <LIMIT>
|
|
}
|
|
flag --path help="Only checkpoints where this path (or something under it) changed" {
|
|
arg <PATH>
|
|
}
|
|
flag --trigger help="Only checkpoints with this trigger, such as edit, save, agent, bootstrap, apply, rollback, or undo" {
|
|
long_help #"""
|
|
Only checkpoints with this trigger, such as edit, save, agent, bootstrap, apply, rollback, or undo
|
|
|
|
`bootstrap` covers `mise bootstrap`, its `packages` commands, and `mise dot add`, `apply`, `edit`, and `unapply`. `apply` covers incoming changes written by `mise dot pull` or the watcher.
|
|
"""#
|
|
arg <TRIGGER>
|
|
}
|
|
flag --label help="Only checkpoints with this label" {
|
|
arg <LABEL>
|
|
}
|
|
flag --pending help="Only checkpoints recorded by operations that did not finish"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd describe help="Set the description of a checkpoint" effect=write {
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <REF> help="Numeric checkpoint ID, `latest`, `latest~N`, or `commit:<sha>`"
|
|
arg <TEXT> help="The new description"
|
|
example "mise dot history describe latest \"before the theme change\"" help="Describe the newest checkpoint"
|
|
}
|
|
cmd diff help="Compare checkpoints, or your files against one" effect=read {
|
|
long_help #"""
|
|
Compare checkpoints, or your files against one
|
|
|
|
Without arguments, shows unsaved changes: the files on disk against the latest checkpoint. With one reference, shows what that checkpoint changed since the one before it. With two, compares them.
|
|
"""#
|
|
flag --operation help="Compare an operation with the checkpoint it saved before it ran" {
|
|
long_help #"""
|
|
Compare an operation with the checkpoint it saved before it ran
|
|
|
|
With no reference, uses the newest operation, ignoring later saves. With one reference, uses that operation. Fails if the operation's earlier checkpoint is unavailable instead of comparing an unrelated save.
|
|
"""#
|
|
}
|
|
flag "-p --patch" help="Print the full patch instead of a per-file summary"
|
|
flag --path help="Restrict to one path (a file or a directory)" {
|
|
arg <PATH>
|
|
}
|
|
flag --exit-code help="Exit 1 when the two sides differ"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[A]" help="Numeric checkpoint ID, `latest`, `latest~N`, or `commit:<sha>`" required=#false
|
|
arg "[B]" help="Compare `A` with this checkpoint instead of its predecessor" required=#false
|
|
example "mise dot history diff" help="Show unsaved changes"
|
|
example "mise dot history diff 12" help="Show what checkpoint 12 changed"
|
|
example "mise dot history diff 11 12 --patch" help="Print the full patch between two checkpoints"
|
|
example "mise dot history diff --operation" help="Show what the newest operation changed"
|
|
}
|
|
cmd ls help="List checkpoints, newest first" effect=read {
|
|
alias list
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag "-n --limit" help="Show at most this many checkpoints (0 for all)" default="20" {
|
|
arg <LIMIT>
|
|
}
|
|
flag --path help="Only checkpoints where this path (or something under it) changed" {
|
|
arg <PATH>
|
|
}
|
|
flag --trigger help="Only checkpoints with this trigger, such as edit, save, agent, bootstrap, apply, rollback, or undo" {
|
|
long_help #"""
|
|
Only checkpoints with this trigger, such as edit, save, agent, bootstrap, apply, rollback, or undo
|
|
|
|
`bootstrap` covers `mise bootstrap`, its `packages` commands, and `mise dot add`, `apply`, `edit`, and `unapply`. `apply` covers incoming changes written by `mise dot pull` or the watcher.
|
|
"""#
|
|
arg <TRIGGER>
|
|
}
|
|
flag --label help="Only checkpoints with this label" {
|
|
arg <LABEL>
|
|
}
|
|
flag --pending help="Only checkpoints recorded by operations that did not finish"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise dot history ls -n 0" help="List every checkpoint"
|
|
example "mise dot history ls --pending" help="List operations that did not finish"
|
|
}
|
|
cmd purge help="Erase a path's saved versions from history" effect=destructive {
|
|
long_help #"""
|
|
Erase a path's saved versions from history
|
|
|
|
Rewrites the history without the path, for a file you tracked by mistake that holds a secret. `untrack`, `rollback`, and `undo` only add checkpoints; they leave the old versions readable.
|
|
|
|
Checkpoints that changed only this path are removed. The others stay, with their descriptions, dates, and IDs, minus the path. Without `--yes`, the command lists what would change and asks first.
|
|
|
|
mise never rewrites history that is on the origin: if a saved version of the path was ever published, the command refuses. Rotate the secret, then see https://mise.jdx.dev/dotfiles/encryption.html#remove-plaintext-from-history.
|
|
|
|
This does not stop tracking the path. If the file is still tracked, the next save records its current contents again, so run `mise dot untrack` first (or encrypt it). Stop the watcher service while this runs.
|
|
"""#
|
|
flag "-n --dry-run" help="Show what would change without changing anything"
|
|
flag "-y --yes" help="Rewrite without prompting"
|
|
flag --backup help="Keep the replaced history in the repository under `refs/mise/purge-backup/`" {
|
|
long_help #"""
|
|
Keep the replaced history in the repository under `refs/mise/purge-backup/`
|
|
|
|
The backup still holds the content you are erasing; delete it with `git update-ref -d` once you are sure.
|
|
"""#
|
|
}
|
|
flag --keep-objects help="Leave the replaced objects on disk instead of deleting them"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <PATH>… help="Files or directories to erase from history" var=#true
|
|
example "mise dot history purge ~/.aws/credentials --dry-run" help="List the checkpoints that hold the file"
|
|
example "mise dot history purge ~/.aws/credentials --yes" help="Erase every saved version of the file"
|
|
}
|
|
cmd show help="Show a checkpoint: its trigger, changes, and operation journal" effect=read {
|
|
long_help #"""
|
|
Show a checkpoint: its trigger, changes, and operation journal
|
|
|
|
Prints the checkpoint's trigger, description, time, and machine, the files that changed since the previous checkpoint, and the tracked entries it covers. For a checkpoint that an operation recorded, also prints the operation's journal of the files it wrote.
|
|
"""#
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --files help="List every file in the snapshot"
|
|
flag --path help="Resolve `latest~N` among the checkpoints where this path changed" {
|
|
arg <PATH>
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[REF]" help="Numeric checkpoint ID, `latest` (the default), `latest~N`, or `commit:<sha>`" required=#false
|
|
example "mise dot history show" help="Show the newest checkpoint"
|
|
example "mise dot history show latest~2 --files" help="List every file in an older checkpoint"
|
|
}
|
|
example "mise dot history" help="List recent checkpoints"
|
|
example "mise dot history --path ~/.config/hypr/bindings.lua" help="List checkpoints that changed one file"
|
|
example "mise dot history --trigger bootstrap -n 5" help="List the last five checkpoints from mise bootstrap or mise dot apply"
|
|
example "mise dot history show latest" help="Show the newest checkpoint"
|
|
example "mise dot history diff" help="Show unsaved changes"
|
|
}
|
|
cmd include help="Stop excluding paths matching a glob" effect=write {
|
|
long_help #"""
|
|
Stop excluding paths matching a glob
|
|
|
|
Removes a glob that `mise dot exclude` added to `[history] exclude` in the global config. Pass the pattern exactly as you excluded it. Other matching exclusion rules still apply. This command does not edit a tracked directory's `include` list; change that list in its `[dotfiles]` entry.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <GLOB> help="The glob as written by `mise dot exclude`"
|
|
example "mise dot include '~/.codex/sessions/**'" help="Save Codex session logs again"
|
|
}
|
|
cmd notify help="Send a test desktop notification" effect=write {
|
|
long_help #"""
|
|
Send a test desktop notification
|
|
|
|
Checks that `history.notify` can reach you. On macOS the first notification asks for permission, so run this once to be prompted now instead of at the first sync conflict. Fails with the reason when this build or machine cannot show notifications: a macOS build that is not mise's signed release (such as Homebrew's), a missing `notify-send` on Linux, denied permission, or `history.notify = false`.
|
|
|
|
mise notifies you only when a sync conflict pauses syncing. Other problems, such as a watcher that cannot save, appear in `mise doctor` and `mise dot status`.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise dot notify" help="Send a test notification"
|
|
}
|
|
cmd origin help="Show, connect, or disconnect the origin repository" effect=destructive {
|
|
long_help #"""
|
|
Show, connect, or disconnect the origin repository
|
|
|
|
The origin is a Git repository that shares the history of your tracked files with your other machines. With no subcommand, prints the connected URL, its branch, the config file that declares it, and the sync mode (the `history.sync` setting). `--remove` disconnects; local checkpoints and fetched history stay.
|
|
|
|
See https://mise.jdx.dev/dotfiles/sync.html
|
|
"""#
|
|
flag --remove help="Disconnect the origin by removing `[history.origin]`; local checkpoints and fetched history stay" effect=destructive
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd set help="Connect an origin repository" effect=write {
|
|
long_help #"""
|
|
Connect an origin repository
|
|
|
|
Use a private repository: every saved checkpoint is shared, including those saved before you connect. mise shows the sync mode and the tracked files before you confirm, then runs the first sync. It never replaces a repository that has unrelated history, and it refuses to push older plaintext versions of files you now encrypt. The connection is written to `[history.origin]` in `config.local.toml` next to your global config, so it stays on this machine.
|
|
|
|
The origin holds tracked-file history, not a checkout of your global config: connect a repository of its own, or a separate branch (`--branch`) of the one you adopt as global config with `mise bootstrap --adopt`.
|
|
"""#
|
|
flag --branch help="The branch to sync (default: the repository's default branch)" {
|
|
long_help #"""
|
|
The branch to sync (default: the repository's default branch)
|
|
|
|
Reconnecting a repository this machine already follows keeps that connection's branch. A repository with no branches gets `main`, which the first push creates.
|
|
"""#
|
|
arg <BRANCH>
|
|
}
|
|
flag --sync help="How to sync with the repository: sync, fetch-only, or manual" {
|
|
long_help #"""
|
|
How to sync with the repository: sync, fetch-only, or manual
|
|
|
|
`sync` pushes saved checkpoints and applies incoming changes automatically. `fetch-only` fetches automatically and never pushes. `manual` makes no automatic network calls: `mise dot sync` pushes and fetches, and `mise dot pull` applies, only when you run them; local history is still saved automatically. When omitted, mise prompts; with `--yes`, it uses the `history.sync` setting.
|
|
"""#
|
|
arg <MODE>
|
|
}
|
|
flag "-y --yes" help="Skip the confirmation prompt"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <URL> help="The repository URL (any Git URL; use a private repository)"
|
|
example "mise dot origin set https://github.com/you/dotfiles.git" help="Connect and choose a sync mode at the prompt"
|
|
example "mise dot origin set git@github.com:you/dotfiles.git --sync manual" help="Connect without automatic network activity"
|
|
}
|
|
example "mise dot origin" help="Show the connected repository"
|
|
example "mise dot origin set git@github.com:you/dotfiles.git" help="Connect a repository"
|
|
example "mise dot origin --remove" help="Disconnect the repository"
|
|
}
|
|
cmd paths help="List tracked paths and how they are saved" effect=read {
|
|
long_help #"""
|
|
List tracked paths and how they are saved
|
|
|
|
Shows each tracked entry with the config file that declares it, whether it saves automatically, and how many files it covers. Entries mise cannot save are listed as invalid, omitted, or incomplete, so you can see what is not protected.
|
|
"""#
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --preview help="List the files that tracking this path would save, without tracking it" {
|
|
arg <PATH>
|
|
}
|
|
flag --noisy help="List the paths the watcher found changing constantly and saves less often"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise dot paths" help="List tracked paths"
|
|
example "mise dot paths --preview ~/.codex" help="List the files tracking ~/.codex would save"
|
|
example "mise dot paths --noisy" help="List files the watcher saves less often"
|
|
}
|
|
cmd pull help="Write fetched changes from other machines to tracked files" effect=destructive {
|
|
long_help #"""
|
|
Write fetched changes from other machines to tracked files
|
|
|
|
Writes the changes that the last `mise dot sync` fetched from your other machines. (`mise dot apply` deploys your own `[dotfiles]` entries; `pull` writes what other machines pushed.) `pull` restores tracked paths, including tracked symlinks, but never deploys `copy`, `symlink`, or `template` entries: when a tracked file is the source of one, `pull` updates the source, and `mise dot apply` then writes the target your application reads. mise saves a checkpoint first, so `mise dot undo` reverses the whole pull, and runs the matching `[history.reload]` commands after writing.
|
|
|
|
A pull applies every incoming change together, including config files and the files they reference; it does not take paths. Nothing is written if an incoming config file does not parse, a file has unsaved local edits, your own checkout has staged Git changes, or a file changed on both sides. A file that changed on both sides is a conflict: compare the two versions with `mise dot conflicts`, then resolve it with `--take-remote` or `--keep-local`, or resolve every conflict with `--take-remote-all` or `--keep-local-all`. While any conflict remains, pushing and applying stop for all tracked files; local history and fetching continue.
|
|
|
|
In `sync` mode the watcher pulls on its own when there are no conflicts. When incoming config declares more tracked files, their versions from the origin are written in the same pull.
|
|
"""#
|
|
flag "-n --dry-run" help="Show the plan without changing anything"
|
|
flag "-y --yes" help="Accepted for compatibility; pull skips the apply confirmation"
|
|
flag --take-remote help="Resolve a conflict with the origin's version" var=#true {
|
|
arg <PATH>
|
|
}
|
|
flag --keep-local help="Resolve a conflict by keeping this machine's version; the next sync pushes it" var=#true {
|
|
arg <PATH>
|
|
}
|
|
flag --take-remote-all help="Resolve every remaining conflict with the origin's version" conflicts=--keep-local-all {
|
|
long_help #"""
|
|
Resolve every remaining conflict with the origin's version
|
|
|
|
Paths named by `--keep-local` keep this machine's version; every other conflict takes the origin's. Use it on a newly connected machine, where each existing file that differs is a separate conflict.
|
|
"""#
|
|
}
|
|
flag --keep-local-all help="Resolve every remaining conflict by keeping this machine's version" conflicts=--take-remote-all {
|
|
long_help #"""
|
|
Resolve every remaining conflict by keeping this machine's version
|
|
|
|
Paths named by `--take-remote` take the origin's version; every other conflict keeps this machine's. Each kept path must already be saved.
|
|
"""#
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[PATH]…" help="Not supported; a pull always applies every incoming change" required=#false var=#true hide=#true
|
|
example "mise dot pull --dry-run" help="Show what would be written"
|
|
example "mise dot pull --take-remote ~/.zshrc" help="Resolve a conflict with the origin's version"
|
|
example "mise dot pull --keep-local ~/.zshrc" help="Resolve a conflict by keeping this machine's version"
|
|
example "mise dot pull --take-remote-all --keep-local ~/.zshrc" help="Take the origin's version of every conflict except one"
|
|
}
|
|
cmd recover help="Recover an interrupted dotfile operation" effect=destructive {
|
|
long_help #"""
|
|
Recover an interrupted dotfile operation
|
|
|
|
Finishes recovering from an operation that was interrupted, for example by a crash or Ctrl-C. With no argument, recovers every interrupted operation. mise restores files from the operation's recovery copies unless you have edited them since. When it cannot tell which version is safe, it lists the files: check them, then rerun with `--keep-current` to keep what is on disk and discard the operation's recovery copies. When several operations were interrupted, `--keep-current` needs the ID of one. Git history is not changed.
|
|
"""#
|
|
flag --keep-current help="Keep the files on disk instead of restoring the recovery copies"
|
|
flag "-y --yes" help="Discard the operation's recovery copies without prompting"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[OPERATION]" help="The operation's checkpoint ID (see `mise dot history --pending`) or a unique prefix of its UUID" required=#false
|
|
example "mise dot recover" help="Recover every interrupted operation"
|
|
example "mise dot recover 42 --keep-current --yes" help="Keep the files on disk for operation 42"
|
|
}
|
|
cmd rollback help="Return files to the version a checkpoint holds" effect=destructive {
|
|
long_help #"""
|
|
Return files to the version a checkpoint holds
|
|
|
|
Without `--to`, each path returns to its most recent saved version that differs from what is on disk; other checkpoints do not affect the choice. With `--to REF`, the named checkpoint is the source, and `--all` restores everything it covers. mise saves the current state in a checkpoint first, so `mise dot undo` can reverse the rollback.
|
|
"""#
|
|
flag --to help="The checkpoint to roll back to: numeric ID, `latest`, `latest~N`, or `commit:<sha>`" {
|
|
arg <REF>
|
|
}
|
|
flag --all help="With `--to`, restore everything the checkpoint covers"
|
|
flag "-n --dry-run" help="Show the plan without changing anything"
|
|
flag "-y --yes" help="Apply without prompting"
|
|
flag --force help="Replace a path whose type changed (file, symlink, directory)"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[PATH]…" help="Paths to roll back (files or directories)" required=#false var=#true
|
|
example "mise dot rollback ~/.config/hypr/bindings.lua" help="Restore the latest saved version that differs from the file"
|
|
example "mise dot rollback ~/.zshrc --to 42" help="Restore ~/.zshrc as checkpoint 42 holds it"
|
|
example "mise dot rollback --to latest~3 --all --dry-run" help="Preview restoring every file from three checkpoints ago"
|
|
}
|
|
cmd save help="Save a checkpoint of the tracked files now" effect=write {
|
|
long_help #"""
|
|
Save a checkpoint of the tracked files now
|
|
|
|
Exits non-zero when history cannot save or a named path is not tracked. With no changes since the latest checkpoint, nothing is saved unless you pass `--description`, `--label`, `--task`, or a `--trigger` other than `save`.
|
|
|
|
`--best-effort` turns a failure to write the checkpoint, such as missing Git, into a warning for update scripts that run under `set -e`. A disabled history or an untracked path still fails.
|
|
|
|
A save re-encrypts the files it captures to the current `[history.encryption] recipients`. `--re-encrypt` also re-encrypts the encrypted files it does not capture: files with `autosave = false` that it does not name, and variants for other platforms. It re-encrypts their saved versions and saves no unsaved edit. Run it after changing recipients so a machine added to the list can read every file. This machine must be able to unlock each one; otherwise nothing is saved and the error lists each file it cannot unlock.
|
|
"""#
|
|
flag "-d --description" help="A description for the checkpoint" {
|
|
arg <TEXT>
|
|
}
|
|
flag --trigger help="Record the checkpoint as a save, agent, or update checkpoint" default=save {
|
|
arg <TRIGGER>
|
|
}
|
|
flag --task help="The ID of the task an agent is working on, recorded with the checkpoint" {
|
|
arg <ID>
|
|
}
|
|
flag --label help="A label to find the checkpoint by later" var=#true {
|
|
arg <LABEL>
|
|
}
|
|
flag --best-effort help="Warn instead of failing when the checkpoint cannot be written"
|
|
flag --re-encrypt help="Re-encrypt every saved encrypted file to the current recipients"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[PATH]…" help="Paths to save; every one must be tracked" required=#false var=#true
|
|
example "mise dot save" help="Save every tracked file that changed"
|
|
example "mise dot save ~/.zshrc -d \"before the theme change\"" help="Save one file with a description"
|
|
example "mise dot save --best-effort" help="Warn instead of failing in a script"
|
|
example "mise dot save --re-encrypt" help="Re-encrypt every encrypted file after changing recipients"
|
|
}
|
|
cmd status help="Show the state of your dotfiles and their history" effect=read {
|
|
alias ls
|
|
long_help #"""
|
|
Show the state of your dotfiles and their history
|
|
|
|
Lists the `[dotfiles]` entries that need attention, and counts the rest; `--verbose` lists every entry. Each has a state: `applied`, `missing`, `differs`, `source missing`, `tracked`, `would remove` for an `absent` entry whose target is still there, or `absent` for a removal that is done. A tracked entry whose variants all select other machines, such as one for an inactive profile, says `not on this machine`. Then shows the history state in sections: Tracking, Repository, Conflicts, Automatic capture, and Bootstrap, ending with the next steps.
|
|
|
|
Files a dotfile group deployed that no active entry deploys now are listed as `orphaned`: the group was deselected or removed, or a new `exclude` or a deleted source dropped them. `mise dot apply --prune` removes them.
|
|
|
|
Template entries are rendered to compare their output, so trusted template functions may run. `--json` prints `files`, `edits`, and `history`, with each entry's origin and a state of `applied`, `missing`, `differs`, `source_missing`, or `tracked`. Orphaned files appear in a separate `orphaned` array with the state `orphaned`, or `orphaned_changed` when the file was modified after it was deployed. See https://mise.jdx.dev/dotfiles/reference.html#status-states for every state.
|
|
"""#
|
|
flag --truncate help="Truncate long terminal output to fit the available width" negate=--no-truncate default="true"
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --missing help="Exit with code 1 if any dotfile is not in its desired state (missing, source missing, or differs)"
|
|
flag "-v --verbose" help="List every entry, including those already applied or tracked" {
|
|
long_help #"""
|
|
List every entry, including those already applied or tracked
|
|
|
|
By default the table lists only entries that need attention or have omitted files, with a one-line summary of the rest. Naming targets lists them regardless.
|
|
"""#
|
|
}
|
|
flag --prompt-secrets help="Prompt for `[bootstrap.secrets]` values that templates need and the environment does not set"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TARGET]…" help="Only show these targets" required=#false var=#true
|
|
example "mise dot status" help="Show what needs attention"
|
|
example "mise dot status --verbose" help="List every entry"
|
|
example "mise dot status ~/.zshrc" help="Show one target"
|
|
example "mise dot status --json" help="Print the state as JSON"
|
|
example "mise dot status --missing" help="Exit 1 if anything is out of date, for scripts and CI"
|
|
}
|
|
cmd sync help="Push saved checkpoints and fetch incoming changes" effect=write {
|
|
long_help #"""
|
|
Push saved checkpoints and fetch incoming changes
|
|
|
|
Fetches the origin branch and pushes your local history to it. If the push is rejected, mise fetches again and reconciles the two histories without rewriting either. Incoming changes and conflicts are recorded for `mise dot pull`; this command never changes your files. With `--fetch-only`, or in `fetch-only` mode, nothing is pushed.
|
|
|
|
The watcher does this on its own in `sync` and `fetch-only` mode (the `history.sync` setting). See https://mise.jdx.dev/dotfiles/sync.html
|
|
"""#
|
|
flag --fetch-only help="Fetch without pushing"
|
|
flag --allow-plaintext-history help="Allow pushing older unencrypted versions of files that are now encrypted, and versions that look like they contain secrets"
|
|
flag --best-effort help="Warn instead of failing when the origin is unreachable"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise dot sync" help="Push and fetch now"
|
|
example "mise dot sync --fetch-only" help="Fetch without pushing"
|
|
}
|
|
cmd track help="Track a file or directory in place" effect=write {
|
|
long_help #"""
|
|
Track a file or directory in place
|
|
|
|
Adds a `[dotfiles]` entry with `mode = "track"` to your global config: the file stays where it is, nothing is copied or linked, and mise saves a checkpoint of it right away. While the watcher service runs, later edits are saved automatically; without it, `mise dot save` saves them. Use `--dry-run` to see what a large directory would add before tracking it.
|
|
|
|
`--os` and `--profile` declare a variant: machines that match the platform or config environment keep their own version of the file, so a Mac and a Linux machine can have different contents at the same path. `--machine` gives every machine its own version instead, for files such as a monitor layout that should never be applied on another machine.
|
|
|
|
See https://mise.jdx.dev/dotfiles/history.html
|
|
"""#
|
|
flag --os help="Declare a variant for this platform (macos, linux, linux/arm64, …)" {
|
|
arg <OS>
|
|
}
|
|
flag --profile help="Declare a variant for this config environment (`MISE_ENV` or `-E`)" {
|
|
arg <PROFILE>
|
|
}
|
|
flag --local help="Keep this file's history on this machine only; it is never shared"
|
|
flag --machine help="Keep a separate stream on every machine, never applied on another"
|
|
flag --no-autosave help="Save only on `mise dot save <path>`, never automatically"
|
|
flag --encrypt help="Encrypt contents before saving them to history (requires `[history.encryption] recipients`)"
|
|
flag --allow-plaintext help="Save an explicitly tracked credential-named file in plaintext"
|
|
flag "-y --yes" help="Accepted for compatibility; track no longer asks to confirm the paths"
|
|
flag "-n --dry-run" help="Show what each path expands to (files, size, what is left out) without tracking it"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <PATH>… help="Paths to track (absolute or starting with ~/)" var=#true
|
|
example "mise dot track ~/.zshrc ~/.config/hypr" help="Track a file and a directory"
|
|
example "mise dot track --dry-run ~/.codex" help="Show what tracking a directory would save"
|
|
example "mise dot track ~/.zshrc --os macos" help="Keep a separate version for macOS machines"
|
|
example "mise dot track ~/.config/hypr/monitors.lua --machine" help="Keep a separate version on every machine"
|
|
example "mise dot track ~/.config/app/state.json --local" help="Keep the file's history on this machine only"
|
|
example "mise dot track ~/.config/app/credentials --encrypt" help="Encrypt the file before saving it"
|
|
example "mise dot track ~/.config/app/state.json --no-autosave" help="Save the file only when you run mise dot save"
|
|
}
|
|
cmd unapply help="Remove files that `mise dot apply` deployed" effect=destructive {
|
|
long_help #"""
|
|
Remove files that `mise dot apply` deployed
|
|
|
|
Removes the targets of whole-file entries and the blocks and lines that edit entries added, but only what mise can identify as its own. Modified copies, modified templates, and plain-line edits need `--force`. Merged keys, `absent` entries, and permissions-only targets are left alone. Sources and config entries are kept, so run this before you delete a declaration, while mise can still identify its targets.
|
|
|
|
With `--group`, removes only that dotfile group's files, using what mise recorded when it applied them, so it works even after the group is deselected or deleted from the config.
|
|
"""#
|
|
flag "-f --force" help="Remove modified or otherwise ambiguous managed files and lines"
|
|
flag "-n --dry-run" help="Print the actions that would run without writing anything"
|
|
flag "-y --yes" help="Skip the confirmation prompt"
|
|
flag --group help="Only unapply the files of this dotfile group, even one that is no longer selected or declared" var=#true {
|
|
arg <NAME>
|
|
}
|
|
flag --prompt-secrets help="Prompt for `[bootstrap.secrets]` values that templates need and the environment does not set"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TARGET]…" help="Only unapply these targets" required=#false var=#true
|
|
example "mise dot unapply" help="Remove every target mise can identify"
|
|
example "mise dot unapply ~/.zshrc" help="Remove one target"
|
|
example "mise dot unapply --group work" help="Remove one dotfile group's files"
|
|
example "mise dot unapply --dry-run" help="Preview what would be removed"
|
|
example "mise dot unapply --force --yes" help="Also remove modified targets, without prompting"
|
|
}
|
|
cmd undo help="Reverse the tracked-file changes from an operation" effect=destructive {
|
|
long_help #"""
|
|
Reverse the tracked-file changes from an operation
|
|
|
|
Restores exactly the paths that an operation changed from the checkpoint it saved first, and leaves everything else as it is now. Without a reference, reverses the newest operation that has not been undone.
|
|
|
|
Works for operations that changed tracked files: `mise bootstrap`, `mise dot add`, `apply`, `edit`, `unapply`, `capture`, `rollback`, `pull` (including changes the watcher applied), and `undo` itself. Package installations, service state, and untracked files are not reversed.
|
|
"""#
|
|
flag "-n --dry-run" help="Show the plan without changing anything"
|
|
flag "-y --yes" help="Apply without prompting"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[REF]" help="The operation's checkpoint: numeric ID, `latest`, `latest~N`, or `commit:<sha>`" required=#false
|
|
example "mise dot undo" help="Reverse the newest operation"
|
|
example "mise dot undo --dry-run" help="Show what would be restored"
|
|
example "mise dot undo 42" help="Reverse the operation recorded as checkpoint 42"
|
|
}
|
|
cmd untrack help="Stop tracking a file or directory" effect=write {
|
|
long_help #"""
|
|
Stop tracking a file or directory
|
|
|
|
Removes the path's `mode = "track"` entry from your global config. When a project or system config declares the entry, mise turns it off on this machine in `config.local.toml` next to your global config instead.
|
|
|
|
A path inside a tracked directory has no entry of its own: mise adds a rule for it to `[history] exclude` in the global config, and `mise dot include <path>` removes that rule. The file itself and its existing checkpoints are not changed.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <PATH>… help="Paths to stop tracking" var=#true
|
|
example "mise dot untrack ~/.zshrc" help="Stop saving ~/.zshrc"
|
|
example "mise dot untrack ~/.config/hypr/plugins" help="Exclude one directory inside a tracked directory"
|
|
}
|
|
cmd watch help="Save tracked files as they change" effect=write {
|
|
long_help #"""
|
|
Save tracked files as they change
|
|
|
|
Runs in the foreground and saves a checkpoint once a changed file has been quiet for `history.watch.debounce`. A file that keeps changing does not delay the others and is still saved every `history.watch.max_interval`. The watcher also rescans every tracked path at startup, every `history.watch.reconcile`, and when the configuration changes. Entries tracked with `--no-autosave` are not watched.
|
|
|
|
With an origin connected, the watcher also syncs according to the `history.sync` setting. In `sync` mode it pushes within `history.sync_interval` of a save, fetches every `history.fetch_interval`, and applies incoming changes when there are no conflicts. In `fetch-only` mode it only fetches; in `manual` mode it does not use the network. A failed sync is retried with backoff while saving continues. `--once` runs one rescan and one sync, then exits.
|
|
|
|
The built-in `history-watch` service runs this for you:
|
|
|
|
[bootstrap.services.mise-history]
|
|
builtin = "history-watch"
|
|
|
|
Exits 0 when history is disabled or another watcher is already running, and 1 when Git is unusable, the store cannot be opened, or no watch can be installed. A failed save is retried with backoff and never drops the pending changes, and a save that would overlap another history operation is deferred. With `--once`, nothing is retried: a save that fails or is deferred, or a sync that fails, exits 1.
|
|
"""#
|
|
flag --once help="Rescan and sync once, then exit (for timers and cron)"
|
|
flag "-J --json" help="Print one JSON object per line instead of log lines"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise dot watch" help="Watch and save until stopped"
|
|
example "mise dot watch --once" help="Rescan and sync once, for a timer"
|
|
example "mise dot watch --json" help="Print JSON lines instead of log lines"
|
|
}
|
|
example "mise dot add ~/.zshrc" help="Start managing ~/.zshrc from your dotfiles directory"
|
|
example "mise dot apply" help="Deploy every [dotfiles] entry"
|
|
example "mise dot status" help="Show the state of your dotfiles and their history"
|
|
example "mise dot track ~/.config/nvim" help="Save the history of a directory in place"
|
|
example "mise dot history" help="List saved checkpoints"
|
|
}
|
|
cmd doctor help="Check your mise setup for problems" effect=read {
|
|
alias dr
|
|
long_help #"""
|
|
Check your mise setup for problems
|
|
|
|
Prints mise's version, whether shell activation and shims are set up, its
|
|
directories, the config files, tools, and environment in use, and its settings,
|
|
then lists any problems and warnings with a suggested fix. Exits with status 1
|
|
when it finds a problem. Include this output when you report a bug.
|
|
"""#
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd path help="Print the directories mise adds to PATH" effect=read {
|
|
alias paths
|
|
long_help #"""
|
|
Print the directories mise adds to PATH
|
|
|
|
Lists tool bin directories and `_.path` entries from [env]. --full prints the
|
|
whole PATH mise would set. `mise bin-paths` lists tool bin directories only.
|
|
"""#
|
|
flag "-f --full" help="Print every PATH entry, including those mise does not provide"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example #"""
|
|
mise doctor path
|
|
/home/user/.local/share/mise/installs/node/24.11.0/bin
|
|
/home/user/.local/share/mise/installs/python/3.13.1/bin
|
|
"""# help="Print the directories mise adds to PATH"
|
|
example "mise doctor path --full" help="Print the whole PATH mise would set"
|
|
}
|
|
cmd project help="Run the project's diagnostic checks" {
|
|
long_help #"""
|
|
Run the project's diagnostic checks
|
|
|
|
Checks are declared in `[doctor.checks.<name>]` tables in mise.toml. Each command
|
|
runs with the project's installed tools and environment. Checks should inspect
|
|
state; mise does not sandbox them or run their suggested remedies. Exits with
|
|
status 1 when a check fails. See
|
|
https://mise.jdx.dev/configuration/project-diagnostics.html.
|
|
"""#
|
|
flag "-J --json" help="Output the complete report as JSON"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise doctor project" help="Run every check and report pass or fail"
|
|
example "mise doctor project --json" help="Print the report as JSON"
|
|
}
|
|
example "mise doctor" help="Check the setup and list problems"
|
|
example "mise doctor --json" help="Print the report as JSON"
|
|
}
|
|
cmd en help="Start a subshell with mise's tools and environment" {
|
|
long_help #"""
|
|
Start a subshell with mise's tools and environment
|
|
|
|
This is an alternative to `mise activate` for starting a mise session explicitly.
|
|
The new shell has the tools and environment variables from the config loaded.
|
|
Unlike an activated shell, changing directories does not update the environment.
|
|
Type `exit` to leave it.
|
|
"""#
|
|
flag "-s --shell" help="Shell to start; defaults to $SHELL" {
|
|
arg <SHELL>
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[DIR]" help="Directory to start the shell in" required=#false default=.
|
|
example "mise en" help="Start a shell with the project's tools and environment"
|
|
example "mise en ~/work/api" help="Start the shell in another project"
|
|
example "mise en -s \"bash --norc\"" help="Skip loading .bashrc"
|
|
example "mise en -s \"zsh -f\"" help="Skip loading .zshrc"
|
|
complete dir type=dir
|
|
}
|
|
cmd env help="Print the environment for the current configuration" effect=read {
|
|
alias e
|
|
long_help #"""
|
|
Print the environment for the current configuration
|
|
|
|
Evaluate the shell output to load tools and variables once, without installing
|
|
prompt hooks. Changing directories afterward does not recompute this environment.
|
|
Use `mise exec -- command` to apply it to one child process instead.
|
|
|
|
JSON, dotenv, and shell output contain actual variable values, including secrets.
|
|
`--redacted` selects variables marked for redaction; it does not mask their values.
|
|
Tools you pass as TOOL@VERSION arguments are installed first if they are missing;
|
|
missing tools from the config are reported, not installed.
|
|
"""#
|
|
flag "-D --dotenv" help="Output in dotenv format" overrides=--shell
|
|
flag "-J --json" help="Output in JSON format" overrides=--shell
|
|
flag "-s --shell" help="Shell type to generate environment variables for" overrides=--json {
|
|
arg <SHELL> {
|
|
choices {
|
|
choice bash
|
|
choice elvish
|
|
choice fish
|
|
choice nu
|
|
choice xonsh
|
|
choice zsh
|
|
choice pwsh {
|
|
alias powershell
|
|
}
|
|
}
|
|
}
|
|
}
|
|
flag --json-extended help="Output in JSON format with additional information (source, tool)" overrides=--shell
|
|
flag --redacted help="Only include variables marked for redaction; their values are printed unmasked"
|
|
flag --values help="Only show values of environment variables"
|
|
flag --paths help="Print the PATH entries mise manages, in PATH order, one per line"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TOOL@VERSION]…" help="Tools to include in addition to those in the config, such as `node@24`" required=#false var=#true
|
|
example "eval \"$(mise env -s bash)\"" help="Load the environment once into the current bash session"
|
|
example "eval \"$(mise env -s zsh)\"" help="Same, for zsh"
|
|
example "mise env -s fish | source" help="Same, for fish"
|
|
example "execx($(mise env -s xonsh))" help="Same, for xonsh"
|
|
example "mise env --json" help="Print the variables as JSON"
|
|
example "mise env --paths" help="List the PATH entries mise manages, such as tool bin directories"
|
|
example "mise env --dotenv > .env" help="Write a dotenv file; it contains secret values"
|
|
}
|
|
cmd exec help="Run a command with mise's tools and environment" {
|
|
alias x
|
|
long_help #"""
|
|
Run a command with mise's tools and environment
|
|
|
|
Loads the tools and [env] from your config into one child process without
|
|
changing the current shell. Use it in scripts and CI, or to run a tool that is
|
|
not in the config.
|
|
|
|
TOOL@VERSION arguments add tools or override the configured version of that
|
|
tool only: with `node = "24"` in mise.toml, `mise exec python@3.13 -- python -V`
|
|
still has node 24 on PATH.
|
|
|
|
Put the command after `--`, or pass a shell command string with `-c`. Missing
|
|
tools are installed first unless the `exec_auto_install` or `auto_install`
|
|
setting is off; when you name tools, only those are installed. The --allow-* and
|
|
--deny-* flags sandbox the command; see https://mise.jdx.dev/sandboxing.html.
|
|
"""#
|
|
flag "-c --command" help="Command string to run through a shell (supports pipes and redirection)" conflicts=COMMAND {
|
|
arg <COMMAND>
|
|
}
|
|
flag "-j --jobs" help="How many tools to install in parallel; defaults to the `jobs` setting" env=MISE_JOBS {
|
|
long_help #"""
|
|
How many tools to install in parallel; defaults to the `jobs` setting
|
|
|
|
Values below 1 are treated as 1.
|
|
"""#
|
|
arg <JOBS>
|
|
}
|
|
flag --allow-env help="Pass only VAR through from the environment (implies --deny-env)" var=#true {
|
|
long_help #"""
|
|
Pass only VAR through from the environment (implies --deny-env)
|
|
|
|
Supports wildcards, such as --allow-env='MYAPP_*'.
|
|
"""#
|
|
arg <VAR>
|
|
}
|
|
flag --allow-net help="Allow network access only to HOST (not supported on any platform)" var=#true {
|
|
long_help #"""
|
|
Allow network access only to HOST (not supported on any platform)
|
|
|
|
Per-host filtering does not work: Linux and macOS exit with an error,
|
|
and Windows runs the command without network restrictions. See
|
|
https://mise.jdx.dev/sandboxing.html#access-to-particular-hosts
|
|
"""#
|
|
arg <HOST>
|
|
}
|
|
flag --allow-read help="Allow reads from PATH (implies --deny-read for everything else)" var=#true {
|
|
arg <PATH>
|
|
}
|
|
flag --allow-write help="Allow writes to PATH (implies --deny-write for everything else)" var=#true {
|
|
arg <PATH>
|
|
}
|
|
flag --deny-all help="Block reads, writes, network, and env vars"
|
|
flag --deny-env help="Block env var inheritance except PATH, HOME, USER, SHELL, TERM, COLORTERM, LANG" {
|
|
long_help #"""
|
|
Block env var inheritance except PATH, HOME, USER, SHELL, TERM, COLORTERM, LANG
|
|
|
|
On Windows it also keeps the variables programs need to start, such as
|
|
SystemRoot and TEMP.
|
|
"""#
|
|
}
|
|
flag --deny-net help="Block all network access"
|
|
flag --deny-read help="Block filesystem reads (system libs and tool dirs still accessible)"
|
|
flag --deny-write help="Block filesystem writes except temporary and device paths (/tmp, /dev)"
|
|
flag --fresh-env help="Bypass the environment cache and recompute the environment"
|
|
flag --no-deps help="Skip automatic dependency preparation"
|
|
flag --raw help="Connect install commands directly to the terminal; implies --jobs=1" overrides=--jobs
|
|
flag --secrets help="[experimental] Give the command these secrets (comma-separated); by default it gets none" var=#true {
|
|
arg <SECRET> delimiter=,
|
|
}
|
|
flag --secrets-all help="[experimental] Give the command every secret the project can inject, except file secrets" conflicts=--secrets
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TOOL@VERSION]…" help="Tools to add or override, such as `node@24 python@3.13`" required=#false var=#true
|
|
arg "[-- COMMAND]…" help="Executable and arguments to run directly, after `--`" required=#false var=#true conflicts=--command required_unless=--command
|
|
example "mise exec node@24 -- node ./app.js" help="Run app.js with node 24"
|
|
example "mise x node@24 python@3.13 -c \"node -v && python -V\"" help="Run a shell command string"
|
|
example "mise x -C ~/work/api -- npm test" help="Run in another project's directory"
|
|
example "mise x --deny-net -- npm run build" help="Run without network access"
|
|
example "mise x --secrets GH_TOKEN -- gh release list" help="[experimental] Pass one secret from the project's secrets source"
|
|
complete command type=command
|
|
}
|
|
cmd fmt help="Format mise TOML configuration" effect=write {
|
|
long_help #"""
|
|
Format mise TOML configuration
|
|
|
|
Formats the config files in the current directory in place; --all formats every
|
|
config file mise loads. Use --check in CI to fail when a file is not formatted,
|
|
or --stdin to format a document from stdin to stdout.
|
|
|
|
Formatting normalizes whitespace and writes TOML 1.1 syntax, including multiline
|
|
inline tables. Top-level entries written as plain, dotted, or inline-table keys
|
|
go in a standard order: min_version, env_file, env_path, _, env, vars, hooks,
|
|
watch_files, tools, other keys, tasks, task_config, redactions, alias, plugins,
|
|
settings. `[table]` sections and the keys inside any table keep the order they
|
|
were written in.
|
|
|
|
Lists whose order has no effect are sorted: task `sources` and `outputs`,
|
|
`task_config.global_inputs` and `input_groups`, and `redactions`. File pattern
|
|
lists put `@group:` references first, then globs, then literal paths. A list
|
|
with a `!` exclusion or a comment is left as written.
|
|
"""#
|
|
flag "-a --all" help="Format every config file mise loads, not only those in the current directory"
|
|
flag "-c --check" help="Check whether the configs are formatted without rewriting them; exits 1 if any are not"
|
|
flag "-s --stdin" help="Format TOML from stdin and print it to stdout, without touching any file"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise fmt" help="Format the config files in the current directory"
|
|
example "mise fmt --check" help="Exit 1 if any config file needs formatting"
|
|
example "mise fmt --stdin < mise.toml" help="Print a formatted copy without changing the file"
|
|
}
|
|
cmd generate subcommand_required=#true help="Generate project files such as CI workflows, git hooks, and scripts" effect=read {
|
|
alias gen g
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd bootstrap hide=#true help="Deprecated; use `mise generate install-script`" effect=write {
|
|
long_help #"""
|
|
Generate a script that downloads and runs a pinned mise
|
|
|
|
Commit the script, for example as bin/mise, so contributors and CI can run
|
|
`./bin/mise install` without installing mise first. On first run it downloads
|
|
the pinned mise version into the mise data directory, or into the project with
|
|
--localize, then runs it with the arguments it was given.
|
|
|
|
`mise generate bootstrap` is a deprecated alias for this command and will be
|
|
removed in mise 2027.9.0.
|
|
"""#
|
|
flag "-l --localize" help="Keep mise data and cache in a project-local directory (`.mise` by default)" {
|
|
long_help #"""
|
|
Keep mise data and cache in a project-local directory (`.mise` by default)
|
|
|
|
Use `--localized-dir` to choose its location. This isolates mise state;
|
|
it is not an OS sandbox for commands the generated script runs.
|
|
"""#
|
|
}
|
|
flag "-V --version" help="mise version to pin; defaults to the release `mise self-update` would install" {
|
|
arg <VERSION>
|
|
}
|
|
flag "-w --write" help="Write the script to PATH (./bin/mise when no path is given) and make it executable, instead of printing it" value_optional=#true default_missing="./bin/mise" {
|
|
arg "[PATH]" required=#false var_min=0 var_max=1
|
|
}
|
|
flag --localized-dir help="Directory for mise data when using --localize, relative to the project" default=.mise {
|
|
arg <DIR>
|
|
}
|
|
flag --windows help="Also write a Windows launcher, `<PATH>.cmd`" requires=--write {
|
|
long_help #"""
|
|
Also write a Windows launcher, `<PATH>.cmd`
|
|
|
|
Windows cannot run the bash script. Generate the launcher on any OS and commit
|
|
it for contributors on Windows. Requires --write.
|
|
"""#
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise generate install-script --write ./bin/mise" help="Write ./bin/mise; on first run it downloads the pinned mise, then runs it"
|
|
example "mise generate install-script --localize --write ./bin/mise" help="Keep mise and its tools in .mise inside the project"
|
|
example "mise generate install-script --write ./bin/mise --windows" help="Also write bin/mise.cmd for contributors on Windows"
|
|
complete dir type=dir
|
|
}
|
|
cmd config help="Generate a mise.toml file" effect=destructive {
|
|
long_help #"""
|
|
Generate a mise.toml file
|
|
|
|
Same as `mise edit`, which has the details. It opens the interactive editor, or
|
|
without an interactive terminal (or with --yes) writes a commented starter
|
|
template. If PATH already exists it stops with an error rather than replace
|
|
the file; pass --force to replace it.
|
|
"""#
|
|
flag "-g --global" help="Generate the global config file (~/.config/mise/config.toml)" conflicts=PATH
|
|
flag "-n --dry-run" help="Print the result instead of writing it to the file"
|
|
flag "-f --force" help="Replace an existing file with the starter template when not opening the editor"
|
|
flag "-t --tool-versions" help="Copy the tools from this .tool-versions file into the config, without opening the editor" {
|
|
arg <FILE>
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[PATH]" help="Config file to edit or create; defaults to mise.toml" required=#false
|
|
example "mise generate config" help="Edit mise.toml in the current directory"
|
|
example "mise generate config -n" help="Print the result instead of writing it"
|
|
complete path type=path
|
|
complete file type=path
|
|
}
|
|
cmd devcontainer help="Generate a devcontainer configuration that installs mise and the project's tools" effect=write {
|
|
long_help #"""
|
|
Generate a devcontainer configuration that installs mise and the project's tools
|
|
|
|
Prints JSON by default. `--write` saves .devcontainer/devcontainer.json in the
|
|
repository root (or the current directory outside a git repository), replacing
|
|
an existing file. Review the image, mounts, and setup commands before opening it.
|
|
"""#
|
|
flag "-i --image" help="Base image; defaults to mcr.microsoft.com/devcontainers/base:ubuntu" {
|
|
arg <IMAGE>
|
|
}
|
|
flag "-m --mount-mise-data" help="Keep installed tools in a `mise-data-volume` Docker volume so they survive rebuilds" {
|
|
long_help #"""
|
|
Keep installed tools in a `mise-data-volume` Docker volume so they survive rebuilds
|
|
|
|
Mounts the volume at /mnt/mise-data, sets MISE_DATA_DIR to it, and adds its
|
|
shims directory to PATH.
|
|
"""#
|
|
}
|
|
flag "-n --name" help="Container name; defaults to mise" {
|
|
arg <NAME>
|
|
}
|
|
flag "-w --write" help="Write to .devcontainer/devcontainer.json instead of printing"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise generate devcontainer" help="Print the configuration"
|
|
example "mise generate devcontainer --mount-mise-data --write" help="Keep installed tools in a volume and save .devcontainer/devcontainer.json"
|
|
}
|
|
cmd git-pre-commit help="Generate a git hook that runs a mise task" effect=write {
|
|
alias pre-commit
|
|
long_help #"""
|
|
Generate a git hook that runs a mise task
|
|
|
|
The hook runs `mise run <TASK>` (default `pre-commit`) with the staged file names
|
|
in the STAGED environment variable. It prints the hook unless you pass --write,
|
|
which saves it in the repository's hooks directory and makes it executable.
|
|
|
|
For hooks that git gives a message file (commit-msg, prepare-commit-msg,
|
|
applypatch-msg, sendemail-validate), the task gets that file as an argument.
|
|
Other hook arguments, such as a pre-push hook's remote name and URL, are not
|
|
passed on.
|
|
|
|
For a full git hook manager, see hk: https://hk.jdx.dev
|
|
"""#
|
|
flag "-t --task" help="The task to run when the hook is triggered" default=pre-commit {
|
|
arg <TASK>
|
|
}
|
|
flag "-w --write" help="Write the hook to the hooks directory and make it executable" {
|
|
long_help #"""
|
|
Write the hook to the hooks directory and make it executable
|
|
|
|
The hooks directory is `.git/hooks`, or `core.hooksPath` when it is set. An existing hook of the same name is moved to `<HOOK>.old`.
|
|
"""#
|
|
}
|
|
flag --hook help="Which git hook to write, such as pre-push" default=pre-commit {
|
|
arg <HOOK>
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[-- MISE_ARG]…" help="mise flags to embed in the generated hook, given after `--`" help_long=#"""
|
|
mise flags to embed in the generated hook, given after `--`
|
|
|
|
These are inserted between `mise` and `run`, so the hook carries the same context you
|
|
would pass on the command line. Useful when the config is not at the repository root,
|
|
since git runs hooks from the top level: `-- -C subdir` makes the hook find it.
|
|
"""# required=#false var=#true
|
|
example "mise generate git-pre-commit --write --task=pre-commit" help="Install the hook; each commit then runs `mise run pre-commit`"
|
|
example "mise generate git-pre-commit --write -- -C subdir" help="Use the config in subdir, since git runs hooks from the repository root"
|
|
}
|
|
cmd github-action help="Generate a GitHub Actions workflow that runs a mise task" effect=write {
|
|
long_help #"""
|
|
Generate a GitHub Actions workflow that runs a mise task
|
|
|
|
The workflow runs the task named by --task on pull requests, tags, manual
|
|
dispatch, and pushes to the current branch. It prints YAML unless you pass
|
|
--write, which saves `.github/workflows/<NAME>.yml` in the repository root and
|
|
replaces an existing file. Define the task and review the triggers before
|
|
committing the workflow.
|
|
"""#
|
|
flag "-t --task" help="The task to run when the workflow is triggered" default=ci {
|
|
arg <TASK>
|
|
}
|
|
flag "-w --write" help="Write the workflow to `.github/workflows/<NAME>.yml` instead of printing it"
|
|
flag --name help="Name of the workflow and its file" default=ci {
|
|
arg <NAME>
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise generate github-action" help="Print a workflow that runs the ci task"
|
|
example "mise generate github-action --write" help="Save it as .github/workflows/ci.yml"
|
|
example "mise generate github-action --task lint --name lint --write" help="Save a workflow that runs the lint task as .github/workflows/lint.yml"
|
|
}
|
|
cmd install-script help="Generate a script that downloads and runs a pinned mise" effect=write {
|
|
long_help #"""
|
|
Generate a script that downloads and runs a pinned mise
|
|
|
|
Commit the script, for example as bin/mise, so contributors and CI can run
|
|
`./bin/mise install` without installing mise first. On first run it downloads
|
|
the pinned mise version into the mise data directory, or into the project with
|
|
--localize, then runs it with the arguments it was given.
|
|
|
|
`mise generate bootstrap` is a deprecated alias for this command and will be
|
|
removed in mise 2027.9.0.
|
|
"""#
|
|
flag "-l --localize" help="Keep mise data and cache in a project-local directory (`.mise` by default)" {
|
|
long_help #"""
|
|
Keep mise data and cache in a project-local directory (`.mise` by default)
|
|
|
|
Use `--localized-dir` to choose its location. This isolates mise state;
|
|
it is not an OS sandbox for commands the generated script runs.
|
|
"""#
|
|
}
|
|
flag "-V --version" help="mise version to pin; defaults to the release `mise self-update` would install" {
|
|
arg <VERSION>
|
|
}
|
|
flag "-w --write" help="Write the script to PATH (./bin/mise when no path is given) and make it executable, instead of printing it" value_optional=#true default_missing="./bin/mise" {
|
|
arg "[PATH]" required=#false var_min=0 var_max=1
|
|
}
|
|
flag --localized-dir help="Directory for mise data when using --localize, relative to the project" default=.mise {
|
|
arg <DIR>
|
|
}
|
|
flag --windows help="Also write a Windows launcher, `<PATH>.cmd`" requires=--write {
|
|
long_help #"""
|
|
Also write a Windows launcher, `<PATH>.cmd`
|
|
|
|
Windows cannot run the bash script. Generate the launcher on any OS and commit
|
|
it for contributors on Windows. Requires --write.
|
|
"""#
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise generate install-script --write ./bin/mise" help="Write ./bin/mise; on first run it downloads the pinned mise, then runs it"
|
|
example "mise generate install-script --localize --write ./bin/mise" help="Keep mise and its tools in .mise inside the project"
|
|
example "mise generate install-script --write ./bin/mise --windows" help="Also write bin/mise.cmd for contributors on Windows"
|
|
complete dir type=dir
|
|
}
|
|
cmd task-docs help="Generate Markdown documentation for project tasks" effect=write {
|
|
long_help #"""
|
|
Generate Markdown documentation for project tasks
|
|
|
|
Documents the tasks defined for the current directory. Prints to stdout by
|
|
default. Use `--output` to write a file, `--inject` to replace a marked section,
|
|
or `--multi` for one file per task.
|
|
"""#
|
|
flag "-i --inject" help="Replace the marked section of the --output file" {
|
|
long_help #"""
|
|
Replace the marked section of the --output file
|
|
|
|
Replaces everything between `<!-- mise-tasks -->` and `<!-- /mise-tasks -->`
|
|
in the --output file, so you can rerun it to update the docs. The file must
|
|
already contain both markers; mise reports an error and leaves the file
|
|
unchanged if either is missing.
|
|
"""#
|
|
}
|
|
flag "-I --index" help="Write only an index of tasks, intended for use with `--multi`"
|
|
flag "-m --multi" help="Render each task as a separate document; requires `--output` to be a directory"
|
|
flag "-o --output" help="Write the generated docs to a file or directory" {
|
|
arg <PATH>
|
|
}
|
|
flag "-r --root" help="Has no effect; tasks always come from the current directory" hide=#true {
|
|
arg <ROOT>
|
|
}
|
|
flag "-s --style" help="Has no effect; both styles produce the same output" hide=#true default=simple {
|
|
arg <STYLE> {
|
|
choices {
|
|
choice simple
|
|
choice detailed
|
|
}
|
|
}
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise generate task-docs" help="Print the task documentation"
|
|
example "mise generate task-docs --output TASKS.md" help="Write the task documentation to TASKS.md"
|
|
example "mise generate task-docs --inject --output README.md" help="Update the marked section of README.md"
|
|
complete root type=dir
|
|
}
|
|
cmd task-stubs help="Generate scripts that run mise tasks" effect=write {
|
|
long_help #"""
|
|
Generate scripts that run mise tasks
|
|
|
|
Writes one executable stub per task into a directory, such as `bin/test` for
|
|
the `test` task, that runs the task with mise. Pair them with
|
|
`mise generate install-script` so contributors can run tasks without installing
|
|
mise. When a task has subtasks, the parent's stub is written to
|
|
`<parent>/_default`.
|
|
|
|
Hidden tasks and global tasks are skipped: the stubs are committed to the
|
|
project, and global tasks come from each user's own config.
|
|
"""#
|
|
flag "-d --dir" help="Directory to create task stubs inside of" default=bin {
|
|
arg <DIR>
|
|
}
|
|
flag "-m --mise-bin" help="mise executable the stubs run; defaults to mise from PATH" default=mise {
|
|
long_help #"""
|
|
mise executable the stubs run; defaults to mise from PATH
|
|
|
|
Use `--mise-bin ./bin/mise` with a script from `mise generate install-script`.
|
|
On Windows a path runs as written, so that script needs its `.cmd` launcher
|
|
beside it; generate it with
|
|
`mise generate install-script --write ./bin/mise --windows`. The default,
|
|
`mise`, is a bare name that resolves from PATH and needs nothing extra.
|
|
"""#
|
|
arg <PATH>
|
|
}
|
|
flag --windows-launcher help="What to write beside each stub for Windows to launch" default=cmd {
|
|
long_help #"""
|
|
What to write beside each stub for Windows to launch
|
|
|
|
`cmd` writes `<task>.cmd`. cmd.exe re-parses the whole line before `%*` expands, so an
|
|
argument containing `& ^ | " %VAR%` does not reach the task intact when the launcher is
|
|
called from PowerShell.
|
|
|
|
`exe` writes a native `<task>.exe` instead, which receives its arguments unchanged from
|
|
every shell. It is a copy of the mise-shim.exe that ships with the Windows build, so it
|
|
can only be generated on Windows, and it adds ~220KB per task to a directory that is
|
|
normally committed.
|
|
"""#
|
|
arg <KIND> {
|
|
choices {
|
|
choice cmd
|
|
choice exe
|
|
}
|
|
}
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise generate task-stubs" help="Write a stub for each task into ./bin"
|
|
example "mise generate task-stubs --mise-bin ./bin/mise" help="Make the stubs run the mise that `mise generate install-script` wrote"
|
|
complete dir type=dir
|
|
}
|
|
cmd tool-stub help="Generate or update a tool stub" effect=write {
|
|
long_help #"""
|
|
Generate or update a tool stub
|
|
|
|
A tool stub is an executable file that names a tool and where to get it;
|
|
running it installs the tool if needed and runs it. See
|
|
https://mise.jdx.dev/dev-tools/tool-stubs.html.
|
|
|
|
Pass --url or --platform-url to create or extend a stub. mise downloads each
|
|
artifact to record its checksum, size, and binary path unless you pass
|
|
--skip-download. On an existing stub, new platforms are added and URLs you pass
|
|
again are replaced. --fetch fills in missing checksums and sizes, and --lock
|
|
records lock data for an existing stub, including one that uses a registry tool.
|
|
"""#
|
|
flag "-b --bin" help="Binary path within the extracted archive" {
|
|
long_help #"""
|
|
Binary path within the extracted archive
|
|
|
|
If not specified and the archive is downloaded, mise detects the most likely binary.
|
|
"""#
|
|
arg <BIN>
|
|
}
|
|
flag --bootstrap help="Make the stub install mise when it is missing" {
|
|
long_help #"""
|
|
Make the stub install mise when it is missing
|
|
|
|
The stub becomes a bash script that:
|
|
1. Uses mise from PATH, or ~/.local/bin/mise
|
|
2. Otherwise installs mise to ~/.local/bin with the embedded installer
|
|
3. Runs the tool stub with mise
|
|
"""#
|
|
}
|
|
flag --bootstrap-version help="mise version the --bootstrap script installs; defaults to the latest release" requires=--bootstrap {
|
|
long_help #"""
|
|
mise version the --bootstrap script installs; defaults to the latest release
|
|
|
|
Pin a version such as `2026.10.0` to keep the installer reproducible.
|
|
"""#
|
|
arg <BOOTSTRAP_VERSION>
|
|
}
|
|
flag --checksum-algorithm help="Checksum algorithm for downloaded artifacts" default=blake3 {
|
|
long_help #"""
|
|
Checksum algorithm for downloaded artifacts
|
|
|
|
Not available with --lock or --skip-download, which do not compute checksums.
|
|
"""#
|
|
conflicts "--lock" "--skip-download"
|
|
arg <ALGORITHM> {
|
|
choices {
|
|
choice blake3
|
|
choice sha256
|
|
}
|
|
}
|
|
}
|
|
flag --fetch help="Fetch checksums and sizes for an existing tool stub file" {
|
|
long_help #"""
|
|
Fetch checksums and sizes for an existing tool stub file
|
|
|
|
Reads an existing stub file and fills in missing checksum and size fields by downloading the files. URLs must already be present in the stub.
|
|
"""#
|
|
conflicts "--url" "--platform-url" "--version" "--bin" "--platform-bin" "--skip-download" "--lock"
|
|
}
|
|
flag --http help="Has no effect; kept so existing scripts that pass it keep working" hide=#true default=http {
|
|
arg <HTTP>
|
|
}
|
|
flag --lock help="Resolve and record lock data (exact version, platform URLs and checksums) for an existing stub" {
|
|
long_help #"""
|
|
Resolve and record lock data (exact version, platform URLs and checksums) for an existing stub
|
|
|
|
The data goes into the `mise.lock` of the nearest project config above the
|
|
stub, and the stub keeps its version request. It is an error when no project
|
|
config is found.
|
|
"""#
|
|
conflicts "--url" "--platform-url" "--bin" "--platform-bin" "--fetch" "--skip-download"
|
|
}
|
|
flag --platform-bin help="Binary path inside the archive for one platform, such as `linux-x64:bin/tool`; repeatable" var=#true {
|
|
arg <PLATFORM_BIN>
|
|
}
|
|
flag --platform-url help="Download URL for one platform, as `PLATFORM:URL` or a bare URL; repeatable" var=#true {
|
|
long_help #"""
|
|
Download URL for one platform, as `PLATFORM:URL` or a bare URL; repeatable
|
|
|
|
With a bare URL, mise detects the platform from the file name, such as `--platform-url https://nodejs.org/dist/v24.11.0/node-v24.11.0-darwin-arm64.tar.gz`. When the output file already exists, new platforms are added to its platforms table, and a platform you pass again gets the new URL.
|
|
"""#
|
|
arg <PLATFORM_URL>
|
|
}
|
|
flag --skip-download help="Do not download artifacts, so checksums, sizes, and the detected binary path are left out"
|
|
flag "-u --url" help="URL to download the tool from" {
|
|
arg <URL>
|
|
}
|
|
flag --version help="Version of the tool" default=latest {
|
|
arg <VERSION>
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <OUTPUT> help="Output file path for the tool stub"
|
|
example "mise generate tool-stub ./bin/node --platform-url https://nodejs.org/dist/v24.11.0/node-v24.11.0-darwin-arm64.tar.gz" help="Download and inspect a real archive to detect its binary and checksum"
|
|
example "mise generate tool-stub ./bin/node --platform-url linux-x64:https://nodejs.org/dist/v24.11.0/node-v24.11.0-linux-x64.tar.gz" help="Add a Linux artifact to the same stub"
|
|
example "mise generate tool-stub ./bin/my-tool --url https://example.com/my-tool.tar.gz --skip-download" help="Draft a stub without downloading; replace the placeholder URL before running it"
|
|
example "mise generate tool-stub ./bin/node --fetch" help="Fill missing checksums and sizes in an existing stub"
|
|
example "mise generate tool-stub ./bin/registry-node --lock --version 24" help="Resolve and record the version and platform lock data of an existing registry-backed stub"
|
|
complete output type=path
|
|
}
|
|
}
|
|
cmd github hide=#true subcommand_required=#true help="GitHub commands (deprecated; use `mise token github`)" effect=read {
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd token hide=#true help="Show the GitHub token for a host (deprecated)" effect=read {
|
|
long_help #"""
|
|
Show the GitHub token for a host (deprecated)
|
|
|
|
Shows which token source mise would use, to debug authentication problems.
|
|
The token is masked unless you pass --unmask. This command is deprecated; use
|
|
`mise token github` instead.
|
|
"""#
|
|
flag --oauth help="Force native GitHub OAuth device flow instead of normal token resolution"
|
|
flag --raw help="Print only the token value"
|
|
flag --refresh help="Mint a fresh OAuth token even if the cached one has not expired, via the refresh-token grant or a new device-code flow" requires=--oauth
|
|
flag --unmask help="Show the full unmasked token"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[HOST]" help="GitHub hostname" required=#false default=github.com
|
|
example #"""
|
|
mise github token
|
|
github.com: ghp_…xxxx (source: GITHUB_TOKEN)
|
|
"""#
|
|
example #"""
|
|
mise github token --unmask
|
|
github.com: ghp_xxxxxxxxxxxx (source: GITHUB_TOKEN)
|
|
"""#
|
|
example #"""
|
|
mise github token github.mycompany.com
|
|
github.mycompany.com: (none)
|
|
"""#
|
|
}
|
|
}
|
|
cmd global hide=#true help="Set or show the global tool versions (deprecated; use `mise use -g`)" effect=write {
|
|
long_help #"""
|
|
Set or show the global tool versions (deprecated; use `mise use -g`)
|
|
|
|
With no arguments, prints the global config. With tools, writes them and
|
|
prints the file and the tools it changed. The file is
|
|
`~/.config/mise/config.toml` unless `MISE_GLOBAL_CONFIG_FILE` names another. A
|
|
path ending in `.toml` is parsed as `mise.toml`; any other path is parsed as a
|
|
`.tool-versions` file.
|
|
|
|
Set MISE_ASDF_COMPAT=1 to make ~/.tool-versions the default global config.
|
|
"""#
|
|
flag --fuzzy help="Save the version as written, such as `24`" overrides=--pin {
|
|
long_help #"""
|
|
Save the version as written, such as `24`
|
|
|
|
This is the default unless MISE_ASDF_COMPAT=1.
|
|
"""#
|
|
}
|
|
flag --path help="Print the path of the global config file"
|
|
flag --pin help="Save the exact version, such as `24.11.0`" overrides=--fuzzy
|
|
flag --remove help="Remove these tools from the global config" var=#true {
|
|
alias "--rm" "--unset" hide=#true
|
|
arg <TOOL>
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TOOL@VERSION]…" help="Tools to add to the global config, such as `node@24`" help_long=#"""
|
|
Tools to add to the global config, such as `node@24`
|
|
|
|
With a single tool and no version, prints that tool's global version.
|
|
"""# required=#false var=#true
|
|
example "mise global --fuzzy node@24" help="Save node 24 as written, such as `node = \"24\"`, to the global config"
|
|
example "mise global --pin node@24" help="Save the exact version, such as `node = \"24.11.0\"`"
|
|
example #"""
|
|
mise global node
|
|
24.11.0
|
|
"""# help="Show the global node version"
|
|
}
|
|
cmd hook-env hide=#true help="[internal] Update the environment at each prompt" effect=read {
|
|
long_help #"""
|
|
[internal] Update the environment at each prompt
|
|
|
|
The shell hook that `mise activate` installs runs this command.
|
|
"""#
|
|
flag "-f --force" help="Skip early exit check"
|
|
flag "-q --quiet" help="Hide warnings such as when a tool is not installed"
|
|
flag "-s --shell" help="Shell type to generate script for" {
|
|
arg <SHELL> {
|
|
choices {
|
|
choice bash
|
|
choice elvish
|
|
choice fish
|
|
choice nu
|
|
choice xonsh
|
|
choice zsh
|
|
choice pwsh {
|
|
alias powershell
|
|
}
|
|
}
|
|
}
|
|
}
|
|
flag --reason help="Reason for calling hook-env (e.g., \"precmd\", \"chpwd\")" hide=#true {
|
|
arg <REASON> {
|
|
choices {
|
|
choice precmd
|
|
choice chpwd
|
|
}
|
|
}
|
|
}
|
|
flag --status help="Show \"mise: <TOOL>@<VERSION>\" message when changing directories" hide=#true
|
|
flag --shell-pid hide=#true {
|
|
arg <SHELL_PID>
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
cmd hook-not-found hide=#true help="[internal] Handle a command the shell could not find" effect=write {
|
|
flag "-s --shell" help="Shell type to generate script for" {
|
|
arg <SHELL> {
|
|
choices {
|
|
choice bash
|
|
choice elvish
|
|
choice fish
|
|
choice nu
|
|
choice xonsh
|
|
choice zsh
|
|
choice pwsh {
|
|
alias powershell
|
|
}
|
|
}
|
|
}
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <BIN> help="Attempted bin to run"
|
|
}
|
|
cmd implode help="Remove the mise CLI and all related data" effect=destructive {
|
|
long_help #"""
|
|
Remove the mise CLI and all related data
|
|
|
|
Deletes the mise executable and the data (including installed tools), state,
|
|
and cache directories. It also deletes the system-wide shared directory used by
|
|
`mise install --system` (MISE_SYSTEM_DATA_DIR, default /usr/local/share/mise),
|
|
which other users on the machine may rely on. It asks before each removal;
|
|
--yes skips the prompts. The config directory stays unless you pass --config.
|
|
|
|
If a package manager such as Homebrew or apt installed mise, uninstall it with
|
|
that package manager instead. Remove the `mise activate` line from your shell
|
|
startup file yourself. See
|
|
https://mise.jdx.dev/installing-mise.html#uninstalling.
|
|
"""#
|
|
flag "-n --dry-run" help="Print what would be removed, without removing anything"
|
|
flag --config help="Also remove the config directory"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise implode --dry-run" help="List what would be removed"
|
|
}
|
|
cmd edit help="Edit mise.toml interactively" effect=destructive {
|
|
long_help #"""
|
|
Edit mise.toml interactively
|
|
|
|
Opens a terminal editor for PATH (default: mise.toml in the current directory)
|
|
where you can add tools from the registry, pick versions, and set environment
|
|
variables, tasks, and settings. It pre-fills tools it detects from files in the
|
|
current directory, such as `.node-version`.
|
|
|
|
Without an interactive terminal, or with --yes, it writes a commented starter
|
|
template instead. If PATH already exists it stops with an error rather than
|
|
replace the file; pass --force to replace it. Use --dry-run to print the result
|
|
without writing it.
|
|
"""#
|
|
flag "-g --global" help="Edit the global config file (~/.config/mise/config.toml)" conflicts=PATH
|
|
flag "-n --dry-run" help="Print the result instead of writing it to the file"
|
|
flag "-f --force" help="Replace an existing file with the starter template when not opening the editor"
|
|
flag "-t --tool-versions" help="Copy the tools from this .tool-versions file into the config, without opening the editor" {
|
|
arg <FILE>
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[PATH]" help="Config file to edit or create; defaults to mise.toml" required=#false
|
|
example "mise edit" help="Edit mise.toml in the current directory"
|
|
example "mise edit mise.local.toml" help="Edit another config file"
|
|
example "mise edit -g" help="Edit the global config"
|
|
example "mise edit -t .tool-versions" help="Copy the tools from .tool-versions into mise.toml"
|
|
example "mise edit -n" help="Print the result instead of writing it"
|
|
example "mise edit -y new.toml" help="Write a commented starter config to a new file without opening the editor"
|
|
example "mise edit -y --force" help="Replace an existing mise.toml with the starter config"
|
|
complete path type=path
|
|
complete file type=path
|
|
}
|
|
cmd install help="Install the tools in your config, or specific tool versions" effect=write {
|
|
alias i
|
|
long_help #"""
|
|
Install the tools in your config, or specific tool versions
|
|
|
|
With no arguments, installs every tool version your config requests that is not
|
|
installed yet. With TOOL@VERSION arguments, installs those versions; a bare tool
|
|
name installs the version your config requests for it.
|
|
|
|
Installing does not add a tool to your config, so a tool you have not configured
|
|
is not on PATH. Use `mise use` to install a tool and add it to mise.toml, or
|
|
`mise exec <TOOL>@<VERSION> -- <COMMAND>` to run it once.
|
|
|
|
Versions install in parallel (see --jobs) under the mise data directory, by
|
|
default `~/.local/share/mise/installs/<TOOL>/<VERSION>`.
|
|
"""#
|
|
flag "-f --force" help="Reinstall even if already installed" {
|
|
long_help #"""
|
|
Reinstall even if already installed
|
|
|
|
With no TOOL arguments, reinstalls every configured tool.
|
|
"""#
|
|
}
|
|
flag "-j --jobs" help="How many tools to install in parallel; defaults to the `jobs` setting" env=MISE_JOBS {
|
|
long_help #"""
|
|
How many tools to install in parallel; defaults to the `jobs` setting
|
|
|
|
Values below 1 are treated as 1.
|
|
"""#
|
|
arg <JOBS>
|
|
}
|
|
flag "-n --dry-run" help="Show what would be installed, without installing anything"
|
|
flag "-v --verbose" help="Show installer output" var=#true count=#true {
|
|
long_help #"""
|
|
Show installer output
|
|
|
|
Prints each backend's download, configure, and compile output.
|
|
"""#
|
|
}
|
|
flag --dry-run-code help="Like --dry-run, but exit with status 1 when anything needs installing" {
|
|
long_help #"""
|
|
Like --dry-run, but exit with status 1 when anything needs installing
|
|
|
|
Use it in scripts to check whether `mise install` has work to do.
|
|
"""#
|
|
}
|
|
flag --include-task-tools help="Also install tools required by tasks in the current scope" {
|
|
long_help #"""
|
|
Also install tools required by tasks in the current scope
|
|
|
|
This prepares task tools without running task commands or dependencies.
|
|
Combine with --monorepo to include tasks from every configured root.
|
|
"""#
|
|
}
|
|
flag --include-lazy help="Also install tools configured with `lazy = true`" {
|
|
long_help #"""
|
|
Also install tools configured with `lazy = true`
|
|
|
|
By default, a bare `mise install` leaves lazy tools to be installed the first
|
|
time you run one of their commands.
|
|
"""#
|
|
}
|
|
flag --minimum-release-age help="Only install versions released before a date or at least a duration ago" {
|
|
alias "--before" hide=#true
|
|
long_help #"""
|
|
Only install versions released before a date or at least a duration ago
|
|
|
|
Takes a date such as `2024-06-01` or a duration such as `90d` or `1y`.
|
|
Overrides the `minimum_release_age` setting and tool option.
|
|
"""#
|
|
arg <AGE>
|
|
}
|
|
flag --monorepo help="Also install tools from every config root in `[monorepo].config_roots`" env=MISE_MONOREPO {
|
|
long_help #"""
|
|
Also install tools from every config root in `[monorepo].config_roots`
|
|
|
|
Requires `monorepo_root = true` and an explicit `config_roots` list in the
|
|
monorepo root's config. Uses the active MISE_ENV.
|
|
"""#
|
|
}
|
|
flag --raw help="Connect install commands directly to the terminal; implies --jobs=1" overrides=--jobs
|
|
flag --shared help="Install into DIR instead of the mise data directory" conflicts=--system {
|
|
long_help #"""
|
|
Install into DIR instead of the mise data directory
|
|
|
|
May require elevated permissions, depending on the path.
|
|
"""#
|
|
arg <DIR>
|
|
}
|
|
flag --system help="Install into the system-wide shared directory" conflicts=--shared {
|
|
long_help #"""
|
|
Install into the system-wide shared directory
|
|
|
|
Installs to /usr/local/share/mise/installs (or MISE_SYSTEM_DATA_DIR/installs).
|
|
On Unix, binary-download backends invoke sudo to publish into protected
|
|
system directories unless system_packages.sudo is disabled. Run mise as
|
|
your user, without sudo.
|
|
"""#
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TOOL@VERSION]…" help="Tools to install, such as `node@24`; defaults to every tool in the config" required=#false var=#true
|
|
example "mise install" help="Install every tool the config requests"
|
|
example "mise install node" help="Install the node version the config requests"
|
|
example "mise install node@24" help="Install the latest node 24.x release"
|
|
example "mise install node@24.11.0" help="Install an exact version"
|
|
example "mise install --include-lazy" help="Also install tools marked lazy = true"
|
|
example "mise install --include-task-tools" help="Also install the tools your tasks need"
|
|
complete dir type=dir
|
|
}
|
|
cmd install-into help="Install a tool version into a directory outside mise" effect=destructive {
|
|
long_help #"""
|
|
Install a tool version into a directory outside mise
|
|
|
|
Downloads or builds TOOL@VERSION into PATH for use without mise. mise does not
|
|
track the result, so it does not appear in `mise ls`.
|
|
|
|
If PATH is not empty, mise asks before deleting its contents; --yes deletes
|
|
them without asking.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <TOOL@VERSION> help="Tool and version to install, such as `node@24`"
|
|
arg <PATH> help="Directory to install into; its existing contents are deleted"
|
|
example #"""
|
|
mise install-into node@24 ./mynode && ./mynode/bin/node -v
|
|
v24.11.0
|
|
"""# help="Install node 24 into ./mynode and run it"
|
|
complete path type=dir
|
|
}
|
|
cmd installs help="[experimental] Inspect and choose identity-layout installations" effect=read {
|
|
long_help #"""
|
|
[experimental] Inspect and choose identity-layout installations
|
|
|
|
With `install_layout = "identity"`, each installation lives in its own
|
|
`<label>-<hash>` directory, and several installations of one version can
|
|
exist side by side (different options, platforms, pinned artifacts, or a
|
|
refreshed copy). These commands list them, choose which one mise uses when
|
|
no lockfile pins one, and move installations made before you turned the
|
|
layout on into it. With no subcommand, runs `mise installs ls`. See
|
|
https://mise.jdx.dev/dev-tools/install-layout.html.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd ls help="List the installations of the identity install layout" effect=read {
|
|
alias list
|
|
long_help #"""
|
|
List the installations of the identity install layout
|
|
|
|
Every installation is listed separately, so variants of one version (made
|
|
with different options, or pinned to different artifacts by lockfiles) can
|
|
be told apart. The Status column marks the installation mise uses when no
|
|
lockfile pins one (`selected`), installations a lockfile pins (`pinned`), and
|
|
installations in a read-only shared installs directory (`shared`).
|
|
"""#
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --no-header help="Do not print the table header"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TOOL]…" help="Only show the installations of these tools" required=#false var=#true
|
|
example "mise installs ls" help="List every installation in the identity layout"
|
|
example "mise installs ls node --json" help="List the installations of node as JSON"
|
|
}
|
|
cmd migrate help="Reinstall legacy installations into the identity install layout" effect=write {
|
|
long_help #"""
|
|
Reinstall legacy installations into the identity install layout
|
|
|
|
Installations made before `install_layout = "identity"` was turned on stay in
|
|
`installs/<tool>/<version>` and keep working; mise never moves them on its own,
|
|
because tools record their own path in shebangs, virtual environments and
|
|
package-manager files. This reinstalls each one into its own `<label>-<hash>`
|
|
directory, then removes the old directory and puts the version link in its
|
|
place, so a path that pointed into the old directory still resolves.
|
|
|
|
Each version is reinstalled from its backend, not copied, so the files are
|
|
written for their new path. Run it while nothing is using the tools: the old
|
|
directory is moved aside while its replacement installs, and put back if that
|
|
fails. Versions whose recorded backend is not the one their tool resolves to
|
|
now are left alone, as are tools that keep the legacy layout (`http:`,
|
|
`rust`, `dotnet`).
|
|
|
|
A version that cannot be reinstalled (its release was withdrawn or is signed
|
|
by someone else now, or the network is unavailable) is not an error: its
|
|
directory is moved as it is into the identity layout, behind the same version
|
|
link. Only a version that cannot be moved either keeps its old directory,
|
|
reported as kept in the legacy layout. The command ends with a count of what
|
|
was migrated, relocated, kept and failed, and fails only when a migration
|
|
itself broke.
|
|
"""#
|
|
flag "-n --dry-run" help="Show what would move without changing anything"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TOOL@VERSION]…" help="Only migrate these tools, or these versions of them" help_long=#"""
|
|
Only migrate these tools, or these versions of them
|
|
|
|
Defaults to every legacy installation.
|
|
"""# required=#false var=#true
|
|
example "mise installs migrate --dry-run" help="List the legacy installations that would move"
|
|
example "mise installs migrate node python@3.12.1" help="Move every installed node and one python version"
|
|
}
|
|
cmd select help="Choose which installation mise uses when no lockfile pins one" effect=write {
|
|
long_help #"""
|
|
Choose which installation mise uses when no lockfile pins one
|
|
|
|
Several installations can match the same request, such as a refreshed copy next
|
|
to one a lockfile pinned, or installations made for different lockfiles. For a
|
|
request with no lockfile entry, mise uses the installation selected for that
|
|
tool, version, platform, and options. If none is selected and several match,
|
|
mise stops and tells you to run this command.
|
|
|
|
The selection is shared by every project on this machine that makes the same
|
|
request without a lockfile. Projects whose lockfile pins an artifact keep the
|
|
installation of that artifact. The version link (`installs/<tool>/<version>`)
|
|
is pointed at the selected installation.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <INSTALLATION> help="The installation to select: its directory name, or its path"
|
|
example "mise installs ls jq" help="Find jq's installations"
|
|
example "mise installs select jq-hm3qa4vb" help="Use this one for requests with no lockfile entry"
|
|
}
|
|
}
|
|
cmd latest help="Print the latest version that matches a version request" effect=read {
|
|
long_help #"""
|
|
Print the latest version that matches a version request
|
|
|
|
`mise latest node` prints the latest release, and `mise latest node@22` the
|
|
latest 22.x release. Each backend decides what "latest" means, for example
|
|
whether prereleases count and how channels and refs resolve. Nothing is
|
|
installed and no config changes.
|
|
"""#
|
|
flag "-i --installed" help="Print the latest installed version instead of the latest available one"
|
|
flag --minimum-release-age help="Only consider versions released before a date or at least a duration ago" conflicts=--installed {
|
|
alias "--before" hide=#true
|
|
long_help #"""
|
|
Only consider versions released before a date or at least a duration ago
|
|
|
|
Takes a date such as `2024-06-01` or a duration such as `90d` or `1y`.
|
|
Overrides the `minimum_release_age` setting and tool option.
|
|
"""#
|
|
arg <AGE>
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <TOOL@VERSION> help="Tool, optionally with a version prefix, such as `node` or `node@22`"
|
|
arg "[ASDF_VERSION]" help="The version prefix to use when querying the latest version same as the first argument after the \"@\" used for asdf compatibility" required=#false hide=#true
|
|
example "mise latest node" help="Print the latest node release"
|
|
example "mise latest node@22" help="Print the latest node 22.x release"
|
|
example "mise latest node@22 --installed" help="Print the latest installed node 22.x version"
|
|
example "mise latest node --minimum-release-age 30d" help="Skip releases from the last 30 days"
|
|
}
|
|
cmd link help="Symlink a tool version into mise" effect=write {
|
|
alias ln
|
|
long_help #"""
|
|
Symlink a tool version into mise
|
|
|
|
Use this to register an install that was compiled by hand or built with another
|
|
tool. mise uses the version exactly as written, such as `node@24.11.0` or a name
|
|
of your own like `node@brew`; `latest`, aliases, and channels are rejected.
|
|
"""#
|
|
flag "-f --force" help="Replace an existing installation of this version"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <TOOL@VERSION> help="Tool and version to create a symlink for"
|
|
arg <PATH> help="Directory of the existing installation, such as `~/.nvm/versions/node/v24.11.0`"
|
|
example "mise link node@24.11.0 ~/.nodes/24.11.0" help="Link a node that node-build built into ~/.nodes/24.11.0"
|
|
example "mise link node@brew \"$(brew --prefix node)\"" help="Register Homebrew's node as node@brew; then run `mise use node@brew`"
|
|
complete path type=dir
|
|
}
|
|
cmd local hide=#true help="Set or show local tool versions (deprecated; use `mise use`)" effect=write {
|
|
alias l
|
|
long_help #"""
|
|
Set or show local tool versions (deprecated; use `mise use`)
|
|
|
|
Writes `mise.toml` in the current directory, or an existing `.tool-versions`
|
|
there when there is no `mise.toml`. Set MISE_USE_TOML=0 to create
|
|
`.tool-versions` instead. Use `mise global` for the global config.
|
|
"""#
|
|
flag "-p --parent" help="Use the nearest `mise.toml` in this or a parent directory" {
|
|
long_help #"""
|
|
Use the nearest `mise.toml` in this or a parent directory
|
|
|
|
By default, only the current directory is used. With MISE_USE_TOML=0, a
|
|
`.tool-versions` file also counts.
|
|
"""#
|
|
}
|
|
flag --fuzzy help="Save the version as written, such as `24`" overrides=--pin {
|
|
long_help #"""
|
|
Save the version as written, such as `24`
|
|
|
|
This is the default unless MISE_ASDF_COMPAT=1.
|
|
"""#
|
|
}
|
|
flag --path help="Print the path of the config file"
|
|
flag --pin help="Save the exact version, such as `24.11.0`" overrides=--fuzzy
|
|
flag --remove help="Remove these tools from the local config" var=#true {
|
|
alias "--rm" "--unset" hide=#true
|
|
arg <TOOL>
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TOOL@VERSION]…" help="Tools to add to `mise.toml` or `.tool-versions`, such as `node@24`" help_long=#"""
|
|
Tools to add to `mise.toml` or `.tool-versions`, such as `node@24`
|
|
|
|
With a single tool and no version, prints that tool's local version.
|
|
"""# required=#false var=#true
|
|
example "mise local --pin node@24" help="Save the exact version, such as `node = \"24.11.0\"`, in the current directory"
|
|
example "mise local -p node@24" help="Save node 24 in the nearest `mise.toml` in this or a parent directory"
|
|
example "mise local --fuzzy node@24" help="Save node 24 as written, such as `node = \"24\"`, in the current directory"
|
|
example "mise local --remove=node" help="Remove node from the local config"
|
|
example #"""
|
|
mise local node
|
|
24.11.0
|
|
"""# help="Show the local node version"
|
|
}
|
|
cmd lock help="Create or refresh lockfile versions, checksums, and download URLs" effect=write {
|
|
long_help #"""
|
|
Create or refresh lockfile versions, checksums, and download URLs
|
|
|
|
Operates on the current config root, including tools declared by tasks.
|
|
Existing matching locked versions are preserved unless `--bump` re-resolves
|
|
their requests. This command does not install tools; `--dry-run` previews
|
|
changes.
|
|
|
|
`mise lock TOOL@VERSION` locks that exact version. When the version falls
|
|
outside the configured request, such as `tiny@3.0.1` with `tiny = "2"`, mise
|
|
also updates the request in mise.toml to match.
|
|
"""#
|
|
flag "-g --global" help="Lock only the global and system config lockfiles" {
|
|
long_help #"""
|
|
Lock only the global and system config lockfiles
|
|
|
|
These are ~/.config/mise/mise.lock and the system config's lockfile. By
|
|
default, only the current project's config root is locked.
|
|
"""#
|
|
}
|
|
flag "-j --jobs" help="How many jobs to run in parallel; defaults to the `jobs` setting" env=MISE_JOBS {
|
|
long_help #"""
|
|
How many jobs to run in parallel; defaults to the `jobs` setting
|
|
|
|
Values below 1 are treated as 1.
|
|
"""#
|
|
arg <JOBS>
|
|
}
|
|
flag "-n --dry-run" help="Show what would change, without writing anything"
|
|
flag "-p --platform" help="Platforms to lock, comma-separated, such as `linux-x64,macos-arm64`" var=#true {
|
|
long_help #"""
|
|
Platforms to lock, comma-separated, such as `linux-x64,macos-arm64`
|
|
|
|
Defaults to the `lockfile_platforms` setting plus the current platform when
|
|
that setting is configured, else the platforms already in the lockfile, else
|
|
a common set for a new lockfile.
|
|
"""#
|
|
arg <PLATFORM> delimiter=,
|
|
}
|
|
flag --bump help="Re-resolve version requests against the latest available versions" {
|
|
long_help #"""
|
|
Re-resolve version requests against the latest available versions
|
|
|
|
By default, `mise lock` refreshes metadata for the currently locked versions.
|
|
With this flag, requests such as "latest", "lts", or prefixes such as "24" are
|
|
re-resolved against the latest matching remote versions, so the lockfile
|
|
advances without installing anything. `--bump` never modifies config files:
|
|
exact versions resolve to themselves and stay unchanged (use
|
|
`mise upgrade --bump` to rewrite pins in mise.toml). If the remote versions
|
|
cannot be fetched, it fails rather than keep the locked version.
|
|
"""#
|
|
}
|
|
flag --json help="Output version changes as JSON" {
|
|
long_help #"""
|
|
Output version changes as JSON
|
|
|
|
Prints an array of objects describing lockfile version changes:
|
|
name, backend, lockfile, old_versions, new_versions.
|
|
Version lists keep config/lockfile order; they are not sorted.
|
|
Only version-level changes are reported: checksum and URL refreshes for
|
|
unchanged versions produce no entries, so `mise lock --json` prints `[]`
|
|
when no version changed, even though it still updates the lockfile.
|
|
Suppresses the human-readable output. Combine with `--dry-run` to
|
|
detect available updates without writing the lockfile.
|
|
"""#
|
|
}
|
|
flag --local help="Update mise.local.lock, for tools in mise.local.toml, instead of mise.lock"
|
|
flag --minimum-release-age help="Only lock versions released before a date or at least a duration ago" {
|
|
alias "--before" hide=#true
|
|
long_help #"""
|
|
Only lock versions released before a date or at least a duration ago
|
|
|
|
Takes a date such as `2024-06-01` or a duration such as `90d` or `1y`.
|
|
Overrides the `minimum_release_age` setting and tool option. It filters only
|
|
requests that are not exact, such as "24" or "latest"; exact versions such
|
|
as "24.11.0" are not filtered. Existing matching lockfile entries are kept;
|
|
this flag alone does not downgrade them.
|
|
"""#
|
|
arg <AGE>
|
|
}
|
|
flag --upgrade help="Upgrade lockfiles to the latest format" {
|
|
long_help #"""
|
|
Upgrade lockfiles to the latest format
|
|
|
|
mise keeps an existing lockfile at its format version during normal updates,
|
|
so collaborators on an older mise can still read it. This flag rewrites it in
|
|
the newest format, which adds request bindings, dependency-graph sidecars,
|
|
and packslip repository IDs. It processes every configured tool and cannot be
|
|
combined with tool arguments. See
|
|
https://mise.jdx.dev/dev-tools/mise-lock-reference.html#format-versions.
|
|
"""#
|
|
}
|
|
flag --sidecars help="List native dependency sidecars instead of updating lockfiles" {
|
|
long_help #"""
|
|
List native dependency sidecars instead of updating lockfiles
|
|
|
|
Backends such as npm and pypi keep a tool's locked dependency graph in a
|
|
sidecar directory next to mise.lock; see
|
|
https://mise.jdx.dev/dev-tools/mise-lock-reference.html#native-dependency-sidecars.
|
|
For each existing lockfile in scope, prints the sidecar directory mise keeps
|
|
its dependency graphs in and every sidecar directory the lockfile references.
|
|
Nothing is resolved, installed, or written.
|
|
Paths are relative to the current directory when they are inside it,
|
|
and absolute otherwise, such as the sidecars of a symlinked lockfile.
|
|
Combine with `--json` for machine-readable output, or with `--local`
|
|
and `--global` to choose the lockfiles.
|
|
"""#
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TOOL]…" help="Tools to lock, such as `node python`; defaults to every configured tool and every tool a task needs" help_long=#"""
|
|
Tools to lock, such as `node python`; defaults to every configured tool and every tool a task needs
|
|
|
|
Use `tool@version` to lock an exact version. If it falls outside the configured
|
|
request, mise.toml is updated to match.
|
|
"""# required=#false var=#true
|
|
example "mise lock" help="Create or refresh the project lockfile"
|
|
example "mise lock node python" help="Refresh only node and python"
|
|
example "mise lock node@24.11.0" help="Lock an exact version; mise.toml keeps a request such as \"24\""
|
|
example "mise lock --platform linux-x64" help="Lock only the linux-x64 platform"
|
|
example "mise lock --dry-run" help="Show what would change"
|
|
example "mise lock --bump" help="Re-resolve requests such as \"latest\" or \"24\" to the latest matching versions"
|
|
example "mise lock --bump --dry-run --json" help="List available updates as JSON without writing"
|
|
example "mise lock --minimum-release-age 2024-01-01" help="Lock versions released before 2024-01-01 for requests that are not exact"
|
|
example "mise lock --local" help="Update mise.local.lock"
|
|
example "mise lock --global" help="Update only the global lockfiles"
|
|
}
|
|
cmd ls help="List installed and active tool versions" effect=read {
|
|
alias list
|
|
long_help #"""
|
|
List installed and active tool versions
|
|
|
|
Lists the tools mise knows about: versions that are installed, and versions
|
|
requested by a config file (active) whether or not they are installed. Each row
|
|
shows the tool, the version (marked `(missing)` when it is not installed), the
|
|
config file that requests it, and the request as written.
|
|
"""#
|
|
after_long_help "\u{1b}[1m\u{1b}[4mDeprecation:\u{1b}[22m\u{1b}[24m\n\nThe `-l` and `--local` flags are deprecated in favor of `--no-global`. mise warns about\nthem from 2027.1.0 and removes them in 2027.7.0."
|
|
flag --truncate help="Truncate long terminal output to fit the available width" negate=--no-truncate default="true"
|
|
flag "-b --backend" help="Only show tools from this backend, such as aqua, cargo, core, or go" var=#true {
|
|
long_help #"""
|
|
Only show tools from this backend, such as aqua, cargo, core, or go
|
|
|
|
Registry shorthands count as the backend they resolve to, so `jq` is listed
|
|
under aqua. Repeat the flag to show several backends.
|
|
"""#
|
|
arg <BACKEND>
|
|
}
|
|
flag "-c --current" help="Only show versions the loaded config files request"
|
|
flag "-g --global" help="Only show versions the global config requests" {
|
|
conflicts "--local" "--no-global" "--project"
|
|
}
|
|
flag "-i --installed" help="Only show installed versions" {
|
|
long_help #"""
|
|
Only show installed versions
|
|
|
|
Hides requested versions that are not installed.
|
|
"""#
|
|
}
|
|
flag --grouped help="List tools in a separate section for each backend" conflicts=--json {
|
|
long_help #"""
|
|
List tools in a separate section for each backend
|
|
|
|
Cannot be combined with --json; use --backend to filter JSON output.
|
|
"""#
|
|
}
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag "-l --local" help="Deprecated alias for --no-global" {
|
|
long_help #"""
|
|
Deprecated alias for --no-global
|
|
|
|
Removed in mise 2027.7.0.
|
|
"""#
|
|
conflicts "--global" "--no-global" "--project"
|
|
}
|
|
flag --no-global help="Only show versions that non-global config files request" {
|
|
long_help #"""
|
|
Only show versions that non-global config files request
|
|
|
|
Includes config files in parent directories and skips the global config, system config, and `MISE_<TOOL>_VERSION` environment variables. See --project for the nearest project's config alone.
|
|
"""#
|
|
conflicts "--global" "--local" "--project"
|
|
}
|
|
flag --project help="Only show versions the nearest project config requests" {
|
|
long_help #"""
|
|
Only show versions the nearest project config requests
|
|
|
|
The project is the nearest directory, starting at the current one and moving up, that has a mise config file. Every config file in that directory counts, such as `mise.toml`, `mise.local.toml`, `conf.d` fragments, `.tool-versions` and idiomatic version files. Configs in parent directories and global or system configs do not, nor do `MISE_<TOOL>_VERSION` environment variables. A version that a later file in that directory overrides is not listed, as with --no-global; `mise uninstall --project` still removes it.
|
|
"""#
|
|
conflicts "--global" "--local" "--no-global" "--monorepo" "--prunable"
|
|
}
|
|
flag "-m --missing" help="Only show requested versions that are not installed" conflicts=--installed
|
|
flag "-o --offline" help="Don't fetch information such as outdated versions" hide=#true
|
|
flag "-p --plugin" hide=#true {
|
|
arg <PLUGIN>
|
|
}
|
|
flag --all-sources help="Show requests from every config file mise has seen, not only loaded ones" {
|
|
long_help #"""
|
|
Show requests from every config file mise has seen, not only loaded ones
|
|
|
|
mise tracks the config files it loads so `mise prune` keeps the versions they use.
|
|
"""#
|
|
conflicts "--current" "--global" "--local" "--no-global" "--project" "--prunable"
|
|
}
|
|
flag --monorepo help="Also list tools from every config root in `[monorepo].config_roots`" env=MISE_MONOREPO {
|
|
long_help #"""
|
|
Also list tools from every config root in `[monorepo].config_roots`
|
|
|
|
Requires `monorepo_root = true` and an explicit `config_roots` list in the
|
|
monorepo root's config. Uses the active MISE_ENV.
|
|
"""#
|
|
conflicts "--all-sources" "--prunable"
|
|
}
|
|
flag --no-header help="Do not print the header row" conflicts=--json {
|
|
alias "--no-headers" hide=#true
|
|
}
|
|
flag --outdated help="Show whether each version is outdated"
|
|
flag --prefix help="Only show versions starting with PREFIX (requires a tool argument)" requires=INSTALLED_TOOL {
|
|
arg <PREFIX>
|
|
}
|
|
flag --prunable help="List only tools that can be pruned with `mise prune`"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[INSTALLED_TOOL]…" help="Only show these tools" required=#false var=#true conflicts=--plugin
|
|
example "mise ls" help="Show installed versions and the requests from the loaded config files"
|
|
example "mise ls --current" help="Show only versions the loaded config files request"
|
|
example "mise ls --missing" help="Find requested versions that are not installed"
|
|
example "mise ls --json" help="Machine-readable output: an object keyed by tool name"
|
|
example "mise ls node --json" help="With a tool argument, JSON output is an array of its version records"
|
|
example "mise ls --all-sources" help="Include requests from every config file mise has seen"
|
|
example "mise ls --backend go --backend cargo" help="Show only tools from the go or cargo backends"
|
|
example "mise ls --grouped" help="List tools in a separate section for each backend"
|
|
}
|
|
cmd ls-remote help="List tool versions available to install" effect=read {
|
|
alias list-all list-remote
|
|
long_help #"""
|
|
List tool versions available to install
|
|
|
|
Results may be cached; run `mise cache clear TOOL` to refresh one tool
|
|
before querying it again. Version formats and ordering are backend-specific.
|
|
"""#
|
|
flag --all help="List available versions for every tool mise currently knows about" {
|
|
conflicts TOOL@VERSION PREFIX
|
|
}
|
|
flag --minimum-release-age help="Only show versions released before a date or at least a duration ago" {
|
|
alias "--before" hide=#true
|
|
long_help #"""
|
|
Only show versions released before a date or at least a duration ago
|
|
|
|
Takes a date such as `2024-06-01` or a duration such as `90d` or `1y`.
|
|
Overrides the `minimum_release_age` setting and tool option.
|
|
"""#
|
|
arg <AGE>
|
|
}
|
|
flag "-J --json" help="Output in JSON format, with metadata such as `created_at` when available"
|
|
flag --no-versions-host help="Fetch versions from the tool's upstream instead of mise's version mirror" {
|
|
long_help #"""
|
|
Fetch versions from the tool's upstream instead of mise's version mirror
|
|
|
|
Same as `use_versions_host = false` for this command.
|
|
"""#
|
|
}
|
|
flag --prerelease help="Include prerelease versions" {
|
|
long_help #"""
|
|
Include prerelease versions
|
|
|
|
Works for backends that report prerelease metadata or detect prereleases by
|
|
pattern. Same as MISE_PRERELEASES=1 or the `prereleases` setting, for this
|
|
command only.
|
|
"""#
|
|
}
|
|
flag --strict-metadata help="Exit with an error when release metadata cannot be fetched" {
|
|
long_help #"""
|
|
Exit with an error when release metadata cannot be fetched
|
|
|
|
Without it, backends such as aqua and ruby fall back to a version list
|
|
without release dates, or an empty one. Requires --json and
|
|
--no-versions-host.
|
|
"""#
|
|
requires "--json" "--no-versions-host"
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TOOL@VERSION]" help="Tool to get versions for" required=#false required_unless=--all
|
|
arg "[PREFIX]" help="Version prefix to filter by; same as `TOOL@PREFIX`" required=#false
|
|
example "mise ls-remote node" help="List every node version"
|
|
example "mise ls-remote node@24" help="List node 24.x versions"
|
|
example "mise ls-remote node --minimum-release-age 30d" help="Skip versions released in the last 30 days"
|
|
example "mise ls-remote github:cli/cli --json" help="Include release dates, as JSON"
|
|
}
|
|
cmd lsp help="Run the language server for mise config files over stdin/stdout" effect=read {
|
|
long_help #"""
|
|
Run the language server for mise config files over stdin/stdout
|
|
|
|
Editors start this command and exchange Language Server Protocol messages with it.
|
|
|
|
It serves `mise.toml` and the other config files mise loads (`.mise.toml`, `mise.<env>.toml`, `mise.local.toml`, `mise/config.toml`, and the files of a `conf.d`). It ignores every other file, including files that `[task_config] includes` lists, so it can be attached to the TOML language without touching `Cargo.toml` or `pyproject.toml`.
|
|
|
|
It offers:
|
|
- diagnostics: TOML syntax errors, unknown keys with a suggestion, values of the wrong type, deprecated keys, task names no task defines (`unknown-task`), and dependency cycles (`task-cycle`)
|
|
- completion of keys, including inside inline tables, and of values that have a fixed set
|
|
- hover documentation for keys
|
|
- for tools: completion of tool names under `[tools]` from the registry, and hover with the tool's description and backends
|
|
- quick fixes that replace an unknown key or task name with the suggested one, and rewrite a deprecated key to its replacement when the schema names one
|
|
- formatting, as `mise fmt` does
|
|
- semantic tokens, which color task, tool and env var names, env directives, deprecated keys and the `{{ }}` and `{% %}` of templates
|
|
- for tasks: completion of task names in `depends`, `depends_post`, `wait_for` and `run = [{ task = "..." }]` (and of templates in `extends`), hover with the task's description and command, go to definition, find references, and rename together with every reference in the file
|
|
|
|
Tasks come from the open file, the configs in the directories above it and the TOML files their `[task_config] includes` name.
|
|
|
|
A client that runs another TOML server beside this one can switch features off with `initializationOptions`: `{"formatting": false, "hover": false, "completion": false, "definition": false, "references": false, "rename": false, "semanticTokens": false}`.
|
|
|
|
The server only parses a config. It never renders templates or runs anything, so opening an untrusted file is safe.
|
|
|
|
A mise that predates this command runs a task named `lsp` instead, so a client that needs to know whether the command exists can check that `mise help lsp` prints `Usage: mise lsp`.
|
|
|
|
See https://mise.jdx.dev/ide-integration.html for editor configuration.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise lsp" help="Start the server; an editor's LSP configuration runs this command"
|
|
}
|
|
cmd mcp help="Run the Model Context Protocol server over stdin/stdout" {
|
|
long_help #"""
|
|
Run the Model Context Protocol server over stdin/stdout
|
|
|
|
Exposes project tools, tasks, environment, and configuration to an MCP client.
|
|
The client, such as an AI coding assistant, starts this command and exchanges
|
|
messages with it. Start it in the project directory or pass `--cd`: the
|
|
resources describe that project.
|
|
|
|
Resources (JSON):
|
|
- mise://tools: active tool versions (?include_inactive=true adds the rest)
|
|
- mise://tasks: task definitions, including monorepo subproject tasks
|
|
- mise://env: environment variables
|
|
- mise://config: loaded config files and the project root
|
|
|
|
Environment resources contain real values, including secrets.
|
|
|
|
Tools:
|
|
- list_commands: every mise command and its declared effect
|
|
- run_task: run a task with your permissions; it can change files and call
|
|
external services
|
|
- install_tool: install a tool version, as `mise install` does
|
|
|
|
run_task and install_tool refuse a project whose config files are not
|
|
trusted; run `mise trust` there after reviewing them.
|
|
|
|
See https://mise.jdx.dev/mcp.html for client configuration and access controls.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise --cd /path/to/project mcp" help="Serve a project from another directory, as an MCP client config does"
|
|
}
|
|
cmd oci subcommand_required=#true help="[experimental] Build, push, and run OCI images of a project's tools" effect=read {
|
|
long_help #"""
|
|
[experimental] Build, push, and run OCI images of a project's tools
|
|
|
|
Each tool version becomes its own image layer, so changing one tool version
|
|
rebuilds that tool's layer instead of the whole image.
|
|
|
|
Requires `mise settings experimental=true` (or `MISE_EXPERIMENTAL=1`).
|
|
Behavior, flags, and output layout may change in future releases.
|
|
See https://mise.jdx.dev/dev-tools/mise-oci.html
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd build help="[experimental] Build an OCI image from the current mise.toml" effect=write {
|
|
long_help #"""
|
|
[experimental] Build an OCI image from the current mise.toml
|
|
|
|
Each tool version becomes its own content-addressable OCI layer. Bumping a
|
|
tool version invalidates that tool's layer (a Python bump also invalidates
|
|
pypi tool layers, which are relocated against it); other tool layers and the
|
|
base image layers are reused, while the generated /etc/mise/config.toml
|
|
layer, image config, and manifest are regenerated. The output directory
|
|
follows the OCI image-layout spec.
|
|
|
|
Only tools from project config files are packaged, including a monorepo
|
|
root's config. The global and system configs and a config directly in your
|
|
home directory, such as ~/mise.toml, are left out unless you pass
|
|
`--include-global`.
|
|
|
|
Build on a Linux host with the image's architecture. Tools are packaged as
|
|
installed on the host, and so is the running mise binary, at
|
|
/usr/local/bin/mise, unless you pass `--no-mise`. asdf plugins are not
|
|
supported; use a vfox plugin or any other backend for each tool. vfox
|
|
plugins are copied into the image next to the tools they install.
|
|
|
|
Requires `mise settings experimental=true` (or `MISE_EXPERIMENTAL=1`).
|
|
"""#
|
|
flag --copy help="Copy a host file, directory, or symlink into the image (repeatable, HOST:IMAGE)" var=#true {
|
|
arg <HOST_PATH:IMAGE_PATH>
|
|
}
|
|
flag "-o --output" help="Output directory for the OCI image layout" default="./mise-oci" {
|
|
arg <OUTPUT>
|
|
}
|
|
flag --from help="Base image reference (overrides [oci].from and the oci.default_from setting)" {
|
|
arg <FROM>
|
|
}
|
|
flag --include-global help="Also package tools from the global and system configs" {
|
|
long_help #"""
|
|
Also package tools from the global and system configs
|
|
|
|
By default `mise oci build` packages only project config files, including a monorepo root's config. With this flag it also includes the tools, `[oci]`, `[bootstrap.packages]`, and `[dotfiles]` of the global and system configs and of a config directly in your home directory, so personal tools from ~/.config/mise/config.toml end up in the image.
|
|
"""#
|
|
}
|
|
flag "-t --tag" help="Tag to record in the image index (the org.opencontainers.image.ref.name annotation)" {
|
|
arg <TAG>
|
|
}
|
|
flag --mount-point help="Where tools install inside the image" {
|
|
long_help #"""
|
|
Where tools install inside the image
|
|
|
|
Overrides [oci].mount_point and the oci.default_mount_point setting.
|
|
"""#
|
|
arg <MOUNT_POINT>
|
|
}
|
|
flag --no-mise help="Do not embed the currently-running mise binary at /usr/local/bin/mise"
|
|
flag --no-cache help="Rebuild tool layers without reading or writing the local layer cache"
|
|
flag --owner help="UID[:GID] to assign to every tar entry in generated layers" {
|
|
long_help #"""
|
|
UID[:GID] to assign to every tar entry in generated layers
|
|
|
|
Overrides [oci].user_id and [oci].group_id. Defaults to 0:0. If GID is omitted, it defaults to UID. This affects file ownership only; [oci].user controls the image USER directive.
|
|
"""#
|
|
arg "<UID[:GID]>"
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise oci build" help="Build the project's image into ./mise-oci"
|
|
example "mise oci build --from ubuntu:24.04 --tag myorg/dev:latest -o ./img" help="Use another base image and record a tag"
|
|
example "skopeo inspect oci:./img" help="Inspect the result"
|
|
example "mise oci run --image-dir ./img -- /bin/sh" help="Open a shell in it"
|
|
complete output type=dir
|
|
}
|
|
cmd push help="[experimental] Build an OCI image and push it to a registry" effect=write {
|
|
long_help #"""
|
|
[experimental] Build an OCI image and push it to a registry
|
|
|
|
Builds from the project's config, as `mise oci build` does, unless
|
|
`--image-dir` names an image layout built earlier. Then uploads only the
|
|
blobs the registry does not already have. mise pushes with its own registry
|
|
client, so skopeo, crane, and docker are not needed.
|
|
|
|
Tool layers whose tool, version, mount point, and file owner match the
|
|
previously pushed image (or `--cache-from`) are reused without being
|
|
rebuilt, so those tools need not be installed locally. Pass `--no-cache` to
|
|
rebuild every tool layer.
|
|
|
|
Credentials come from the files docker and podman use: `$REGISTRY_AUTH_FILE`,
|
|
`$XDG_RUNTIME_DIR/containers/auth.json`, `~/.config/containers/auth.json`,
|
|
then `~/.docker/config.json`, including inline auths and credential helpers.
|
|
Log in with `docker login` or `podman login`.
|
|
|
|
Requires `mise settings experimental=true` (or `MISE_EXPERIMENTAL=1`).
|
|
"""#
|
|
flag --cache-from help="Reuse unchanged tool layers from this image instead of the destination's current tag" {
|
|
long_help #"""
|
|
Reuse unchanged tool layers from this image instead of the destination's current tag
|
|
|
|
Must be in the same repository as the destination. Useful when every push gets a new tag, as with per-commit tags in CI: `mise oci push --cache-from ghcr.io/me/dev:latest ghcr.io/me/dev:$SHA`. Cannot be combined with --no-cache.
|
|
"""#
|
|
conflicts "--no-cache" "--image-dir"
|
|
arg <REF>
|
|
}
|
|
flag --from help="Base image for the build" {
|
|
long_help #"""
|
|
Base image for the build
|
|
|
|
Overrides [oci].from and the oci.default_from setting.
|
|
"""#
|
|
arg <FROM>
|
|
}
|
|
flag --image-dir help="Push an existing OCI image layout instead of building one" {
|
|
long_help #"""
|
|
Push an existing OCI image layout instead of building one
|
|
|
|
Cannot be combined with --cache-from, --from, --include-global, --mount-point, --no-mise, or --owner.
|
|
"""#
|
|
conflicts "--from" "--mount-point" "--no-mise" "--owner" "--include-global"
|
|
arg <IMAGE_DIR>
|
|
}
|
|
flag --include-global help="Also package tools from the global and system configs" {
|
|
long_help #"""
|
|
Also package tools from the global and system configs
|
|
|
|
See `mise oci build --help` for details.
|
|
"""#
|
|
}
|
|
flag --mount-point help="Where tools install inside the image" {
|
|
long_help #"""
|
|
Where tools install inside the image
|
|
|
|
Overrides [oci].mount_point and the oci.default_mount_point setting.
|
|
"""#
|
|
arg <MOUNT_POINT>
|
|
}
|
|
flag --no-cache help="Rebuild tool layers without using the remote or local layer cache"
|
|
flag --no-mise help="Do not embed the running mise binary at /usr/local/bin/mise"
|
|
flag --owner help="UID[:GID] to assign to every tar entry when building" {
|
|
long_help #"""
|
|
UID[:GID] to assign to every tar entry when building
|
|
|
|
Overrides [oci].user_id and [oci].group_id. Defaults to 0:0. If GID is omitted, it defaults to UID. This affects file ownership only; [oci].user controls the image USER directive.
|
|
"""#
|
|
arg "<UID[:GID]>"
|
|
}
|
|
flag --update-index help="Maintain the tag as a multi-arch image index" {
|
|
long_help #"""
|
|
Maintain the tag as a multi-arch image index
|
|
|
|
Pushes this build's manifest by digest and points the tag at an OCI image index containing one entry per platform, preserving entries other architectures pushed. Run `mise oci push --update-index` from one runner per platform to assemble a multi-arch tag.
|
|
"""#
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <REF> help="Destination registry reference (e.g. `ghcr.io/me/devenv:latest`)"
|
|
example "mise oci push ghcr.io/me/devenv:latest" help="Build and push to GHCR"
|
|
example #"""
|
|
mise oci build -o ./img
|
|
mise oci push --image-dir ./img ghcr.io/me/devenv:v1
|
|
"""# help="Push an image built earlier"
|
|
complete image_dir type=dir
|
|
}
|
|
cmd run help="[experimental] Build the project's image and run a command in it" {
|
|
long_help #"""
|
|
[experimental] Build the project's image and run a command in it
|
|
|
|
Builds the image as `mise oci build` does, unless `--image-dir` names an
|
|
existing layout, then loads it into podman or docker and runs the command in
|
|
a container with stdin, stdout, and stderr attached. podman reads the OCI
|
|
layout directly; docker receives it through `docker load`.
|
|
|
|
Requires `mise settings experimental=true` (or `MISE_EXPERIMENTAL=1`) and
|
|
podman or docker.
|
|
"""#
|
|
flag --engine help="Container engine to use; `auto` prefers podman and falls back to docker" default=auto {
|
|
arg <ENGINE> {
|
|
choices {
|
|
choice auto
|
|
choice podman
|
|
choice docker
|
|
}
|
|
}
|
|
}
|
|
flag --from help="Base image for the build" {
|
|
long_help #"""
|
|
Base image for the build
|
|
|
|
Overrides [oci].from and the oci.default_from setting.
|
|
"""#
|
|
arg <FROM>
|
|
}
|
|
flag --image-dir help="Use an existing OCI image layout instead of building one" {
|
|
long_help #"""
|
|
Use an existing OCI image layout instead of building one
|
|
|
|
Cannot be combined with --from, --include-global, --mount-point, --no-mise, or --owner.
|
|
"""#
|
|
conflicts "--from" "--mount-point" "--no-mise" "--owner" "--include-global"
|
|
arg <IMAGE_DIR>
|
|
}
|
|
flag --include-global help="Also package tools from the global and system configs" {
|
|
long_help #"""
|
|
Also package tools from the global and system configs
|
|
|
|
See `mise oci build --help` for details.
|
|
"""#
|
|
}
|
|
flag --keep help="Keep the loaded image in the engine's storage after the run" {
|
|
long_help #"""
|
|
Keep the loaded image in the engine's storage after the run
|
|
|
|
By default, both the container (`--rm`) and the loaded image are removed when the command exits, so repeated `mise oci run` calls do not fill podman or docker storage. With `--keep`, the image stays under the tag mise used (`mise-oci:run-*` for docker, the pulled image ID for podman).
|
|
"""#
|
|
}
|
|
flag --mount-point help="Where tools install inside the image" {
|
|
long_help #"""
|
|
Where tools install inside the image
|
|
|
|
Overrides [oci].mount_point and the oci.default_mount_point setting.
|
|
"""#
|
|
arg <MOUNT_POINT>
|
|
}
|
|
flag --no-mise help="Do not embed the running mise binary at /usr/local/bin/mise"
|
|
flag --owner help="UID[:GID] to assign to every tar entry when building" {
|
|
long_help #"""
|
|
UID[:GID] to assign to every tar entry when building
|
|
|
|
Overrides [oci].user_id and [oci].group_id. Defaults to 0:0. If GID is omitted, it defaults to UID. This affects file ownership only; [oci].user controls the image USER directive.
|
|
"""#
|
|
arg "<UID[:GID]>"
|
|
}
|
|
flag --volume help="Bind-mount a host path (repeatable, `HOST:CONTAINER[:MODE]`)" var=#true {
|
|
alias "--mount" hide=#true
|
|
long_help #"""
|
|
Bind-mount a host path (repeatable, `HOST:CONTAINER[:MODE]`)
|
|
|
|
Unlike `docker run`, there is no `-v` short form because mise uses `-v` for --verbose. Use `--volume` or `--mount`.
|
|
"""#
|
|
arg <HOST:CONTAINER>
|
|
}
|
|
flag "-e --env" help="Set environment variable in the container (repeatable, `KEY=VAL`)" var=#true {
|
|
arg "<KEY=VAL>"
|
|
}
|
|
flag "-i --interactive" help="Run interactively (pass `-i` to the engine)"
|
|
flag "-t --tty" help="Allocate a TTY (pass `-t` to the engine)"
|
|
flag "-w --workdir" help="Working directory inside the container" {
|
|
arg <WORKDIR>
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[-- CMD]…" help="Command and arguments to run inside the container (after `--`)" required=#false var=#true
|
|
example "mise oci run -it -- bash" help="Build the project's image and open bash in it"
|
|
example "mise oci run -e DEBUG=1 --volume \"$PWD:/work\" -w /work -- npm test" help="Run a one-shot command with an environment variable and a mounted directory"
|
|
example "mise oci build -o ./img && mise oci run --image-dir ./img -- node -e 'console.log(process.version)'" help="Reuse a layout built earlier instead of building again"
|
|
complete image_dir type=dir
|
|
}
|
|
}
|
|
cmd packslip help="Inspect and reset the signers mise has pinned for packslip tools" effect=read {
|
|
long_help #"""
|
|
Inspect and reset the signers mise has pinned for packslip tools
|
|
|
|
mise verifies a tool installed with the `packslip:` backend against the
|
|
identity its project name implies, then remembers the signer it accepted,
|
|
the way SSH remembers host keys. A later release from another signer, a
|
|
weaker signing scheme, a repackager where the vendor signed before, or one
|
|
that drops build provenance is refused. After you confirm the change with
|
|
the publisher, run `mise packslip forget <PROJECT>`, and update mise.lock if
|
|
it records the old signer.
|
|
|
|
With no subcommand, lists the pins (same as `mise packslip pins`).
|
|
See https://mise.jdx.dev/dev-tools/backends/packslip.html#pinned-signers
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd forget help="Forget a project's pinned signer so the next accepted release sets it" effect=write {
|
|
long_help #"""
|
|
Forget a project's pinned signer so the next accepted release sets it
|
|
|
|
Do this after the vendor announces a new signing identity or key. Name the
|
|
project as in its tool identifier: `github.com/owner/repo`, `owner/repo`, or
|
|
a domain such as `tool.example.com`, with or without `packslip:`. This also
|
|
resets the project's remembered release-list state.
|
|
|
|
It does not change `mise.lock`. If the lockfile records the old signer,
|
|
delete the tool's entries and run `mise lock`.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <PROJECT> help="The project whose pin to drop"
|
|
example "mise packslip forget github.com/jdx/hk" help="Accept whichever signer the next hk release uses"
|
|
}
|
|
cmd pins help="List the signer mise has pinned for each packslip project" effect=read {
|
|
alias list
|
|
long_help #"""
|
|
List the signer mise has pinned for each packslip project
|
|
|
|
Each row is a project and the signer mise pinned the first time it accepted
|
|
a release: the signing scheme, the signer identity, whether the vendor or a
|
|
repackager attested it, and whether build provenance links were present. A
|
|
later release that does not match is refused.
|
|
"""#
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example #"""
|
|
mise packslip pins
|
|
Project Scheme Signer Attested by Provenance
|
|
github.com/jdx/hk sigstore-oidc https://github.com/jdx/hk/.github/workflows/release.yml vendor yes
|
|
"""# help="List every pinned signer"
|
|
example "mise packslip pins --json" help="Include the issuer, pin time, and forge repository ID"
|
|
}
|
|
}
|
|
cmd outdated help="Show outdated tool versions" effect=read {
|
|
long_help #"""
|
|
Show outdated tool versions
|
|
|
|
Lists tools whose installed version is older than the newest version their
|
|
config request allows. For `node = "20"`, that is the newest 20.x release;
|
|
pass `--bump` to compare against the newest release overall instead. Run
|
|
`mise upgrade` to install the newer versions.
|
|
"""#
|
|
after_long_help "\u{1b}[1m\u{1b}[4mDeprecation:\u{1b}[22m\u{1b}[24m\n\nThe `-l` shorthand for `--bump` is deprecated and will be removed in mise 2027.8.5.\nUse `-b` or `--bump` instead.\n\nThe `--local` flag is deprecated in favor of `--no-global`. mise warns about it from\n2027.1.0 and removes it in 2027.7.0."
|
|
flag "-b --bump" help="Compare against the newest release overall, not only the configured range" {
|
|
long_help #"""
|
|
Compare against the newest release overall, not only the configured range
|
|
|
|
With `node = "20"` in your config, `mise outdated` reports the newest 20.x release. With this flag the `latest` column shows the newest release overall, such as 24.1.0, and a `bump` column shows the request `mise upgrade --bump` would write, such as `24`.
|
|
"""#
|
|
}
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag -l help="Deprecated shorthand for --bump" hide=#true
|
|
flag --inactive help="Also check installed tools that the current config does not request" {
|
|
long_help #"""
|
|
Also check installed tools that the current config does not request
|
|
|
|
By default, `mise outdated` checks only tools that come from the current config.
|
|
"""#
|
|
conflicts "--local" "--no-global"
|
|
}
|
|
flag --global help="Only check tools defined in the global config" {
|
|
long_help #"""
|
|
Only check tools defined in the global config
|
|
|
|
Reports the requests in the global and system config (~/.config/mise/config.toml, /etc/mise/config.toml), even where a project config or a `MISE_<TOOL>_VERSION` environment variable sets its own version of the tool: what `mise upgrade --global` would install.
|
|
"""#
|
|
conflicts "--local" "--no-global" "--inactive"
|
|
}
|
|
flag --local help="Deprecated alias for --no-global" {
|
|
long_help #"""
|
|
Deprecated alias for --no-global
|
|
|
|
Removed in mise 2027.7.0.
|
|
"""#
|
|
conflicts "--global" "--no-global"
|
|
}
|
|
flag --no-global help="Only check tools defined in project config files" {
|
|
long_help #"""
|
|
Only check tools defined in project config files
|
|
|
|
Skips tools defined in the global config (~/.config/mise/config.toml) and tools set through `MISE_<TOOL>_VERSION` environment variables.
|
|
"""#
|
|
conflicts "--global" "--local"
|
|
}
|
|
flag --monorepo help="Placeholder for future monorepo outdated checks; `mise outdated --monorepo` is not implemented yet." hide=#true
|
|
flag --no-header help="Do not print the table header"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TOOL@VERSION]…" help="Tools to check, such as `node@20 python@3.10`" help_long=#"""
|
|
Tools to check, such as `node@20 python@3.10`
|
|
|
|
Checks every tool in the global and project configs when omitted.
|
|
"""# required=#false var=#true
|
|
example #"""
|
|
mise outdated
|
|
name requested current latest source
|
|
node 20 20.0.0 20.1.0 ~/src/app/mise.toml
|
|
python 3.11 3.11.0 3.11.1 ~/src/app/mise.toml
|
|
"""# help="Show tools with a newer version inside their configured range"
|
|
example #"""
|
|
mise outdated --bump
|
|
name requested current bump latest source
|
|
node 20 20.0.0 24 24.1.0 ~/src/app/mise.toml
|
|
"""# help="Compare against the newest release overall and show the request for it"
|
|
example #"""
|
|
mise outdated --json
|
|
{
|
|
"node": {
|
|
"name": "node",
|
|
"requested": "20",
|
|
"current": "20.0.0",
|
|
"bump": null,
|
|
"latest": "20.1.0",
|
|
"source": {
|
|
"type": "mise.toml",
|
|
"path": "/home/me/src/app/mise.toml"
|
|
}
|
|
}
|
|
}
|
|
"""# help="Print the same information as JSON"
|
|
example "mise outdated --no-global" help="Skip tools that only the global config requests"
|
|
example "mise outdated --global claude --json" help="Check the global config's request for claude, even inside a project that sets its own"
|
|
}
|
|
cmd patrons help="Show the individuals supporting mise as Patron-tier members" effect=read {
|
|
long_help #"""
|
|
Show the individuals supporting mise as Patron-tier members
|
|
|
|
Fetches the list from https://jdx.dev/patrons.json and caches it for a day;
|
|
pass `--refresh` to fetch it now. If the fetch fails, the cached list is used.
|
|
Terminals that support OSC 8 hyperlinks show each name as a link.
|
|
|
|
To appear here, become a patron at https://jdx.dev/sponsors.html.
|
|
"""#
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --refresh help="Fetch the list now instead of using the cached copy"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise patrons" help="List the patrons"
|
|
example "mise patrons --refresh -J" help="Fetch the list now and print it as JSON"
|
|
}
|
|
cmd plugins help="Manage plugins" effect=read {
|
|
alias p plugin plugin-list
|
|
long_help #"""
|
|
Manage plugins
|
|
|
|
Plugins add tools, backends, environment directives, or bootstrap package
|
|
managers to mise. Most tools need no plugin because most registry tools use
|
|
built-in backends, and mise installs a missing plugin when a configured tool
|
|
needs it.
|
|
|
|
With no subcommand, lists installed plugins (same as `mise plugins ls`; the
|
|
flags below are passed to it). See https://mise.jdx.dev/plugins.html
|
|
"""#
|
|
flag "-a --all" help="List all available remote plugins (same as `mise plugins ls-remote`)" hide=#true
|
|
flag "-c --core" help="List the core tools built into mise instead of installed plugins" conflicts=--all
|
|
flag "-u --urls" help="Show each plugin's Git URL, ref, and commit" {
|
|
alias "--url" hide=#true
|
|
}
|
|
flag --refs help="Show each plugin's Git ref and commit, such as `main 1234abc`" hide=#true
|
|
flag --user help="List installed plugins" conflicts=--all {
|
|
long_help #"""
|
|
List installed plugins
|
|
|
|
This is the default behavior but can be used with --core
|
|
to show core and user plugins
|
|
"""#
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd install help="Install plugins from a configured source, Git URL, or archive" effect=write {
|
|
alias i a add
|
|
long_help #"""
|
|
Install plugins from a configured source, Git URL, or archive
|
|
|
|
Most registry tools use built-in backends and need no plugin. When a tool's
|
|
backend requires a plugin, mise installs it with the tool. Use this command
|
|
to install one ahead of time or from a custom source.
|
|
|
|
Pass a name that the registry or a `[plugins]` entry knows, a name and a
|
|
URL, or only a URL. With only a URL, the plugin is named after the
|
|
repository without an `asdf-`, `mise-`, or `vfox-` prefix. Pass several names
|
|
to install several plugins. Prefix a name with `vfox:`, `vfox-backend:`,
|
|
`package:`, or `asdf:` to choose the plugin type.
|
|
|
|
A Git URL may end in `#ref` to select a plugin commit, tag, or branch. This
|
|
selects the plugin code, separately from the tool version `mise use` installs.
|
|
"""#
|
|
flag "-a --all" help="Install every plugin the current config needs that is not installed yet" {
|
|
long_help #"""
|
|
Install every plugin the current config needs that is not installed yet
|
|
|
|
Only plugins with a registry shorthand or a `[plugins]` entry can be installed this way.
|
|
"""#
|
|
conflicts NEW_PLUGIN "--force"
|
|
}
|
|
flag "-f --force" help="Reinstall even if the plugin is already installed"
|
|
flag "-j --jobs" help="Number of plugins to install in parallel (default: the `jobs` setting)" {
|
|
arg <JOBS>
|
|
}
|
|
flag "-v --verbose" help="Show installation output" var=#true count=#true
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[NEW_PLUGIN]" help="The plugin to install, or a URL to infer its name from" required=#false required_unless=--all
|
|
arg "[GIT_URL]" help="Where to install from: a Git URL (optionally ending in #ref) or an archive URL" required=#false
|
|
arg "[REST]…" required=#false var=#true hide=#true
|
|
example "mise plugins install my-tool https://github.com/your-org/mise-my-tool" help="Install a plugin from a Git repository"
|
|
example "mise plugins install my-tool 'https://github.com/your-org/mise-my-tool#v1.2.0'" help="Pin the plugin to a tag"
|
|
example "mise plugins install https://github.com/your-org/vfox-my-tool" help="Name the plugin after its repository (my-tool)"
|
|
example "mise plugins install my-tool file:///path/to/mise-my-tool#v1.0.0" help="Use a local plugin repository at a tag you created"
|
|
example "mise plugins install --all" help="Install the plugins that the current config needs"
|
|
complete git_url type=url
|
|
}
|
|
cmd link help="Link a local plugin directory into mise for development" effect=write {
|
|
alias ln
|
|
long_help #"""
|
|
Link a local plugin directory into mise for development
|
|
|
|
Edits in the source directory take effect without reinstalling the plugin.
|
|
Pass a name and a directory, or only a directory to name the plugin after it
|
|
without an `asdf-`, `mise-`, or `vfox-` prefix. Use the bare name, without a
|
|
`vfox:` or `package:` prefix: mise detects the plugin type from the
|
|
directory. This does not install a tool version.
|
|
"""#
|
|
flag "-f --force" help="Replace an existing plugin with the same name"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <NAME> help="The plugin name, or the plugin directory when DIR is omitted"
|
|
arg "[DIR]" help="The local path to the plugin, such as ./mise-my-tool" required=#false
|
|
example "mise plugins link my-tool ./mise-my-tool" help="Link ./mise-my-tool as the plugin my-tool"
|
|
example "mise plugins link ./mise-my-tool" help="Infer the name my-tool from the directory"
|
|
example "mise ls-remote my-tool" help="List versions through the linked plugin"
|
|
complete dir type=dir
|
|
}
|
|
cmd ls help="List installed plugins" effect=read {
|
|
alias list
|
|
long_help #"""
|
|
List installed plugins
|
|
|
|
Use `--core` to list the core tools built into mise instead, or
|
|
`--core --user` for both. `--outdated` checks each plugin's Git remote for
|
|
newer plugin code; it does not compare tool versions. Use `mise ls` for
|
|
installed tool versions and `mise registry` for tools you can install.
|
|
"""#
|
|
flag "-a --all" help="List all available remote plugins (same as `mise plugins ls-remote`)" hide=#true
|
|
flag "-c --core" help="List the core tools built into mise instead of installed plugins" conflicts=--all
|
|
flag "-o --outdated" help="Only show plugins whose Git remote has newer commits"
|
|
flag "-u --urls" help="Show each plugin's Git URL, ref, and commit" {
|
|
alias "--url" hide=#true
|
|
}
|
|
flag --refs help="Show each plugin's Git ref and commit, such as `main 1234abc`" hide=#true
|
|
flag --user help="List installed plugins" conflicts=--all {
|
|
long_help #"""
|
|
List installed plugins
|
|
|
|
This is the default behavior but can be used with --core
|
|
to show core and user plugins
|
|
"""#
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise plugins ls" help="List installed plugins"
|
|
example "mise plugins ls --urls" help="Show each plugin's Git URL, ref, and commit"
|
|
example "mise plugins ls --core --user" help="List core tools and installed plugins"
|
|
example "mise plugins ls --outdated" help="List plugins whose Git remote has newer commits"
|
|
}
|
|
cmd ls-remote help="List registry tools that have an asdf or vfox plugin backend" effect=read {
|
|
alias list-remote list-all
|
|
long_help #"""
|
|
List registry tools that have an asdf or vfox plugin backend
|
|
|
|
Each line is a registry shorthand that lists an asdf or vfox plugin among its
|
|
backends; mise may still install the tool through another backend first. `*`
|
|
marks plugins you have installed. Entries from the `shorthands_file` setting
|
|
are listed too. Use `mise registry` to list every registry tool and its
|
|
backends in order.
|
|
"""#
|
|
flag "-u --urls" help="Show the plugin source for each shorthand, e.g. vfox:jdx/vfox-poetry"
|
|
flag --only-names help="Only show the name of each plugin, without the `*` marking installed plugins"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise plugins ls-remote" help="List registry tools with a plugin backend"
|
|
}
|
|
cmd uninstall help="Remove an installed plugin" effect=destructive {
|
|
alias remove rm
|
|
long_help #"""
|
|
Remove an installed plugin
|
|
|
|
Installed tool versions are kept unless you pass `--purge`, which also
|
|
removes a tool plugin's installs, downloads, and cache. `--purge` does not
|
|
remove the tools of a backend plugin (`<plugin>:<tool>`); uninstall those
|
|
first with `mise uninstall --all <plugin>:<tool>`.
|
|
"""#
|
|
flag "-a --all" help="Remove all plugins" conflicts=PLUGIN
|
|
flag "-p --purge" help="Also remove a tool plugin's installs, downloads, and cache"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[PLUGIN]…" help="Plugins to remove" required=#false var=#true
|
|
example "mise plugins uninstall my-tool" help="Remove the plugin and keep the versions it installed"
|
|
example "mise plugins uninstall --purge my-tool" help="Also delete the versions it installed"
|
|
}
|
|
cmd update help="Update installed plugins" effect=write {
|
|
alias up upgrade
|
|
long_help #"""
|
|
Update installed plugins
|
|
|
|
With no names, updates every installed plugin. This updates the plugin code,
|
|
not the tool versions it manages. Linked local plugins are skipped; plugins
|
|
installed from an archive cannot be updated with Git.
|
|
"""#
|
|
flag "-j --jobs" help="Number of plugins to update in parallel (default: the `jobs` setting)" {
|
|
arg <JOBS>
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[PLUGIN]…" help="Plugins to update; append #ref to switch to a branch, tag, or commit" required=#false var=#true
|
|
example "mise plugins update" help="Update every installed plugin"
|
|
example "mise plugins update my-tool" help="Update one plugin"
|
|
example "mise plugins update my-tool#main" help="Switch a plugin to its main branch"
|
|
}
|
|
}
|
|
cmd deps help="[experimental] Manage project dependencies" effect=write {
|
|
alias dep prepare
|
|
long_help #"""
|
|
[experimental] Manage project dependencies
|
|
|
|
Installs project dependencies such as node_modules, separately from the tools
|
|
`mise install` manages. Each provider is one package-manager step: a built-in
|
|
one such as npm or uv, or a custom `[deps.<name>]` command. A provider runs only
|
|
when its inputs changed or its outputs are missing; `--explain` shows why.
|
|
|
|
With no subcommand, runs `mise deps install`. Providers with `auto = true` also
|
|
run before `mise exec` and `mise run` unless you pass --no-deps.
|
|
"""#
|
|
after_long_help "\u{1b}[1m\u{1b}[4mConfiguration:\u{1b}[22m\u{1b}[24m\n\n```toml\n# Built-in npm provider; needs package.json and package-lock.json\n[deps.npm]\nauto = true # run before mise exec and mise run\n\n# Custom provider\n[deps.codegen]\nauto = true\nsources = [\"schema/*.graphql\"]\noutputs = [\"src/generated/\"]\nrun = \"npm run codegen\"\n```\n\nSee https://mise.jdx.dev/dev-tools/deps.html."
|
|
flag --explain help="Show why a provider is fresh or stale, and exit non-zero unless it is fresh (requires a PROVIDER argument)"
|
|
flag "-f --force" help="Run providers even when their outputs are up to date"
|
|
flag "-n --dry-run" help="Show which providers would run, without running them"
|
|
flag --list help="List configured providers with their status, sources, and outputs"
|
|
flag --monorepo help="Also run providers from every config root in `[monorepo].config_roots`" env=MISE_MONOREPO {
|
|
long_help #"""
|
|
Also run providers from every config root in `[monorepo].config_roots`
|
|
|
|
Requires `monorepo_root = true` and an explicit `config_roots` list in the
|
|
monorepo root's config. Provider names then include their root, such as
|
|
`//apps/api:uv`.
|
|
"""#
|
|
}
|
|
flag --only help="Run only these providers" var=#true {
|
|
arg <PROVIDER>
|
|
}
|
|
flag --skip help="Skip these providers" var=#true {
|
|
arg <PROVIDER>
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[PROVIDER]" help="Run only this provider, or explain it with --explain" required=#false
|
|
cmd add help="Add packages to the project's dependencies" effect=write {
|
|
long_help #"""
|
|
Add packages to the project's dependencies
|
|
|
|
Runs the package manager's own add command, which updates the project's
|
|
manifest (for npm, package.json) and its lockfile, not mise.toml. To install a
|
|
CLI tool from npm for mise to manage, use `mise use npm:<package>` instead.
|
|
Name each package as `<ecosystem>:<package>`, such as `npm:react` or
|
|
`npm:@types/react@19`. See
|
|
https://mise.jdx.dev/dev-tools/deps.html#adding-and-removing-packages.
|
|
"""#
|
|
flag "-D --dev" help="Add as a development dependency"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <PACKAGES>… help="Packages to add, such as `npm:react` or `npm:@types/react@19`" var=#true
|
|
example "mise deps add npm:react" help="Add react to package.json"
|
|
example "mise deps add -D npm:vitest" help="Add vitest as a dev dependency"
|
|
}
|
|
cmd install help="Install project dependencies" effect=write {
|
|
long_help #"""
|
|
Install project dependencies
|
|
|
|
Runs each provider whose inputs changed or whose outputs are missing. Pass
|
|
PROVIDER to run only that one, --force to run regardless, or
|
|
`--explain PROVIDER` to see why it would or would not run. With --explain,
|
|
mise runs nothing and exits non-zero unless the provider is fresh.
|
|
"""#
|
|
flag --explain help="Show why a provider is fresh or stale, and exit non-zero unless it is fresh (requires a PROVIDER argument)"
|
|
flag "-f --force" help="Run providers even when their outputs are up to date"
|
|
flag "-n --dry-run" help="Show which providers would run, without running them"
|
|
flag --list help="List configured providers with their status, sources, and outputs"
|
|
flag --monorepo help="Also run providers from every config root in `[monorepo].config_roots`" env=MISE_MONOREPO {
|
|
long_help #"""
|
|
Also run providers from every config root in `[monorepo].config_roots`
|
|
|
|
Requires `monorepo_root = true` and an explicit `config_roots` list in the
|
|
monorepo root's config. Provider names then include their root, such as
|
|
`//apps/api:uv`.
|
|
"""#
|
|
}
|
|
flag --only help="Run only these providers" var=#true {
|
|
arg <PROVIDER>
|
|
}
|
|
flag --skip help="Skip these providers" var=#true {
|
|
arg <PROVIDER>
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[PROVIDER]" help="Run only this provider, or explain it with --explain" required=#false
|
|
example "mise deps install" help="Run every provider that is out of date"
|
|
example "mise deps install --force" help="Run every provider, even fresh ones"
|
|
example "mise deps install --dry-run" help="Show which providers would run"
|
|
}
|
|
cmd remove help="Remove packages from the project's dependencies" effect=destructive {
|
|
long_help #"""
|
|
Remove packages from the project's dependencies
|
|
|
|
Runs the package manager's remove command, which updates the project's manifest
|
|
and its lockfile, not mise.toml. Name each package as `<ecosystem>:<package>`,
|
|
such as `npm:lodash`.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <PACKAGES>… help="Packages to remove, such as `npm:lodash`" var=#true
|
|
example "mise deps remove npm:lodash" help="Remove lodash from package.json"
|
|
}
|
|
example "mise deps" help="Run every provider that is out of date"
|
|
example "mise deps install npm --explain" help="Show why the npm provider would or would not run"
|
|
example "mise deps --monorepo" help="Include providers from every monorepo config root"
|
|
}
|
|
cmd prune help="Delete tool versions that nothing uses" effect=destructive {
|
|
long_help #"""
|
|
Delete tool versions that nothing uses
|
|
|
|
mise records each config file it loads (in ~/.local/state/mise/tracked-configs)
|
|
and each tool stub it runs (in ~/.local/state/mise/tracked-stubs). `mise prune`
|
|
deletes installed versions that none of them selects. A config that requests
|
|
`node = "20"` keeps only the 20.x version it resolves to. Versions installed
|
|
only for `mise exec <TOOL>@<VERSION>` or through `MISE_<TOOL>_VERSION` are
|
|
deleted. Versions that a running process was started from are kept, so a
|
|
long-running program keeps its files.
|
|
|
|
It also forgets tracked, trusted, and ignored config files that no longer
|
|
exist. Pass `--tools` or `--configs` to do only one of the two. List the
|
|
versions it would delete with `mise ls --prunable`.
|
|
"""#
|
|
flag "-n --dry-run" help="Show what would change without changing anything"
|
|
flag --configs help="Only forget tracked, trusted, and ignored config files that no longer exist"
|
|
flag --dry-run-code help="Like --dry-run, but exit with code 1 if there are tools to prune" {
|
|
long_help #"""
|
|
Like --dry-run, but exit with code 1 if there are tools to prune
|
|
|
|
Use it in scripts that check whether tools need pruning.
|
|
"""#
|
|
}
|
|
flag --monorepo help="Placeholder for future monorepo pruning; `mise prune --monorepo` is not implemented yet." hide=#true
|
|
flag --tools help="Only delete unused tool versions"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[INSTALLED_TOOL]…" help="Prune only these tools" required=#false var=#true
|
|
example #"""
|
|
mise prune --dry-run
|
|
mise node@20.0.0 is prunable: node is required at 20.19.5 by ~/src/app/mise.toml
|
|
mise node@20.0.0 [dryrun] remove ~/.local/share/mise/installs/node/20.0.0, ~/.cache/mise/node/20.0.0
|
|
"""# help="Preview what would be deleted and why"
|
|
example "mise prune --tools node" help="Delete unused node versions only"
|
|
}
|
|
cmd __publish-system-install hide=#true help="[internal] publish a staged system installation as root" effect=destructive {
|
|
long_help #"""
|
|
[internal] publish a staged system installation as root
|
|
|
|
`mise install --system` prepares a tool as the invoking user and streams it into this command through sudo. Reads one request and its archive from stdin; see `system_install`.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
cmd registry help="List registry shorthand names and their backends" effect=read {
|
|
long_help #"""
|
|
List registry shorthand names and their backends
|
|
|
|
The registry maps short names to backends. For example, `node` uses the
|
|
built-in node backend (`core:node`). When a tool lists several backends, mise
|
|
uses the first one that this platform and your settings allow. An explicit
|
|
identifier such as `aqua:jqlang/jq`, a `[tool_alias]` entry, or a
|
|
`MISE_BACKENDS_<TOOL>` environment variable overrides that choice.
|
|
|
|
This is not a list of every tool mise can install. Use an explicit identifier
|
|
such as `github:owner/repo` for a source without a registry shorthand.
|
|
"""#
|
|
flag "-b --backend" help="Show only tools for this backend" {
|
|
arg <BACKEND>
|
|
}
|
|
flag --complete help="Print all tools with descriptions for shell completions" hide=#true
|
|
flag --hide-aliased help="Hide names that are aliases of another registry tool"
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --security help="Include security features for each tool's backends in JSON output" requires=--json {
|
|
long_help #"""
|
|
Include security features for each tool's backends in JSON output
|
|
|
|
Requires --json. Features are merged across a tool's backends. Each backend is resolved separately, so this slows down a full listing.
|
|
"""#
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[NAME]" help="Show only this tool's backends, in the order mise prefers them" required=#false
|
|
example "mise registry" help="List every registry tool and its backends"
|
|
example #"""
|
|
mise registry jq
|
|
aqua:jqlang/jq asdf:mise-plugins/asdf-jq
|
|
"""# help="Show the backends for one tool"
|
|
example "mise registry --backend aqua" help="List the tools that have an aqua backend"
|
|
example "mise registry --json" help="Print the registry as JSON"
|
|
}
|
|
cmd render-help hide=#true help="[internal] Generate docs files from the CLI and the registry" effect=write {
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
cmd reshim help="Create shims for executables provided by installed tools" effect=write {
|
|
long_help #"""
|
|
Create shims for executables provided by installed tools
|
|
|
|
Run this when an executable was added to an existing installation outside
|
|
mise, for example after a language package manager installed a CLI globally.
|
|
It rebuilds your shim directory (~/.local/share/mise/shims by default).
|
|
`--system` rebuilds the system shim directory used by `mise install --system`.
|
|
|
|
Shims are created for all installed versions. When invoked, a shim picks the
|
|
version to run from the current config. `--force` rebuilds mise-owned shims;
|
|
it does not turn unrelated files into mise-owned shims.
|
|
See https://mise.jdx.dev/dev-tools/shims.html
|
|
"""#
|
|
flag "-f --force" help="Rebuild all mise-owned shims"
|
|
flag --system help="Rebuild the system shims, for tools installed with `mise install --system`"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TOOL]" required=#false hide=#true
|
|
arg "[VERSION]" required=#false hide=#true
|
|
example #"""
|
|
mise reshim
|
|
~/.local/share/mise/shims/node -v
|
|
v24.11.0
|
|
"""# help="Rebuild shims, then run node through its shim"
|
|
}
|
|
cmd run disable_help_flag=#true restart_token=::: help="Run tasks and their dependencies" unknown_flags=value {
|
|
alias r
|
|
long_help #"""
|
|
Run tasks and their dependencies
|
|
|
|
Run one task with `mise run TASK [ARGS...]`, or several with `:::` between them. Put mise flags before the task name; everything after it goes to the task. With no task, mise runs the `default` task if there is one, or opens a task picker in an interactive terminal.
|
|
|
|
Tasks come from `[tasks]` in `mise.toml` and from task directories such as `mise-tasks/`. A task with `sources` and `outputs` is skipped while its outputs are up to date; `--force` runs it anyway. For example:
|
|
|
|
```toml
|
|
[tasks.build]
|
|
run = "npm run build"
|
|
sources = ["src/**/*.ts", "package.json", "package-lock.json"]
|
|
outputs = ["dist/**/*.js"]
|
|
```
|
|
|
|
The experimental artifact cache (a task's `cache` field) has separate `--task-cache` controls.
|
|
|
|
To create a script task, run `mise tasks add --file hello -- echo hello`, then `mise run hello`. See https://mise.jdx.dev/tasks/running-tasks.html
|
|
"""#
|
|
flag --affected help="Run matching tasks only in projects affected by Git changes" {
|
|
long_help #"""
|
|
Run matching tasks only in projects affected by Git changes
|
|
|
|
Counts committed changes between the base and head revisions, plus staged, unstaged, and untracked changes in the working tree when the head revision is the checked-out commit. Requires a monorepo root (`monorepo_root = true`).
|
|
"""#
|
|
}
|
|
flag --affected-base help="Git base revision for `--affected`" requires=--affected {
|
|
long_help #"""
|
|
Git base revision for `--affected`
|
|
|
|
Defaults to `MISE_AFFECTED_BASE`, CI metadata, or `HEAD~1`.
|
|
"""#
|
|
arg <REV>
|
|
}
|
|
flag --affected-committed help="Count committed changes between the base and head revisions" requires=--affected {
|
|
long_help #"""
|
|
Count committed changes between the base and head revisions
|
|
|
|
Alone, ignores the working tree. Combines with `--affected-uncommitted` and `--affected-untracked`. With none of the three, every source counts (the working-tree sources only when the head revision is the checked-out commit). Also set by `MISE_AFFECTED_COMMITTED`.
|
|
"""#
|
|
}
|
|
flag --affected-explain help="Explain why `--affected` selected each project and task" conflicts=--affected-json requires=--affected
|
|
flag --affected-head help="Git head revision for `--affected`" requires=--affected {
|
|
long_help #"""
|
|
Git head revision for `--affected`
|
|
|
|
Defaults to `MISE_AFFECTED_HEAD`, CI metadata, or `HEAD`.
|
|
"""#
|
|
arg <REV>
|
|
}
|
|
flag --affected-json help="Print the affected projects and tasks as JSON without running tasks" conflicts=--affected-explain requires=--affected
|
|
flag --affected-uncommitted help="Count staged and unstaged changes to tracked files" requires=--affected {
|
|
long_help #"""
|
|
Count staged and unstaged changes to tracked files
|
|
|
|
Combines with the other source flags. Alone, ignores committed changes. Needs the head revision to be the current checkout. Also set by `MISE_AFFECTED_UNCOMMITTED`.
|
|
"""#
|
|
}
|
|
flag --affected-untracked help="Count untracked files that Git does not ignore" requires=--affected {
|
|
long_help #"""
|
|
Count untracked files that Git does not ignore
|
|
|
|
Combines with the other source flags. Alone, ignores committed changes. Needs the head revision to be the current checkout. Also set by `MISE_AFFECTED_UNTRACKED`.
|
|
"""#
|
|
}
|
|
flag --all help="Open the task picker with tasks from every project in the monorepo" conflicts=--affected
|
|
flag "-c --continue-on-error" help="Continue running tasks even if one fails"
|
|
flag "-C --cd" help="Change to this directory before running the tasks" {
|
|
arg <DIR>
|
|
}
|
|
flag "-f --force" help="Run the tasks even if their outputs are up to date"
|
|
flag "-j --jobs" help="Number of tasks to run in parallel (default: the `jobs` setting)" env=MISE_JOBS {
|
|
long_help #"""
|
|
Number of tasks to run in parallel (default: the `jobs` setting)
|
|
|
|
Values below 1 are treated as 1.
|
|
"""#
|
|
arg <JOBS>
|
|
}
|
|
flag "-n --dry-run" help="Print the tasks in the order they would run, without running them"
|
|
flag "-o --output" help="How task output is displayed" env=MISE_TASK_OUTPUT {
|
|
long_help #"""
|
|
How task output is displayed
|
|
|
|
- `prefix` - Print stdout/stderr by line, prefixed with the task's label
|
|
- `interleave` - Print directly to stdout/stderr instead of by line
|
|
- `replacing` - Stdout is replaced each time, stderr is printed as is
|
|
- `timed` - Only show stdout lines if they are displayed for more than 1 second
|
|
- `keep-order` - Print stdout/stderr by line, prefixed with the task's label, but keep the order of the output
|
|
- `quiet` - Deprecated; use `--output interleave --quiet`
|
|
- `silent` - Do not show any output, including the task's stdout and stderr, except errors
|
|
"""#
|
|
arg <OUTPUT>
|
|
}
|
|
flag "-q --quiet" help="Do not show extra output" env=MISE_QUIET
|
|
flag "-r --raw" help="Connect the tasks directly to stdin, stdout, and stderr instead of reading their output by line" {
|
|
long_help #"""
|
|
Connect the tasks directly to stdin, stdout, and stderr instead of reading their output by line
|
|
|
|
Redactions are not applied, and tasks run one at a time. Set the `raw` setting to make this the default.
|
|
"""#
|
|
}
|
|
flag --secrets help="[experimental] Give the named tasks these secrets (comma-separated); their dependencies and subtasks do not get them" var=#true conflicts=--affected {
|
|
long_help #"""
|
|
[experimental] Give the named tasks these secrets (comma-separated); their dependencies and subtasks do not get them
|
|
|
|
Put this flag before the task name. Not allowed in safe mode.
|
|
"""#
|
|
arg <SECRET> delimiter=,
|
|
}
|
|
flag --secrets-all help="[experimental] Give the named tasks every secret the project can inject; their dependencies and subtasks do not get them" {
|
|
long_help #"""
|
|
[experimental] Give the named tasks every secret the project can inject; their dependencies and subtasks do not get them
|
|
|
|
Covers the fnox secrets with `env = true` or `env = "exec"`, never those with `env = false`. Put this flag before the task name. Not allowed in safe mode.
|
|
"""#
|
|
conflicts "--secrets" "--affected"
|
|
}
|
|
flag "-s --shell" help="Shell used to run TOML tasks that do not set their own `shell`" {
|
|
long_help #"""
|
|
Shell used to run TOML tasks that do not set their own `shell`
|
|
|
|
Defaults to `sh -o errexit -c` on Unix and `cmd /c` on Windows, from the `unix_default_inline_shell_args` or `windows_default_inline_shell_args` setting. A task's `shell` property takes precedence over this flag.
|
|
"""#
|
|
arg <SHELL>
|
|
}
|
|
flag "-S --silent" help="Do not show any output except for errors" env=MISE_SILENT
|
|
flag "-t --tool" help="Extra tools to use with the tasks, e.g. node@24 python@3.13" var=#true {
|
|
arg <TOOL@VERSION>
|
|
}
|
|
flag --allow-env help="Allow a specific env var through (implies `--deny-env` for everything else)" var=#true {
|
|
long_help #"""
|
|
Allow a specific env var through (implies `--deny-env` for everything else)
|
|
|
|
Supports wildcards, such as `--allow-env='MYAPP_*'`.
|
|
"""#
|
|
arg <VAR>
|
|
}
|
|
flag --allow-net help="Allow network access only to HOST (not supported on any platform)" var=#true {
|
|
long_help #"""
|
|
Allow network access only to HOST (not supported on any platform)
|
|
|
|
Per-host filtering does not work: Linux and macOS exit with an error, and Windows runs the task without network restrictions. See https://mise.jdx.dev/sandboxing.html#access-to-particular-hosts
|
|
"""#
|
|
arg <HOST>
|
|
}
|
|
flag --allow-read help="Allow reads from a specific path (implies `--deny-read` for everything else)" var=#true {
|
|
arg <PATH>
|
|
}
|
|
flag --allow-write help="Allow writes to a specific path (implies `--deny-write` for everything else)" var=#true {
|
|
arg <PATH>
|
|
}
|
|
flag --deny-all help="Block reads, writes, network, and env vars"
|
|
flag --deny-env help="Block env var inheritance except PATH, HOME, USER, SHELL, TERM, COLORTERM, and LANG" {
|
|
long_help #"""
|
|
Block env var inheritance except PATH, HOME, USER, SHELL, TERM, COLORTERM, and LANG
|
|
|
|
On Windows it also keeps the variables programs need to start, such as `SystemRoot` and `TEMP`.
|
|
"""#
|
|
}
|
|
flag --deny-net help="Block all network access"
|
|
flag --deny-read help="Block filesystem reads (system libraries and tool directories stay readable)"
|
|
flag --deny-write help="Block filesystem writes except temporary and device paths (/tmp, /dev)"
|
|
flag --fresh-env help="Bypass the environment cache and recompute the environment"
|
|
flag --no-cache help="Do not use the cache for remote tasks" env=MISE_TASK_REMOTE_NO_CACHE
|
|
flag --no-deps help="Do not run `[deps]` providers that have `auto = true` before the tasks"
|
|
flag --no-timings help="Hide the elapsed time printed after each task completes" {
|
|
alias "--no-timing" hide=#true
|
|
long_help #"""
|
|
Hide the elapsed time printed after each task completes
|
|
|
|
Set `task.timings = false` to hide it by default.
|
|
"""#
|
|
}
|
|
flag --skip-deps help="Run only the named tasks, not the tasks they depend on" env=MISE_TASK_SKIP_DEPENDS
|
|
flag --skip-tools help="Do not install missing tools before running the tasks" {
|
|
long_help #"""
|
|
Do not install missing tools before running the tasks
|
|
|
|
Set `task.run_auto_install = false` to make this the default.
|
|
"""#
|
|
}
|
|
flag --task-cache help="[experimental] Set artifact cache access for this run" env=MISE_TASK_CACHE default=read-write {
|
|
long_help #"""
|
|
[experimental] Set artifact cache access for this run
|
|
|
|
- `read-write` - Read cached results and write new results
|
|
- `read-only` - Read cached results without writing new results
|
|
- `write-only` - Write new results without reading cached results
|
|
- `off` - Disable the artifact cache
|
|
- `local-only` - Read and write only the local cache, skipping any remote cache
|
|
"""#
|
|
arg <TASK_CACHE> {
|
|
choices {
|
|
choice read-write help="Read cached results and write new results."
|
|
choice read-only help="Read cached results without writing new results."
|
|
choice write-only help="Write new results without reading cached results."
|
|
choice off help="Disable task output caching for this run."
|
|
choice local-only help="Read and write only the local cache."
|
|
}
|
|
}
|
|
}
|
|
flag --task-cache-explain help="[experimental] Explain the inputs that produced each task's artifact cache key"
|
|
flag --task-cache-explain-json help="[experimental] Print cache-key input details as JSON Lines without running tasks (requires `--dry-run`)" conflicts=--task-cache-explain requires=--dry-run
|
|
flag --task-cache-stats help="[experimental] Report artifact cache hits, restored bytes, and time saved" conflicts=--dry-run
|
|
flag --timeout help="Stop the run if it takes longer than this, e.g. 30s or 5m" {
|
|
long_help #"""
|
|
Stop the run if it takes longer than this, e.g. 30s or 5m
|
|
|
|
Overrides the `task.timeout` setting.
|
|
"""#
|
|
arg <TIMEOUT>
|
|
}
|
|
flag --timings help="Show the elapsed time after each task completes" hide=#true {
|
|
alias "--timing" hide=#true
|
|
long_help #"""
|
|
Show the elapsed time after each task completes
|
|
|
|
Set `task.timings = true` to show it by default.
|
|
"""#
|
|
}
|
|
mount run="mise tasks --usage" synopsis="[TASK] [ARGS]…"
|
|
example "mise run lint" help="Run the \"lint\" task, defined in mise.toml or as a script"
|
|
example "mise run --force build" help="Run \"build\" even if its outputs are up to date"
|
|
example "mise run --raw test" help="Run \"test\" connected directly to the terminal, one task at a time"
|
|
example "mise run lint ::: test ::: check" help="Run the \"lint\", \"test\", and \"check\" tasks in parallel"
|
|
example "mise run cmd1 arg1 arg2 ::: cmd2 arg1 arg2" help="Run several tasks, each with its own arguments"
|
|
example "mise run -j 1 lint ::: test" help="Run tasks one at a time"
|
|
example "mise run 'test:*'" help="Run every task that matches a pattern"
|
|
example "mise run //services/api:build" help="Run a task in a monorepo project"
|
|
example "mise run --secrets DEPLOY_KEY deploy" help="Give \"deploy\" the DEPLOY_KEY secret (experimental); its dependencies do not get it"
|
|
complete dir type=dir
|
|
}
|
|
cmd search help="Search for available tools" effect=read {
|
|
long_help #"""
|
|
Search for available tools
|
|
|
|
Searches the registry and the tool lists of installed backend plugins for
|
|
tools matching NAME. When nothing matches, it also searches the aqua
|
|
registry. Prefix NAME with `npm:`, `cargo:`, `gem:`, or `dotnet:` to also
|
|
search that package registry, or pass `--all` to search every source.
|
|
|
|
Matching is fuzzy by default. Use `--match-type equal` or
|
|
`--match-type contains` for stricter matches.
|
|
"""#
|
|
flag "-a --all" help="Search every source: the registry, aqua, installed backend plugins, and the npm, cargo, gem, and dotnet package registries"
|
|
flag "-i --interactive" help="Show an interactive search menu" {
|
|
conflicts "--match-type" "--no-header"
|
|
}
|
|
flag "-m --match-type" help="Match type: equal, contains, or fuzzy" default=fuzzy {
|
|
arg <MATCH_TYPE> {
|
|
choices {
|
|
choice equal
|
|
choice contains
|
|
choice fuzzy
|
|
}
|
|
}
|
|
}
|
|
flag --no-header help="Do not print the table header" {
|
|
alias "--no-headers" hide=#true
|
|
}
|
|
flag --complete help="Print all tools with descriptions for shell completions" hide=#true
|
|
flag --complete-ids help="Print only tool identifiers for shell completions" hide=#true
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[NAME]" help="The tool to search for" required=#false
|
|
example #"""
|
|
mise search jq
|
|
Tool Description
|
|
jq Command-line JSON processor. https://github.com/jqlang/jq
|
|
jqp A TUI playground to experiment with jq. https://github.com/noahgorstein/jqp
|
|
jiq jid on jq - interactive JSON query tool using jq expressions. https://github.com/fiatjaf/jiq
|
|
gojq Pure Go implementation of jq. https://github.com/itchyny/gojq
|
|
"""# help="Fuzzy-search the registry for jq"
|
|
example #"""
|
|
mise search --match-type equal npm:typescript-language-server
|
|
Tool Description
|
|
npm:typescript-language-server Language Server Protocol (LSP) implementation for TypeScript using tsserver
|
|
"""# help="Look up one npm package by its exact name"
|
|
example "mise search --interactive" help="Pick a tool from a filterable list"
|
|
}
|
|
cmd secrets help="[experimental] Inspect the project's secrets source" effect=read {
|
|
long_help #"""
|
|
[experimental] Inspect the project's secrets source
|
|
|
|
With no subcommand, lists secret names (same as `mise secrets ls`; the flags
|
|
below are passed to it). See https://mise.jdx.dev/environments/secrets/fnox.html
|
|
"""#
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --no-header help="Do not print the table header"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd ls help="[experimental] List secret names from the project's secrets source" effect=read {
|
|
alias list
|
|
long_help #"""
|
|
[experimental] List secret names from the project's secrets source
|
|
|
|
Shows names and metadata, never values. The source is declared in the
|
|
project's `mise.toml` with `[secrets.fnox]`. A line describing the source
|
|
goes to stderr and the table to stdout.
|
|
|
|
Columns:
|
|
- ENV: the key's `env` setting in the source: true, exec, false, or - if unset
|
|
- FILE: whether the value is handed over as a file
|
|
- SCOPES: where mise can grant the key: run (tasks) and exec (`mise exec`)
|
|
- TASKS: the tasks that request the key
|
|
|
|
A SCOPES value of - means the key cannot be granted. A file secret can be
|
|
granted to tasks only, because `mise exec` cannot clean up the file after it
|
|
hands the process over.
|
|
"""#
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --no-header help="Do not print the table header"
|
|
flag --complete help="Render completions: the injectable key names, one per line" hide=#true
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example #"""
|
|
mise secrets ls
|
|
KEY ENV FILE SCOPES TASKS DESCRIPTION
|
|
AWS_ACCESS_KEY_ID - no run, exec (lease aws)
|
|
DATABASE_URL true no run, exec deploy app database
|
|
GCP_SA_JSON exec yes run service account
|
|
SIGNING_KEY false no - release signing key
|
|
"""# help="List the secret names and how each can be granted"
|
|
}
|
|
}
|
|
cmd self-update help="Update mise itself" effect=write {
|
|
long_help #"""
|
|
Update mise itself
|
|
|
|
Installs the newest stable release, or VERSION, from GitHub Releases and
|
|
verifies its signature before replacing the running binary. Without VERSION,
|
|
releases younger than the minimum release age are skipped: the
|
|
`self_update.minimum_release_age` setting, then `minimum_release_age`, else
|
|
24h. Installed plugins are updated too unless you pass `--no-plugins`. Set
|
|
`self_update.auto` to update automatically.
|
|
|
|
If a package manager such as Homebrew or apt installed mise, update it with
|
|
that package manager instead: https://mise.jdx.dev/installing-mise.html#updating
|
|
Packagers can disable this command: https://mise.jdx.dev/packaging.html
|
|
"""#
|
|
flag --minimum-release-age help="Minimum release age for this update, such as 7d" {
|
|
long_help #"""
|
|
Minimum release age for this update, such as 7d
|
|
|
|
Defaults to the self_update.minimum_release_age setting, then the minimum_release_age setting, else 24h.
|
|
"""#
|
|
arg <MINIMUM_RELEASE_AGE>
|
|
}
|
|
flag "-f --force" help="Update even if already up to date" {
|
|
long_help #"""
|
|
Update even if already up to date
|
|
|
|
Also updates when the package that installed mise has disabled self-update.
|
|
"""#
|
|
}
|
|
flag "-y --yes" help="Skip confirmation prompt"
|
|
flag --no-plugins help="Do not update installed plugins"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[VERSION]" help="Update to a specific version, skipping the minimum release age" required=#false
|
|
example "mise self-update" help="Update to the newest eligible release"
|
|
example "mise self-update 2026.10.4" help="Install a specific release"
|
|
example "mise self-update -y --no-plugins" help="Update without prompting or touching plugins"
|
|
}
|
|
cmd set help="Set, show, or list environment variables in mise.toml" effect=write {
|
|
alias ev env-vars
|
|
long_help #"""
|
|
Set, show, or list environment variables in mise.toml
|
|
|
|
`mise set KEY=VALUE` writes to the lowest-precedence TOML file in the nearest
|
|
config directory (`mise.toml` rather than `mise.local.toml`), creating
|
|
`mise.toml` in the current directory if there is none. Run in your home
|
|
directory, it writes to the global config. `mise set KEY` prints one value,
|
|
and `mise set` lists every variable with its source file. Use `--global`,
|
|
`--file`, or `-E <env>` to write elsewhere.
|
|
See https://mise.jdx.dev/configuration.html#target-file-for-write-operations
|
|
"""#
|
|
flag "-E --env" help="Write to mise.<ENV>.toml in the current directory, or to .mise.<ENV>.toml if that exists" {
|
|
overrides "--global" "--file"
|
|
arg <ENV>
|
|
}
|
|
flag "-g --global" help="Set the environment variable in the global config file" {
|
|
overrides "--file" "--env"
|
|
}
|
|
flag --override help="Set the environment variable in the global override file, `config.override.toml`" {
|
|
long_help #"""
|
|
Set the environment variable in the global override file, `config.override.toml`
|
|
|
|
The override file outranks all project config. With `--env`, writes `config.<ENV>.override.toml` instead. See https://mise.jdx.dev/configuration.html#override-file
|
|
"""#
|
|
conflicts "--global" "--file"
|
|
}
|
|
flag --age-encrypt help="[experimental] Encrypt the value with age before storing" requires=ENV_VAR
|
|
flag --age-key-file help="[experimental] Age identity file whose public keys to encrypt to" requires=--age-encrypt {
|
|
long_help #"""
|
|
[experimental] Age identity file whose public keys to encrypt to
|
|
|
|
Without --age-recipient, --age-ssh-recipient, or --age-key-file, mise encrypts to the identities in the `age.key_file` setting (or ~/.config/mise/age.txt if it exists) and to ~/.ssh/id_ed25519 and ~/.ssh/id_rsa when they exist.
|
|
"""#
|
|
arg <PATH>
|
|
}
|
|
flag --age-recipient help="[experimental] Age recipient (x25519 public key) for encryption" var=#true requires=--age-encrypt {
|
|
long_help #"""
|
|
[experimental] Age recipient (x25519 public key) for encryption
|
|
|
|
Can be used multiple times. Requires --age-encrypt.
|
|
"""#
|
|
arg <RECIPIENT>
|
|
}
|
|
flag --age-ssh-recipient help="[experimental] SSH recipient (public key or path) for age encryption" var=#true requires=--age-encrypt {
|
|
long_help #"""
|
|
[experimental] SSH recipient (public key or path) for age encryption
|
|
|
|
Can be used multiple times. Requires --age-encrypt.
|
|
"""#
|
|
arg <PATH_OR_PUBKEY>
|
|
}
|
|
flag --complete help="Render completions" hide=#true
|
|
flag "--file --path" help="The TOML file to update" {
|
|
long_help #"""
|
|
The TOML file to update
|
|
|
|
Can be a file or a directory. For a directory, mise uses the config file already in it, or creates one named by MISE_DEFAULT_CONFIG_FILENAME (default `mise.toml`): https://mise.jdx.dev/configuration/settings.html#default_config_filename To move the global config file, set MISE_GLOBAL_CONFIG_FILE: https://mise.jdx.dev/configuration/settings.html#global_config_file
|
|
"""#
|
|
arg <FILE>
|
|
}
|
|
flag --no-redact help="Show raw values instead of redacting secrets"
|
|
flag --prompt help="Prompt for environment variable values (input is masked only with --age-encrypt)"
|
|
flag "--remove --rm --unset" help="Remove the environment variable from config file" var=#true hide=#true {
|
|
long_help #"""
|
|
Remove the environment variable from config file
|
|
|
|
Can be used multiple times.
|
|
"""#
|
|
arg <ENV_KEY>
|
|
}
|
|
flag --stdin help="Read the value from stdin, for multiline input" conflicts=--prompt requires=ENV_VAR {
|
|
long_help #"""
|
|
Read the value from stdin, for multiline input
|
|
|
|
Pass a single key without a value; the value is read from stdin until EOF.
|
|
"""#
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[ENV_VAR]…" help="Environment variables to set, such as NODE_ENV=production" required=#false var=#true
|
|
example "mise set NODE_ENV=production" help="Set NODE_ENV in mise.toml"
|
|
example #"""
|
|
mise set NODE_ENV
|
|
production
|
|
"""# help="Show one variable's value"
|
|
example "mise set" help="List variables, their values, and their source files"
|
|
example "mise set -E staging NODE_ENV=staging" help="Write the variable to mise.staging.toml"
|
|
example "mise set --prompt PASSWORD" help="Prompt for the value; input is visible unless you add --age-encrypt"
|
|
example "cat private.key | mise set --stdin MY_KEY" help="Read a multiline value from stdin"
|
|
example "mise set --age-encrypt --prompt API_KEY" help="Prompt with hidden input and store the value encrypted with age (experimental)"
|
|
complete path type=path
|
|
complete file type=path
|
|
}
|
|
cmd settings help="Manage settings" effect=write {
|
|
long_help #"""
|
|
Manage settings
|
|
|
|
With no arguments, lists the settings set in config files (same as
|
|
`mise settings ls`). With SETTING, prints its effective value. With
|
|
SETTING=VALUE or SETTING VALUE, writes it to the global config
|
|
(~/.config/mise/config.toml), or to the nearest project config with
|
|
`--local`. Every setting is described at
|
|
https://mise.jdx.dev/configuration/settings.html
|
|
"""#
|
|
flag "-a --all" help="List all settings"
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag "-l --local" help="Use only the nearest project config" global=#true {
|
|
long_help #"""
|
|
Use only the nearest project config
|
|
|
|
Reads only its explicit settings, or writes to it instead of the global config.
|
|
"""#
|
|
}
|
|
flag "-T --toml" help="Output in TOML format"
|
|
flag --complete help="Print all settings with descriptions for shell completions" hide=#true
|
|
flag --json-extended help="Output in JSON format with sources"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[SETTING]" help="Only show this setting, or the settings under this prefix such as `python`" required=#false
|
|
arg "[VALUE]" help="The value to set" required=#false conflicts=all
|
|
group output "--json" "--toml" "--json-extended"
|
|
cmd add help="Append a value to an array setting" effect=write {
|
|
long_help #"""
|
|
Append a value to an array setting
|
|
|
|
Adds the value to an array setting such as `disable_hints`, keeping existing
|
|
entries. Writes ~/.config/mise/config.toml, or the nearest project config
|
|
with `--local`.
|
|
"""#
|
|
flag "-l --local" help="Write to the nearest project config instead of the global config" {
|
|
long_help #"""
|
|
Write to the nearest project config instead of the global config
|
|
|
|
The nearest project config is the lowest-precedence TOML file in the nearest directory that has one, or ./mise.toml.
|
|
"""#
|
|
}
|
|
flag --override help="Write to the global override file, `config.override.toml`" conflicts=--local {
|
|
long_help #"""
|
|
Write to the global override file, `config.override.toml`
|
|
|
|
The override file outranks all project config, so the setting wins over the same setting in a project's `mise.toml`.
|
|
"""#
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <SETTING> help="The array setting to append to"
|
|
arg "[VALUE]" help="The value to append (or pass SETTING=VALUE)" required=#false
|
|
example "mise settings add disable_hints python_multi" help="Stop showing the python_multi hint"
|
|
}
|
|
cmd get help="Show the effective value of a setting" effect=read {
|
|
long_help #"""
|
|
Show the effective value of a setting
|
|
|
|
Includes defaults, config files, and environment overrides. With `--local`,
|
|
reads only the explicit settings in the nearest project config, and a
|
|
setting that is not set there is an error. An optional setting with no
|
|
default that is not set anywhere, such as `python.compile`, is also reported
|
|
as not set and exits with an error. To inspect one file, use
|
|
`mise config get settings.KEY --file path/to/mise.toml`.
|
|
"""#
|
|
flag "-l --local" help="Read only the explicit settings in the nearest project config"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <SETTING> help="The setting to show"
|
|
example "mise settings get jobs" help="Show the effective number of parallel jobs"
|
|
example "mise settings get --local experimental" help="Show the value set in the project config"
|
|
}
|
|
cmd ls help="List configured settings and their sources" effect=read {
|
|
alias list
|
|
long_help #"""
|
|
List configured settings and their sources
|
|
|
|
By default, lists the settings set in loaded TOML config files. `--all` also
|
|
includes the effective value of every other setting. `--local` lists only the
|
|
nearest project config, and `--json-extended` adds source information to
|
|
JSON output. Use `mise settings get SETTING` for one effective value.
|
|
"""#
|
|
flag "-a --all" help="List all settings"
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag "-l --local" help="Use only the nearest project config" global=#true {
|
|
long_help #"""
|
|
Use only the nearest project config
|
|
|
|
Reads only its explicit settings, or writes to it instead of the global config.
|
|
"""#
|
|
}
|
|
flag "-T --toml" help="Output in TOML format"
|
|
flag --complete help="Print all settings with descriptions for shell completions" hide=#true
|
|
flag --json-extended help="Output in JSON format with sources"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[SETTING]" help="Only show this setting, or the settings under this prefix such as `python`" required=#false
|
|
group output "--json" "--toml" "--json-extended"
|
|
example "mise settings ls" help="List settings set in config files"
|
|
example "mise settings ls --all" help="Include settings left at their defaults"
|
|
example "mise settings ls python --json-extended" help="Show the python settings as JSON with their sources"
|
|
}
|
|
cmd set help="Set a setting" effect=write {
|
|
alias create
|
|
long_help #"""
|
|
Set a setting
|
|
|
|
Writes ~/.config/mise/config.toml, or the nearest project config with
|
|
`--local`. Settings that mise reads before loading config files cannot be set
|
|
here: set `global_config_file` and similar through their environment
|
|
variables, and `ceiling_paths` and similar in a `miserc.toml` file or their
|
|
environment variables. `--local` refuses settings that only the global config
|
|
can set, such as `yes`.
|
|
See https://mise.jdx.dev/configuration/settings.html
|
|
"""#
|
|
flag "-l --local" help="Write to the nearest project config instead of the global config" {
|
|
long_help #"""
|
|
Write to the nearest project config instead of the global config
|
|
|
|
The nearest project config is the lowest-precedence TOML file in the nearest directory that has one, or ./mise.toml.
|
|
"""#
|
|
}
|
|
flag --override help="Write to the global override file, `config.override.toml`" conflicts=--local {
|
|
long_help #"""
|
|
Write to the global override file, `config.override.toml`
|
|
|
|
The override file outranks all project config, so the setting wins over the same setting in a project's `mise.toml`.
|
|
"""#
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <SETTING> help="The setting to set"
|
|
arg "[VALUE]" help="The value to set (or pass SETTING=VALUE)" required=#false
|
|
example "mise settings set jobs 4" help="Run up to 4 jobs in parallel"
|
|
example "mise settings set --local experimental=true" help="Enable experimental features in the project config"
|
|
}
|
|
cmd unset help="Remove a setting from the global or project config" effect=write {
|
|
alias rm remove delete del
|
|
long_help #"""
|
|
Remove a setting from the global or project config
|
|
|
|
Edits ~/.config/mise/config.toml, or the nearest project config with
|
|
`--local`. The setting then falls back to its default or to a value from
|
|
another config file.
|
|
"""#
|
|
flag "-l --local" help="Write to the nearest project config instead of the global config" {
|
|
long_help #"""
|
|
Write to the nearest project config instead of the global config
|
|
|
|
The nearest project config is the lowest-precedence TOML file in the nearest directory that has one, or ./mise.toml.
|
|
"""#
|
|
}
|
|
flag --override help="Write to the global override file, `config.override.toml`" conflicts=--local {
|
|
long_help #"""
|
|
Write to the global override file, `config.override.toml`
|
|
|
|
The override file outranks all project config, so the setting wins over the same setting in a project's `mise.toml`.
|
|
"""#
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <KEY> help="The setting to remove"
|
|
example "mise settings unset jobs" help="Remove jobs from the global config"
|
|
}
|
|
example "mise settings" help="List settings set in config files"
|
|
example "mise settings jobs" help="Show the effective value of one setting"
|
|
example "mise settings jobs=4" help="Set jobs in the global config"
|
|
example "mise settings --local node.mirror_url https://npmmirror.com/mirrors/node/" help="Set a setting in the project config"
|
|
}
|
|
cmd shell help="Set a tool version for the current shell session" effect=read {
|
|
alias sh
|
|
long_help #"""
|
|
Set a tool version for the current shell session
|
|
|
|
Installs the version if needed, then sets `MISE_<TOOL>_VERSION`, such as
|
|
`MISE_NODE_VERSION`, to the resolved version in the current shell. That
|
|
overrides config files until you close the shell or run
|
|
`mise shell --unset <TOOL>`, or `mise shell --unset --all` to remove every
|
|
version set this way. Requires `mise activate`: the shell function it
|
|
defines applies the variable that this command prints.
|
|
"""#
|
|
flag "-j --jobs" help="Number of jobs to run in parallel (default: the `jobs` setting)" env=MISE_JOBS {
|
|
arg <JOBS>
|
|
}
|
|
flag "-u --unset" help="Remove a version set earlier with `mise shell`"
|
|
flag --all help="With `--unset`, remove every `MISE_<TOOL>_VERSION` in this shell" conflicts=TOOL@VERSION {
|
|
long_help #"""
|
|
With `--unset`, remove every `MISE_<TOOL>_VERSION` in this shell
|
|
|
|
This includes any you exported yourself, not only those set by `mise shell`.
|
|
"""#
|
|
}
|
|
flag --raw help="Connect the install commands' stdin, stdout, and stderr to the terminal" overrides=--jobs {
|
|
long_help #"""
|
|
Connect the install commands' stdin, stdout, and stderr to the terminal
|
|
|
|
Implies `--jobs=1`.
|
|
"""#
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TOOL@VERSION]…" help="Tools to set, such as node@20" required=#false var=#true required_unless=--all
|
|
example #"""
|
|
mise shell node@20
|
|
node -v
|
|
v20.19.5
|
|
"""# help="Use node 20 in this shell"
|
|
example "mise shell --unset node" help="Go back to the version the config requests"
|
|
example "mise shell --unset --all" help="Drop every version set with `mise shell` or `MISE_<TOOL>_VERSION`"
|
|
}
|
|
cmd ssh help="Open an SSH session, optionally borrowing read-only GitHub access" {
|
|
long_help #"""
|
|
Open an SSH session, optionally borrowing read-only GitHub access
|
|
|
|
Without relay flags, runs OpenSSH to DESTINATION and passes -i, -p, and -o
|
|
through. With `--github-relay-read-only`, Git and mise on the remote host can
|
|
clone, fetch, and download releases from the GitHub repositories you allow,
|
|
using this machine's GitHub credentials, until the session ends. The token
|
|
is not copied to the host, and pushes and API writes are refused.
|
|
|
|
`--github-relay-read-only` needs exactly one of `--github-relay-repo`,
|
|
repeated for each repository, or `--github-relay-all-repos`. A compromised
|
|
host can read what you allow while the session lasts.
|
|
See https://mise.jdx.dev/bootstrap/github-relay.html
|
|
"""#
|
|
flag "-i --identity-file" help="SSH identity file" {
|
|
arg <IDENTITY_FILE>
|
|
}
|
|
flag "-p --port" help="SSH port" {
|
|
arg <PORT>
|
|
}
|
|
flag "-o --ssh-option" help="OpenSSH option; repeat for multiple options" var=#true {
|
|
arg <SSH_OPTION>
|
|
}
|
|
flag --github-relay-read-only help="Borrow read-only GitHub access for this session only"
|
|
flag --github-relay-repo help="GitHub repository the host may read; repeat for more repositories" var=#true {
|
|
arg "<OWNER/REPO>"
|
|
}
|
|
flag --github-relay-all-repos help="Allow reads of every repository your local GitHub credentials can access"
|
|
flag --github-relay-log-requests help="Log sanitized relay requests on local stderr" conflicts=--github-relay-no-log-requests
|
|
flag --github-relay-no-log-requests help="Turn off request logging even if the github_relay.log_requests setting is on"
|
|
flag --github-relay-log-format help="Relay log and summary format: text or jsonl (default: the github_relay.log_format setting)" {
|
|
arg <FORMAT>
|
|
}
|
|
flag --github-relay-max-duration help="End borrowed access after a duration such as 1h; 0s lasts the whole session" {
|
|
arg <DURATION>
|
|
}
|
|
flag --relay-session help="Internal session adapter" hide=#true {
|
|
arg <RELAY_SESSION>
|
|
}
|
|
flag --repository-bundle hide=#true {
|
|
arg <REPOSITORY_BUNDLE>
|
|
}
|
|
flag --repository-origin hide=#true {
|
|
arg <REPOSITORY_ORIGIN>
|
|
}
|
|
flag --repository-revision hide=#true {
|
|
arg <REPOSITORY_REVISION>
|
|
}
|
|
flag --repository-update hide=#true
|
|
flag --repository-require-branch help="The bundled branch was requested with `?ref=`" hide=#true
|
|
flag --repository-yes hide=#true
|
|
flag --repository-dry-run help="Preview the transferred repository's installation without writing it" hide=#true
|
|
flag --repository-preview-directory hide=#true {
|
|
arg <REPOSITORY_PREVIEW_DIRECTORY>
|
|
}
|
|
flag --global-config-directory hide=#true
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[DESTINATION]" help="OpenSSH destination or SSH config alias (required)" required=#false
|
|
arg "[COMMAND]…" help="Command to execute after --; omit for an interactive shell" required=#false double_dash=automatic var=#true
|
|
example "mise ssh devbox --github-relay-read-only --github-relay-repo you/setup -- git clone https://github.com/you/setup.git" help="Let devbox clone one private repository"
|
|
example "mise ssh devbox --github-relay-read-only --github-relay-all-repos" help="Open a shell that can read every repository your credentials can read"
|
|
example "mise ssh devbox -i ~/.ssh/devbox -p 2222 -o ServerAliveInterval=30 -- uname -a" help="Run a command over plain SSH with an identity file, port, and option"
|
|
}
|
|
cmd shell-alias help="Manage shell aliases" effect=read {
|
|
long_help #"""
|
|
Manage shell aliases
|
|
|
|
Shell aliases are defined under `[shell_alias]` in mise.toml. In a shell
|
|
where mise is activated, mise sets them when you enter the directory and
|
|
removes them when you leave. With no subcommand, lists them (same as
|
|
`mise shell-alias ls`). See https://mise.jdx.dev/shell-aliases.html
|
|
"""#
|
|
flag --no-header help="Do not print the table header"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd get help="Show the command for a shell alias" effect=read {
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <shell_alias> help="The alias to show"
|
|
example #"""
|
|
mise shell-alias get ll
|
|
ls -la
|
|
"""# help="Print the command that ll runs"
|
|
}
|
|
cmd ls help="List shell aliases" effect=read {
|
|
alias list
|
|
long_help #"""
|
|
List shell aliases
|
|
|
|
Lists the shell aliases configured for the current directory: the
|
|
`[shell_alias]` entries of every config file mise loads here.
|
|
"""#
|
|
flag --no-header help="Do not print the table header"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example #"""
|
|
mise shell-alias ls
|
|
alias command
|
|
ll ls -la
|
|
gs git status
|
|
"""# help="List the aliases set in this directory"
|
|
}
|
|
cmd set help="Set a shell alias in the global config" effect=write {
|
|
alias add create
|
|
long_help #"""
|
|
Set a shell alias in the global config
|
|
|
|
Writes the global config (~/.config/mise/config.toml by default). To share
|
|
an alias with a project, add it under `[shell_alias]` in the project's
|
|
mise.toml.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <shell_alias> help="The alias name"
|
|
arg "[COMMAND]" help="The command to run (or pass ALIAS=COMMAND)" required=#false
|
|
example "mise shell-alias set ll \"ls -la\"" help="Define ll in every directory"
|
|
example "mise shell-alias set gs=\"git status\"" help="Use the ALIAS=COMMAND form"
|
|
}
|
|
cmd unset help="Remove a shell alias from the global config" effect=write {
|
|
alias rm remove delete del
|
|
long_help #"""
|
|
Remove a shell alias from the global config
|
|
|
|
Edits the global config (~/.config/mise/config.toml by default). An alias
|
|
defined in a project's mise.toml has to be removed there.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <shell_alias> help="The alias to remove"
|
|
example "mise shell-alias unset ll" help="Remove ll from the global config"
|
|
}
|
|
}
|
|
cmd skills help="List and link the agent skills that active tools ship" effect=read {
|
|
alias skill
|
|
long_help #"""
|
|
List and link the agent skills that active tools ship
|
|
|
|
A tool installed with the `packslip:` backend may declare an agent skill: a
|
|
directory holding `SKILL.md` and whatever it references, in the Agent Skills
|
|
format. mise knows which version of each tool is active here, so it can hand
|
|
an agent the skill for exactly that version.
|
|
|
|
With no subcommand, lists the skills (same as `mise skills ls`).
|
|
See https://mise.jdx.dev/dev-tools/packslip-resources.html#skills
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd ls help="List the skills the active tools declare" effect=read {
|
|
alias list
|
|
long_help #"""
|
|
List the skills the active tools declare
|
|
|
|
Each line is a skill of a tool that is installed and active in the current
|
|
directory, with the version it belongs to and the directory holding its
|
|
`SKILL.md`.
|
|
"""#
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example #"""
|
|
mise skills ls
|
|
Skill Tool Version Path
|
|
hk-configure packslip:github.com/jdx/hk 2.5.0 ~/.local/share/mise/installs/packslip-github-com-jdx-hk/2.5.0/skills/hk-configure
|
|
hk-debug packslip:github.com/jdx/hk 2.5.0 ~/.local/share/mise/installs/packslip-github-com-jdx-hk/2.5.0/skills/hk-debug
|
|
"""# help="List the skills of the active tools"
|
|
}
|
|
cmd sync help="Link the active tools' skills where an agent looks for them" effect=write {
|
|
long_help #"""
|
|
Link the active tools' skills where an agent looks for them
|
|
|
|
Writes one symlink per skill into DIR, named after the skill and pointing
|
|
at the directory of the version that is active here. DIR defaults to the
|
|
`skills.dir` setting, `.claude/skills`, under the project root: the
|
|
directory of the nearest mise config. Run it again after `mise use` changes
|
|
a version and the links follow, or set `skills.auto_sync` to have mise do
|
|
that after every install and `mise use`.
|
|
|
|
mise replaces only the links it made, which point into its installs
|
|
directory, and removes them only with --prune or the `skills.prune` setting.
|
|
A real directory or a link of your own at a skill's name is left alone and
|
|
reported.
|
|
"""#
|
|
flag --dir help="The directory to link skills into" {
|
|
arg <DIR>
|
|
}
|
|
flag "-g --global" help="Link into the skills.dir directory under your home directory instead of the project's" conflicts=--dir {
|
|
long_help #"""
|
|
Link into the skills.dir directory under your home directory instead of the project's
|
|
|
|
With the default skills.dir, that is ~/.claude/skills.
|
|
"""#
|
|
}
|
|
flag --prune help="Remove links mise made for skills that are no longer active"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise skills sync" help="Link skills into the project's skills.dir (default .claude/skills)"
|
|
example "mise skills sync --dir .agents/skills --prune" help="Link into .agents/skills and remove links for skills that are no longer active"
|
|
complete dir type=dir
|
|
}
|
|
}
|
|
cmd sponsors help="Show the companies sponsoring mise and the jdx.dev open source tools" effect=read {
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
cmd sync subcommand_required=#true help="Use tool versions installed by other version managers" effect=read {
|
|
long_help #"""
|
|
Use tool versions installed by other version managers
|
|
|
|
Links node versions from nvm, nodenv, or Homebrew, python versions from pyenv
|
|
or uv, and ruby versions from Homebrew into mise, so `mise use` can select
|
|
them without reinstalling.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd node help="Symlink node versions installed by nvm, nodenv, or Homebrew into mise" effect=write {
|
|
long_help #"""
|
|
Symlink node versions installed by nvm, nodenv, or Homebrew into mise
|
|
|
|
Use this to make versions installed by another version manager available to
|
|
mise. It does not overwrite managed installs, runtime aliases, or links from
|
|
other providers. Pass one or more of --brew, --nodenv, and --nvm.
|
|
"""#
|
|
flag --brew help="Get tool versions from Homebrew"
|
|
flag --nodenv help="Get tool versions from nodenv"
|
|
flag --nvm help="Get tool versions from nvm"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
group sync-node-type "--brew" "--nodenv" "--nvm" required=#true multiple=#true
|
|
example #"""
|
|
brew install node@24
|
|
mise sync node --brew
|
|
mise use -g node@24
|
|
"""# help="Use the node that Homebrew installed"
|
|
}
|
|
cmd python help="Symlink python versions installed by pyenv or uv into mise" effect=write {
|
|
long_help #"""
|
|
Symlink python versions installed by pyenv or uv into mise
|
|
|
|
Use this to make versions installed by another version manager available to
|
|
mise. It does not overwrite managed installs, runtime aliases, or links from
|
|
other providers. With --uv, it also links mise's python versions into uv.
|
|
Pass --pyenv, --uv, or both; with neither, nothing is linked.
|
|
"""#
|
|
flag --pyenv help="Get tool versions from pyenv"
|
|
flag --uv help="Link uv's python versions into mise and mise's python versions into uv"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example #"""
|
|
pyenv install 3.13.0
|
|
mise sync python --pyenv
|
|
mise use -g python@3.13.0
|
|
"""# help="Use a python that pyenv installed"
|
|
example #"""
|
|
uv python install 3.13.0
|
|
mise install python@3.12.0
|
|
mise sync python --uv
|
|
mise exec python@3.13.0 -- python -V
|
|
uv run -p 3.12.0 -- python -V
|
|
"""# help="Share python versions with uv in both directions"
|
|
}
|
|
cmd ruby help="Symlink ruby versions installed by Homebrew into mise" effect=write {
|
|
long_help #"""
|
|
Symlink ruby versions installed by Homebrew into mise
|
|
|
|
Use this to make versions installed by another version manager available to
|
|
mise. It does not overwrite managed installs, runtime aliases, or links from
|
|
other providers. Homebrew is the only source, so --brew is required. mise
|
|
links each ruby@X.Y directory under Homebrew's opt directory, not opt/ruby.
|
|
"""#
|
|
flag --brew help="Get tool versions from Homebrew" required=#true
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example #"""
|
|
brew install ruby@3.4
|
|
mise sync ruby --brew
|
|
mise ls ruby --installed
|
|
"""# help="Link the Homebrew ruby@3.4, then list it with the other installed versions"
|
|
}
|
|
}
|
|
cmd tasks help="Manage tasks" effect=read {
|
|
alias t task
|
|
long_help #"""
|
|
Manage tasks
|
|
|
|
With no subcommand, lists tasks like `mise tasks ls` and accepts the same flags. With a task name, shows that task like `mise tasks info`. To run a task, use `mise run`.
|
|
"""#
|
|
flag "-g --global" help="Only show global tasks" {
|
|
overrides "--local" "--no-global"
|
|
}
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag "-l --local" help="Deprecated alias for --no-global" {
|
|
long_help #"""
|
|
Deprecated alias for --no-global
|
|
|
|
Removed in mise 2027.7.0.
|
|
"""#
|
|
overrides "--global" "--no-global"
|
|
}
|
|
flag --no-global help="Only show non-global tasks" {
|
|
overrides "--global" "--local"
|
|
}
|
|
flag "-x --extended" help="Show all columns"
|
|
flag "-a --all" help="Include tasks from every project in the monorepo, not only the current directory's hierarchy"
|
|
flag --complete help="Display tasks for usage completion" hide=#true
|
|
flag --hidden help="Show hidden tasks"
|
|
flag --name-only help="Print only task names, one per line (for fzf and similar tools)" {
|
|
conflicts "--json" "--extended" "--usage"
|
|
}
|
|
flag --no-header help="Do not print the table header" {
|
|
alias "--no-headers" hide=#true
|
|
}
|
|
flag --sort help="Column to sort by (default: name)" {
|
|
arg <COLUMN> {
|
|
choices {
|
|
choice name
|
|
choice alias
|
|
choice description
|
|
choice source
|
|
}
|
|
}
|
|
}
|
|
flag --sort-order help="Sort direction (default: asc)" {
|
|
arg <SORT_ORDER> {
|
|
choices {
|
|
choice asc
|
|
choice desc
|
|
}
|
|
}
|
|
}
|
|
flag --usage hide=#true
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TASK]" help="Task to show, as `mise tasks info` does" required=#false
|
|
cmd add help="Add a task" effect=write {
|
|
long_help #"""
|
|
Add a task
|
|
|
|
Writes a `[tasks.<name>]` table to the nearest project config file and marks that file as trusted. See https://mise.jdx.dev/configuration.html#target-file-for-write-operations for how the file is chosen.
|
|
|
|
With `--file`, creates an executable script in the project's task directory (for example `mise-tasks/`) instead, and does not change any config file.
|
|
"""#
|
|
flag "-a --alias" help="Other names for the task" var=#true {
|
|
arg <ALIAS>
|
|
}
|
|
flag "-d --depends" help="Tasks to run before this one" var=#true {
|
|
arg <TASK>
|
|
}
|
|
flag "-D --dir" help="Run the task in a specific directory" {
|
|
arg <DIR>
|
|
}
|
|
flag "-f --file" help="Create a file task instead of a TOML task"
|
|
flag "-H --hide" help="Hide the task from `mise tasks` and completions"
|
|
flag "-q --quiet" help="Do not print the command before running"
|
|
flag "-r --raw" help="Connect the task directly to the terminal's stdin, stdout, and stderr"
|
|
flag "-s --sources" help="Glob patterns of files this task uses as input" var=#true {
|
|
arg <GLOB>
|
|
}
|
|
flag "-w --wait-for" help="Wait for these tasks to finish if they are also being run" var=#true {
|
|
arg <TASK>
|
|
}
|
|
flag --depends-post help="Tasks to run after this one" var=#true {
|
|
arg <TASK>
|
|
}
|
|
flag --description help="Description of the task" {
|
|
arg <DESCRIPTION>
|
|
}
|
|
flag --outputs help="Glob patterns of files this task creates, used to skip it when they are up to date" var=#true {
|
|
arg <GLOB>
|
|
}
|
|
flag --run-windows help="Command to run on Windows (TOML tasks only; ignored with `--file`)" {
|
|
arg <COMMAND>
|
|
}
|
|
flag --shell help="Run the task in a specific shell" {
|
|
arg <SHELL>
|
|
}
|
|
flag --silent help="Do not print the command or its output"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <TASK> help="Name of the task to add"
|
|
arg "[-- RUN]…" help="Command to run, given after `--`" required=#false var=#true
|
|
example "mise tasks add build --description \"Build the app\" --sources 'src/**/*.ts' --outputs 'dist/**' -- npm run build" help="Add a TOML task that is skipped while its outputs are up to date"
|
|
example "mise tasks add --file lint -- eslint ." help="Create an executable lint script in the task directory"
|
|
example "mise tasks add ci --depends lint --depends test -- echo done" help="Add a task that runs after lint and test"
|
|
}
|
|
cmd deps help="Show the dependency tree of tasks" effect=read {
|
|
long_help #"""
|
|
Show the dependency tree of tasks
|
|
|
|
The tree is built from declared dependencies: `depends`, `depends_post`, and `wait_for`. Task references inside a `run` or `run_windows` array (`{ task = "..." }` or `{ tasks = [...] }`) are execution steps, not graph edges, so they do not appear here. Those nested tasks still run, including their own `depends`.
|
|
"""#
|
|
flag --compact help="Collapse repeated dependencies after their first occurrence" conflicts=--dot
|
|
flag --dot help="Display dependencies in DOT format"
|
|
flag --hidden help="Show hidden tasks"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TASKS]…" help="Tasks to show (default: all tasks)" required=#false var=#true
|
|
example "mise tasks deps" help="Show dependencies for all tasks"
|
|
example "mise tasks deps lint test check" help="Show dependencies for the \"lint\", \"test\" and \"check\" tasks"
|
|
example "mise tasks deps --dot" help="Show dependencies in DOT format"
|
|
example "mise tasks deps --compact" help="Collapse repeated dependencies"
|
|
}
|
|
cmd edit help="Open a task in your editor" effect=write {
|
|
long_help #"""
|
|
Open a task in your editor
|
|
|
|
Opens the file that defines the task in `$VISUAL` or `$EDITOR`: the script for a file task, or the config file for a TOML task. If no task has that name, mise creates an executable bash script for it in the project's task directory (for example `mise-tasks/`) and opens that. `--path` prints the file's path instead of opening it; a missing task is still created.
|
|
"""#
|
|
flag "-p --path" help="Print the task's file path instead of opening it"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <TASK> help="Task to edit"
|
|
example "mise tasks edit build" help="Edit the build task"
|
|
example "mise tasks edit --path build" help="Print the build task's file path"
|
|
}
|
|
cmd graph help="Show the monorepo project graph" effect=read {
|
|
long_help #"""
|
|
Show the monorepo project graph
|
|
|
|
Lists the projects mise infers from Cargo, uv, Go, Gradle, and Node.js workspace manifests, with each project's ID, root directory, dependencies, and metadata. `mise run --affected` uses this graph to decide which projects a change touches.
|
|
|
|
See https://mise.jdx.dev/tasks/workspace-graph.html
|
|
"""#
|
|
flag "-J --json" help="Output the project graph as JSON"
|
|
flag --explain help="Show which provider and workspace file each project, dependency, and task field came from" conflicts=--json
|
|
flag --no-header help="Do not print table headers" {
|
|
alias "--no-headers" hide=#true
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise tasks graph" help="List projects and their dependencies"
|
|
example "mise tasks graph --json" help="Print the project graph as JSON"
|
|
example "mise tasks graph --explain" help="Show which workspace file each project, dependency, and task came from"
|
|
}
|
|
cmd info help="Show a task's definition" effect=read {
|
|
long_help #"""
|
|
Show a task's definition
|
|
|
|
Prints the task's description, source file, dependencies, sources, outputs, run commands, environment, and usage spec. `--json` prints the full definition.
|
|
"""#
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <TASK> help="Name of the task to get information about"
|
|
example "mise tasks info test" help="Show the test task and the file that defines it"
|
|
example "mise tasks info test --json" help="Get the full structured task definition"
|
|
}
|
|
cmd ls help="List available tasks" effect=read {
|
|
long_help #"""
|
|
List available tasks
|
|
|
|
Lists tasks from `[tasks]` in your config files and from task directories such as `mise-tasks/`, `.mise-tasks/`, and `.mise/tasks/`, including global tasks in `~/.config/mise/tasks/`. Tasks from parent directories and the global config are included; a project task overrides a global task with the same name. In a monorepo, `--all` also lists tasks from sibling projects.
|
|
|
|
See https://mise.jdx.dev/tasks/task-discovery.html
|
|
"""#
|
|
after_long_help "\u{1b}[1m\u{1b}[4mDeprecation:\u{1b}[22m\u{1b}[24m\n\nThe `-l` and `--local` flags are deprecated in favor of `--no-global`. mise warns about\nthem from 2027.1.0 and removes them in 2027.7.0."
|
|
flag "-g --global" help="Only show global tasks" {
|
|
overrides "--local" "--no-global"
|
|
}
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag "-l --local" help="Deprecated alias for --no-global" {
|
|
long_help #"""
|
|
Deprecated alias for --no-global
|
|
|
|
Removed in mise 2027.7.0.
|
|
"""#
|
|
overrides "--global" "--no-global"
|
|
}
|
|
flag --no-global help="Only show non-global tasks" {
|
|
overrides "--global" "--local"
|
|
}
|
|
flag "-x --extended" help="Show all columns"
|
|
flag "-a --all" help="Include tasks from every project in the monorepo, not only the current directory's hierarchy"
|
|
flag --complete help="Display tasks for usage completion" hide=#true
|
|
flag --hidden help="Show hidden tasks"
|
|
flag --name-only help="Print only task names, one per line (for fzf and similar tools)" {
|
|
conflicts "--json" "--extended" "--usage"
|
|
}
|
|
flag --no-header help="Do not print the table header" {
|
|
alias "--no-headers" hide=#true
|
|
}
|
|
flag --sort help="Column to sort by (default: name)" {
|
|
arg <COLUMN> {
|
|
choices {
|
|
choice name
|
|
choice alias
|
|
choice description
|
|
choice source
|
|
}
|
|
}
|
|
}
|
|
flag --sort-order help="Sort direction (default: asc)" {
|
|
arg <SORT_ORDER> {
|
|
choices {
|
|
choice asc
|
|
choice desc
|
|
}
|
|
}
|
|
}
|
|
flag --usage hide=#true
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example "mise tasks ls" help="List tasks"
|
|
example "mise tasks ls --hidden" help="Include hidden tasks"
|
|
example "mise tasks ls --all" help="List tasks from every monorepo project"
|
|
example "mise tasks ls --name-only | fzf" help="Pick a task name interactively"
|
|
}
|
|
cmd run hide=#true disable_help_flag=#true restart_token=::: help="Run tasks; an alias for `mise run`" unknown_flags=value {
|
|
alias r
|
|
long_help #"""
|
|
Run tasks; an alias for `mise run`
|
|
|
|
Takes the same arguments and flags as `mise run`. See `mise run --help` or https://mise.jdx.dev/cli/run.html for the full reference.
|
|
"""#
|
|
flag --affected help="Run matching tasks only in projects affected by Git changes" {
|
|
long_help #"""
|
|
Run matching tasks only in projects affected by Git changes
|
|
|
|
Counts committed changes between the base and head revisions, plus staged, unstaged, and untracked changes in the working tree when the head revision is the checked-out commit. Requires a monorepo root (`monorepo_root = true`).
|
|
"""#
|
|
}
|
|
flag --affected-base help="Git base revision for `--affected`" requires=--affected {
|
|
long_help #"""
|
|
Git base revision for `--affected`
|
|
|
|
Defaults to `MISE_AFFECTED_BASE`, CI metadata, or `HEAD~1`.
|
|
"""#
|
|
arg <REV>
|
|
}
|
|
flag --affected-committed help="Count committed changes between the base and head revisions" requires=--affected {
|
|
long_help #"""
|
|
Count committed changes between the base and head revisions
|
|
|
|
Alone, ignores the working tree. Combines with `--affected-uncommitted` and `--affected-untracked`. With none of the three, every source counts (the working-tree sources only when the head revision is the checked-out commit). Also set by `MISE_AFFECTED_COMMITTED`.
|
|
"""#
|
|
}
|
|
flag --affected-explain help="Explain why `--affected` selected each project and task" conflicts=--affected-json requires=--affected
|
|
flag --affected-head help="Git head revision for `--affected`" requires=--affected {
|
|
long_help #"""
|
|
Git head revision for `--affected`
|
|
|
|
Defaults to `MISE_AFFECTED_HEAD`, CI metadata, or `HEAD`.
|
|
"""#
|
|
arg <REV>
|
|
}
|
|
flag --affected-json help="Print the affected projects and tasks as JSON without running tasks" conflicts=--affected-explain requires=--affected
|
|
flag --affected-uncommitted help="Count staged and unstaged changes to tracked files" requires=--affected {
|
|
long_help #"""
|
|
Count staged and unstaged changes to tracked files
|
|
|
|
Combines with the other source flags. Alone, ignores committed changes. Needs the head revision to be the current checkout. Also set by `MISE_AFFECTED_UNCOMMITTED`.
|
|
"""#
|
|
}
|
|
flag --affected-untracked help="Count untracked files that Git does not ignore" requires=--affected {
|
|
long_help #"""
|
|
Count untracked files that Git does not ignore
|
|
|
|
Combines with the other source flags. Alone, ignores committed changes. Needs the head revision to be the current checkout. Also set by `MISE_AFFECTED_UNTRACKED`.
|
|
"""#
|
|
}
|
|
flag --all help="Open the task picker with tasks from every project in the monorepo" conflicts=--affected
|
|
flag "-c --continue-on-error" help="Continue running tasks even if one fails"
|
|
flag "-C --cd" help="Change to this directory before running the tasks" {
|
|
arg <DIR>
|
|
}
|
|
flag "-f --force" help="Run the tasks even if their outputs are up to date"
|
|
flag "-j --jobs" help="Number of tasks to run in parallel (default: the `jobs` setting)" env=MISE_JOBS {
|
|
long_help #"""
|
|
Number of tasks to run in parallel (default: the `jobs` setting)
|
|
|
|
Values below 1 are treated as 1.
|
|
"""#
|
|
arg <JOBS>
|
|
}
|
|
flag "-n --dry-run" help="Print the tasks in the order they would run, without running them"
|
|
flag "-o --output" help="How task output is displayed" env=MISE_TASK_OUTPUT {
|
|
long_help #"""
|
|
How task output is displayed
|
|
|
|
- `prefix` - Print stdout/stderr by line, prefixed with the task's label
|
|
- `interleave` - Print directly to stdout/stderr instead of by line
|
|
- `replacing` - Stdout is replaced each time, stderr is printed as is
|
|
- `timed` - Only show stdout lines if they are displayed for more than 1 second
|
|
- `keep-order` - Print stdout/stderr by line, prefixed with the task's label, but keep the order of the output
|
|
- `quiet` - Deprecated; use `--output interleave --quiet`
|
|
- `silent` - Do not show any output, including the task's stdout and stderr, except errors
|
|
"""#
|
|
arg <OUTPUT>
|
|
}
|
|
flag "-q --quiet" help="Do not show extra output" env=MISE_QUIET
|
|
flag "-r --raw" help="Connect the tasks directly to stdin, stdout, and stderr instead of reading their output by line" {
|
|
long_help #"""
|
|
Connect the tasks directly to stdin, stdout, and stderr instead of reading their output by line
|
|
|
|
Redactions are not applied, and tasks run one at a time. Set the `raw` setting to make this the default.
|
|
"""#
|
|
}
|
|
flag --secrets help="[experimental] Give the named tasks these secrets (comma-separated); their dependencies and subtasks do not get them" var=#true conflicts=--affected {
|
|
long_help #"""
|
|
[experimental] Give the named tasks these secrets (comma-separated); their dependencies and subtasks do not get them
|
|
|
|
Put this flag before the task name. Not allowed in safe mode.
|
|
"""#
|
|
arg <SECRET> delimiter=,
|
|
}
|
|
flag --secrets-all help="[experimental] Give the named tasks every secret the project can inject; their dependencies and subtasks do not get them" {
|
|
long_help #"""
|
|
[experimental] Give the named tasks every secret the project can inject; their dependencies and subtasks do not get them
|
|
|
|
Covers the fnox secrets with `env = true` or `env = "exec"`, never those with `env = false`. Put this flag before the task name. Not allowed in safe mode.
|
|
"""#
|
|
conflicts "--secrets" "--affected"
|
|
}
|
|
flag "-s --shell" help="Shell used to run TOML tasks that do not set their own `shell`" {
|
|
long_help #"""
|
|
Shell used to run TOML tasks that do not set their own `shell`
|
|
|
|
Defaults to `sh -o errexit -c` on Unix and `cmd /c` on Windows, from the `unix_default_inline_shell_args` or `windows_default_inline_shell_args` setting. A task's `shell` property takes precedence over this flag.
|
|
"""#
|
|
arg <SHELL>
|
|
}
|
|
flag "-S --silent" help="Do not show any output except for errors" env=MISE_SILENT
|
|
flag "-t --tool" help="Extra tools to use with the tasks, e.g. node@24 python@3.13" var=#true {
|
|
arg <TOOL@VERSION>
|
|
}
|
|
flag --allow-env help="Allow a specific env var through (implies `--deny-env` for everything else)" var=#true {
|
|
long_help #"""
|
|
Allow a specific env var through (implies `--deny-env` for everything else)
|
|
|
|
Supports wildcards, such as `--allow-env='MYAPP_*'`.
|
|
"""#
|
|
arg <VAR>
|
|
}
|
|
flag --allow-net help="Allow network access only to HOST (not supported on any platform)" var=#true {
|
|
long_help #"""
|
|
Allow network access only to HOST (not supported on any platform)
|
|
|
|
Per-host filtering does not work: Linux and macOS exit with an error, and Windows runs the task without network restrictions. See https://mise.jdx.dev/sandboxing.html#access-to-particular-hosts
|
|
"""#
|
|
arg <HOST>
|
|
}
|
|
flag --allow-read help="Allow reads from a specific path (implies `--deny-read` for everything else)" var=#true {
|
|
arg <PATH>
|
|
}
|
|
flag --allow-write help="Allow writes to a specific path (implies `--deny-write` for everything else)" var=#true {
|
|
arg <PATH>
|
|
}
|
|
flag --deny-all help="Block reads, writes, network, and env vars"
|
|
flag --deny-env help="Block env var inheritance except PATH, HOME, USER, SHELL, TERM, COLORTERM, and LANG" {
|
|
long_help #"""
|
|
Block env var inheritance except PATH, HOME, USER, SHELL, TERM, COLORTERM, and LANG
|
|
|
|
On Windows it also keeps the variables programs need to start, such as `SystemRoot` and `TEMP`.
|
|
"""#
|
|
}
|
|
flag --deny-net help="Block all network access"
|
|
flag --deny-read help="Block filesystem reads (system libraries and tool directories stay readable)"
|
|
flag --deny-write help="Block filesystem writes except temporary and device paths (/tmp, /dev)"
|
|
flag --fresh-env help="Bypass the environment cache and recompute the environment"
|
|
flag --no-cache help="Do not use the cache for remote tasks" env=MISE_TASK_REMOTE_NO_CACHE
|
|
flag --no-deps help="Do not run `[deps]` providers that have `auto = true` before the tasks"
|
|
flag --no-timings help="Hide the elapsed time printed after each task completes" {
|
|
alias "--no-timing" hide=#true
|
|
long_help #"""
|
|
Hide the elapsed time printed after each task completes
|
|
|
|
Set `task.timings = false` to hide it by default.
|
|
"""#
|
|
}
|
|
flag --skip-deps help="Run only the named tasks, not the tasks they depend on" env=MISE_TASK_SKIP_DEPENDS
|
|
flag --skip-tools help="Do not install missing tools before running the tasks" {
|
|
long_help #"""
|
|
Do not install missing tools before running the tasks
|
|
|
|
Set `task.run_auto_install = false` to make this the default.
|
|
"""#
|
|
}
|
|
flag --task-cache help="[experimental] Set artifact cache access for this run" env=MISE_TASK_CACHE default=read-write {
|
|
long_help #"""
|
|
[experimental] Set artifact cache access for this run
|
|
|
|
- `read-write` - Read cached results and write new results
|
|
- `read-only` - Read cached results without writing new results
|
|
- `write-only` - Write new results without reading cached results
|
|
- `off` - Disable the artifact cache
|
|
- `local-only` - Read and write only the local cache, skipping any remote cache
|
|
"""#
|
|
arg <TASK_CACHE> {
|
|
choices {
|
|
choice read-write help="Read cached results and write new results."
|
|
choice read-only help="Read cached results without writing new results."
|
|
choice write-only help="Write new results without reading cached results."
|
|
choice off help="Disable task output caching for this run."
|
|
choice local-only help="Read and write only the local cache."
|
|
}
|
|
}
|
|
}
|
|
flag --task-cache-explain help="[experimental] Explain the inputs that produced each task's artifact cache key"
|
|
flag --task-cache-explain-json help="[experimental] Print cache-key input details as JSON Lines without running tasks (requires `--dry-run`)" conflicts=--task-cache-explain requires=--dry-run
|
|
flag --task-cache-stats help="[experimental] Report artifact cache hits, restored bytes, and time saved" conflicts=--dry-run
|
|
flag --timeout help="Stop the run if it takes longer than this, e.g. 30s or 5m" {
|
|
long_help #"""
|
|
Stop the run if it takes longer than this, e.g. 30s or 5m
|
|
|
|
Overrides the `task.timeout` setting.
|
|
"""#
|
|
arg <TIMEOUT>
|
|
}
|
|
flag --timings help="Show the elapsed time after each task completes" hide=#true {
|
|
alias "--timing" hide=#true
|
|
long_help #"""
|
|
Show the elapsed time after each task completes
|
|
|
|
Set `task.timings = true` to show it by default.
|
|
"""#
|
|
}
|
|
mount run="mise tasks --usage" synopsis="[TASK] [ARGS]…"
|
|
example "mise run lint" help="Run the \"lint\" task, defined in mise.toml or as a script"
|
|
example "mise run --force build" help="Run \"build\" even if its outputs are up to date"
|
|
example "mise run --raw test" help="Run \"test\" connected directly to the terminal, one task at a time"
|
|
example "mise run lint ::: test ::: check" help="Run the \"lint\", \"test\", and \"check\" tasks in parallel"
|
|
example "mise run cmd1 arg1 arg2 ::: cmd2 arg1 arg2" help="Run several tasks, each with its own arguments"
|
|
example "mise run -j 1 lint ::: test" help="Run tasks one at a time"
|
|
example "mise run 'test:*'" help="Run every task that matches a pattern"
|
|
example "mise run //services/api:build" help="Run a task in a monorepo project"
|
|
example "mise run --secrets DEPLOY_KEY deploy" help="Give \"deploy\" the DEPLOY_KEY secret (experimental); its dependencies do not get it"
|
|
complete dir type=dir
|
|
}
|
|
cmd validate help="Check task definitions for errors" effect=read {
|
|
long_help #"""
|
|
Check task definitions for errors
|
|
|
|
Checks each task for dependency cycles; references to tasks that do not exist; `#USAGE` specs that do not parse; invalid `timeout` values; aliases that more than one task uses; missing or non-executable file tasks; invalid `dir` paths and templates; missing shell executables; invalid `sources` and `outputs` globs; broken task references in `run` arrays, empty scripts, and tasks with nothing to run; required `daemons` that no readable `[daemons]` section declares; and `secrets` grants that conflict with the sandbox or `[env]`, or, when the config is trusted, that name keys missing from the secrets source.
|
|
|
|
Exits 1 if any error is found, so you can run it in CI. Warnings are reported but do not fail the command.
|
|
"""#
|
|
flag --errors-only help="Only show errors (skip warnings)"
|
|
flag --json help="Output validation results in JSON format"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TASKS]…" help="Tasks to validate (default: all tasks)" required=#false var=#true
|
|
example "mise tasks validate" help="Validate all tasks"
|
|
example "mise tasks validate build test" help="Validate specific tasks"
|
|
example "mise tasks validate --json" help="Output results as JSON"
|
|
example "mise tasks validate --errors-only" help="Only show errors (skip warnings)"
|
|
}
|
|
example "mise tasks" help="List tasks"
|
|
example "mise tasks build" help="Show the build task"
|
|
example "mise tasks --hidden --sort source" help="Include hidden tasks, sorted by source"
|
|
}
|
|
cmd test-tool help="Test that a tool installs and runs" {
|
|
long_help #"""
|
|
Test that a tool installs and runs
|
|
|
|
Installs each tool and runs the `test` command from its registry entry
|
|
(registry/<tool>.toml), checking the output. Use it when adding or changing
|
|
a registry entry. The minimum release age is ignored so that new releases
|
|
can be tested right away.
|
|
|
|
Warning: before testing, this deletes every installed version of each tested
|
|
tool, along with its cache and downloads directories, so the test installs
|
|
from scratch. To keep your installs and caches, run it with throwaway
|
|
MISE_DATA_DIR and MISE_CACHE_DIR directories.
|
|
|
|
Registry tools with no `test` entry, or that registry/ marks as unsupported
|
|
on this OS, are skipped without output, and the command still exits 0. Pass
|
|
--include-non-defined to run `<tool> --version` for tools with no `test`
|
|
entry.
|
|
"""#
|
|
flag "-a --all" help="Test every registry tool that defines a `test` and supports this OS" {
|
|
conflicts TOOLS "--all-config"
|
|
}
|
|
flag "-j --jobs" help="Number of tools to test in parallel (default 4)" env=MISE_TEST_TOOL_JOBS {
|
|
arg <JOBS>
|
|
}
|
|
flag --all-config help="Test all tools specified in config files" {
|
|
conflicts TOOLS "--all"
|
|
}
|
|
flag --include-non-defined help="Also test registry tools that have no `test` entry by running `<tool> --version`" {
|
|
long_help #"""
|
|
Also test registry tools that have no `test` entry by running `<tool> --version`
|
|
|
|
These always report a failure that shows the output, for use when writing a test.
|
|
"""#
|
|
}
|
|
flag --raw help="Connect the install commands' stdin, stdout, and stderr to the terminal" overrides=--jobs {
|
|
long_help #"""
|
|
Connect the install commands' stdin, stdout, and stderr to the terminal
|
|
|
|
Implies `--jobs=1`.
|
|
"""#
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TOOLS]…" help="Tools to test" required=#false var=#true {
|
|
required_unless "--all" "--all-config"
|
|
}
|
|
example "mise test-tool ripgrep" help="Reinstall ripgrep and run its registry test"
|
|
example "MISE_DATA_DIR=$(mktemp -d) MISE_CACHE_DIR=$(mktemp -d) mise test-tool --all-config" help="Test every tool in the config without touching your installs"
|
|
}
|
|
cmd token subcommand_required=#true help="Show which Git provider token mise uses" effect=read {
|
|
long_help #"""
|
|
Show which Git provider token mise uses
|
|
|
|
Shows the token mise would send to a GitHub, GitLab, or Forgejo host and
|
|
where it came from, to debug authentication.
|
|
See https://mise.jdx.dev/dev-tools/github-tokens.html
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
cmd forgejo help="Show the Forgejo token mise uses for a host" effect=read {
|
|
long_help #"""
|
|
Show the Forgejo token mise uses for a host
|
|
|
|
Shows the token and where it came from, to debug authentication. The token
|
|
is masked unless you pass --unmask.
|
|
"""#
|
|
flag --unmask help="Show the full unmasked token"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[HOST]" help="Forgejo hostname" required=#false default=codeberg.org
|
|
example #"""
|
|
mise token forgejo
|
|
codeberg.org: xxxx…xxxx (source: FORGEJO_TOKEN)
|
|
"""# help="Show the token for codeberg.org"
|
|
example #"""
|
|
mise token forgejo --unmask
|
|
codeberg.org: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (source: FORGEJO_TOKEN)
|
|
"""# help="Show the whole token"
|
|
example #"""
|
|
mise token forgejo forgejo.mycompany.com
|
|
forgejo.mycompany.com: (none)
|
|
"""# help="Check a self-hosted Forgejo instance"
|
|
}
|
|
cmd github help="Show the GitHub token mise uses for a host" effect=read {
|
|
long_help #"""
|
|
Show the GitHub token mise uses for a host
|
|
|
|
Shows the token and where it came from, to debug authentication. The token
|
|
is masked unless you pass --unmask or --raw.
|
|
"""#
|
|
flag --git-credential help="Speak Git's credential helper protocol" hide=#true {
|
|
arg <GIT_CREDENTIAL>
|
|
}
|
|
flag --oauth help="Use only native GitHub OAuth (a cached token, a refresh, or the device-code flow), ignoring other token sources"
|
|
flag --raw help="Print only the token, unmasked, for use in scripts"
|
|
flag --refresh help="With --oauth, get a new OAuth token even if the cached one has not expired, through the refresh-token grant or a new device-code flow. Use it after changing the GitHub App's installations or permissions: cached tokens keep their original access until they expire." requires=--oauth
|
|
flag --unmask help="Show the full unmasked token"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[HOST]" help="GitHub hostname" required=#false default=github.com
|
|
example #"""
|
|
mise token github
|
|
github.com: ghp_…xxxx (source: GITHUB_TOKEN)
|
|
"""# help="Show the token for github.com"
|
|
example #"""
|
|
mise token github --unmask
|
|
github.com: ghp_xxxxxxxxxxxx (source: GITHUB_TOKEN)
|
|
"""# help="Show the whole token"
|
|
example #"""
|
|
mise token github github.mycompany.com
|
|
github.mycompany.com: (none)
|
|
"""# help="Check a GitHub Enterprise host"
|
|
example #"""
|
|
mise token github --oauth --refresh
|
|
github.com: gho_…xxxx (source: GitHub OAuth)
|
|
"""# help="Get a new token through native GitHub OAuth"
|
|
example "GH_TOKEN=$(mise token github --raw) gh api user" help="Pass the resolved token to another tool"
|
|
}
|
|
cmd gitlab help="Show the GitLab token mise uses for a host" effect=read {
|
|
long_help #"""
|
|
Show the GitLab token mise uses for a host
|
|
|
|
Shows the token and where it came from, to debug authentication. The token
|
|
is masked unless you pass --unmask.
|
|
"""#
|
|
flag --unmask help="Show the full unmasked token"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[HOST]" help="GitLab hostname" required=#false default=gitlab.com
|
|
example #"""
|
|
mise token gitlab
|
|
gitlab.com: glpa…xxxx (source: GITLAB_TOKEN)
|
|
"""# help="Show the token for gitlab.com"
|
|
example #"""
|
|
mise token gitlab --unmask
|
|
gitlab.com: glpat-xxxxxxxxxxxx (source: GITLAB_TOKEN)
|
|
"""# help="Show the whole token"
|
|
example #"""
|
|
mise token gitlab gitlab.mycompany.com
|
|
gitlab.mycompany.com: (none)
|
|
"""# help="Check a self-managed GitLab instance"
|
|
}
|
|
}
|
|
cmd tool help="Show information about a tool" effect=read {
|
|
long_help #"""
|
|
Show information about a tool
|
|
|
|
Shows the tool's backend, its description and project URL when known, the
|
|
installed, active, and requested versions, the config file that requests it,
|
|
its tool options, and the backend's security features. Pass a field flag
|
|
such as `--backend` to print one field, or `--json` for all of them.
|
|
"""#
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --active help="Only show active versions"
|
|
flag --backend help="Only show backend field"
|
|
flag --config-source help="Only show config source"
|
|
flag --description help="Only show description field"
|
|
flag --installed help="Only show installed versions"
|
|
flag --requested help="Only show requested versions"
|
|
flag --tool-options help="Only show tool options"
|
|
flag --url help="Only show the project URL from the registry"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <TOOL> help="The tool, such as `node` or `aqua:jqlang/jq`"
|
|
group tool-info-filter "--active" "--backend" "--config-source" "--description" "--installed" "--requested" "--tool-options" "--url"
|
|
example #"""
|
|
mise tool node
|
|
Backend: core:node
|
|
Installed Versions: 22.0.0 24.0.0
|
|
Active Version: 24.0.0
|
|
Requested Version: 24
|
|
Config Source: ~/.config/mise/config.toml
|
|
Tool Options: [none]
|
|
Security: checksum (sha256), gpg
|
|
"""# help="Show everything mise knows about node"
|
|
example #"""
|
|
mise tool node --backend
|
|
core:node
|
|
"""# help="Print only the backend"
|
|
}
|
|
cmd tool-stub disable_help_flag=#true disable_version_flag=#true help="Run a tool stub file" {
|
|
long_help #"""
|
|
Run a tool stub file
|
|
|
|
A tool stub is an executable file whose shebang is
|
|
`#!/usr/bin/env -S mise tool-stub` and whose body is TOML naming a tool,
|
|
version, and executable. Running the stub runs this command, which installs
|
|
the tool if needed and runs it with the stub's arguments. You rarely call it
|
|
directly; create stubs with `mise generate tool-stub`.
|
|
|
|
```toml
|
|
#!/usr/bin/env -S mise tool-stub
|
|
# Node.js 24
|
|
|
|
tool = "node"
|
|
version = "24"
|
|
bin = "node"
|
|
```
|
|
|
|
See https://mise.jdx.dev/dev-tools/tool-stubs.html
|
|
"""#
|
|
arg <FILE> help="Path to the TOML tool stub file to execute" help_long=#"""
|
|
Path to the TOML tool stub file to execute
|
|
|
|
Every field is optional: `version` defaults to `latest`, `tool` defaults to the stub's file name (or `http:<file name>` when the stub sets `url` or platform URLs), and `bin` defaults to the stub's file name. A stub can also set backend-specific options.
|
|
"""# double_dash=automatic
|
|
arg "[ARGS]…" help="Arguments to pass to the tool" help_long=#"""
|
|
Arguments to pass to the tool
|
|
|
|
Every argument after the stub path is passed to the tool unchanged, including a literal `--`.
|
|
"""# required=#false double_dash=automatic var=#true
|
|
}
|
|
cmd trust help="Mark a config file as trusted" effect=write {
|
|
long_help #"""
|
|
Mark a config file as trusted
|
|
|
|
Trust lets mise load the parts of a config file that can run code or change
|
|
your environment. Without it, mise prompts, skips the file, or fails with an
|
|
untrusted-config error when it cannot prompt.
|
|
|
|
A file with no template syntax that contains only `min_version`, `[tools]`
|
|
entries with plain version strings (or arrays of them), and `[tasks]` in
|
|
which no task lists `secrets` does not need trust unless paranoid mode is on.
|
|
Commands that run project code (`mise run`, task shorthand such as
|
|
`mise build`, `mise install`, `mise exec`, `mise watch`, and
|
|
`mise daemons start|restart|register`) trust their active config
|
|
automatically.
|
|
|
|
In paranoid mode, `mise trust` with no path also trusts the env files and
|
|
scripts that config reads (`env._.file`, `env._.source` and the `env_file`
|
|
setting), which have trust of their own. Give a file's path to trust only
|
|
that file.
|
|
|
|
Trusting a config file in a repository's main checkout also trusts the same
|
|
path in its git worktrees. Paranoid mode (https://mise.jdx.dev/paranoid.html)
|
|
turns off automatic and worktree trust and requires trust, tied to the
|
|
file's contents, for every config outside the global and system config.
|
|
See https://mise.jdx.dev/security.html#configuration-trust
|
|
"""#
|
|
flag "-a --all" help="Trust all config files in the current directory, its parents, and its subdirectories" {
|
|
long_help #"""
|
|
Trust all config files in the current directory, its parents, and its subdirectories
|
|
|
|
Subdirectories are walked respecting .gitignore, skipping hidden directories and common build and dependency directories (node_modules, vendor, target, dist, build).
|
|
"""#
|
|
conflicts "--ignore" "--untrust"
|
|
}
|
|
flag --ignore help="Do not trust this config and ignore it in the future" conflicts=--untrust
|
|
flag --show help="Show the trust status of config files in the current directory and its parents" {
|
|
long_help #"""
|
|
Show the trust status of config files in the current directory and its parents
|
|
|
|
Does not trust or untrust any files.
|
|
"""#
|
|
}
|
|
flag --untrust help="Remove explicit trust for this config"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[CONFIG_FILE]" help="The config file whose trust status to change" required=#false
|
|
example "mise trust" help="Trust the nearest untrusted config in this directory or a parent, and in paranoid mode the env files it reads"
|
|
example "mise trust ~/src/app/mise.toml" help="Trust a specific file"
|
|
example "mise trust --show" help="List configs here and above with their trust status"
|
|
complete config_file type=path
|
|
}
|
|
cmd uninstall help="Remove installed tool versions" effect=destructive {
|
|
long_help #"""
|
|
Remove installed tool versions
|
|
|
|
Removes installed versions but does not edit mise.toml. Use `mise unuse` to
|
|
remove a tool from mise.toml and uninstall it. A tool name or version prefix,
|
|
such as `node` or `node@22`, must match exactly one installed version unless
|
|
you pass `--all`.
|
|
|
|
`--project` removes the installed versions that the project's own config files
|
|
request. Installs are shared by every project, so other projects that use the
|
|
same versions have to install them again.
|
|
"""#
|
|
flag "-a --all" help="Remove every installed version of the named tools, or of every tool when none is named"
|
|
flag --project help="Remove the installed versions the nearest project config requests" {
|
|
long_help #"""
|
|
Remove the installed versions the nearest project config requests
|
|
|
|
The project is the nearest directory, starting at the current one and moving up, that has a mise config file. Every config file in that directory counts, such as `mise.toml`, `mise.local.toml`, `conf.d` fragments, `.tool-versions` and idiomatic version files. Configs in parent directories and global or system configs do not. Every version those files name is removed, including one that a later file overrides. Lists what it will remove and asks for confirmation unless `--yes` or a dry run is given. Tools set to a `path:` or `system` version are never removed.
|
|
"""#
|
|
conflicts "--all" INSTALLED_TOOL@VERSION
|
|
}
|
|
flag "-n --dry-run" help="Show what would change without changing anything"
|
|
flag --dry-run-code help="Like --dry-run, but exit with code 1 if there are tools to uninstall" {
|
|
long_help #"""
|
|
Like --dry-run, but exit with code 1 if there are tools to uninstall
|
|
|
|
Use it in scripts that check whether tools need uninstalling.
|
|
"""#
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[INSTALLED_TOOL@VERSION]…" help="Tools to remove, such as node@22.0.0" required=#false var=#true {
|
|
required_unless "--all" "--project"
|
|
}
|
|
example "mise uninstall node@22.0.0" help="Uninstall a specific version"
|
|
example "mise uninstall node" help="Uninstall node when exactly one version is installed"
|
|
example "mise uninstall --all node" help="Uninstall every installed version of node"
|
|
example "mise uninstall --project --dry-run" help="Preview the versions this project's config requests"
|
|
}
|
|
cmd unset help="Remove environment variables from mise.toml" effect=write {
|
|
long_help #"""
|
|
Remove environment variables from mise.toml
|
|
|
|
Edits the same file `mise set` writes: the lowest-precedence TOML file in the
|
|
nearest config directory, or the global config when run in your home
|
|
directory. Use `--global` or `--file` to pick another file.
|
|
"""#
|
|
flag "-f --file --path" help="The TOML file to edit instead of the default target" {
|
|
long_help #"""
|
|
The TOML file to edit instead of the default target
|
|
|
|
Can be a file or a directory. For a directory, mise uses the config file in it, or one named by MISE_DEFAULT_CONFIG_FILENAME (default `mise.toml`): https://mise.jdx.dev/configuration/settings.html#default_config_filename To move the global config file, set MISE_GLOBAL_CONFIG_FILE: https://mise.jdx.dev/configuration/settings.html#global_config_file
|
|
"""#
|
|
arg <FILE>
|
|
}
|
|
flag "-g --global" help="Use the global config file" overrides=--file
|
|
flag --override help="Use the global override file, `config.override.toml`" {
|
|
long_help #"""
|
|
Use the global override file, `config.override.toml`
|
|
|
|
See https://mise.jdx.dev/configuration.html#override-file
|
|
"""#
|
|
conflicts "--global" "--file"
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[ENV_KEY]…" help="Environment variables to remove, such as NODE_ENV" required=#false var=#true
|
|
example "mise unset NODE_ENV" help="Remove NODE_ENV from the project config"
|
|
example "mise unset -g NODE_ENV" help="Remove NODE_ENV from the global config"
|
|
complete file type=path
|
|
}
|
|
cmd untrust help="Remove explicit trust for a config" effect=write {
|
|
long_help #"""
|
|
Remove explicit trust for a config
|
|
|
|
mise asks again before loading the parts of the file that can run code. With
|
|
no file, untrusts the nearest config in this directory or a parent. Same as
|
|
`mise trust --untrust`.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[CONFIG_FILE]" help="The config file to untrust" required=#false
|
|
example "mise untrust ~/src/app/mise.toml" help="Stop trusting a specific file"
|
|
complete config_file type=path
|
|
}
|
|
cmd unuse help="Remove tool requests from config files and prune unused installations" effect=destructive {
|
|
alias rm remove
|
|
long_help #"""
|
|
Remove tool requests from config files and prune unused installations
|
|
|
|
Without `--path`, `--global`, or `--env`, mise edits the first loaded config
|
|
that declares one of the tools; in your home directory it edits the global
|
|
config. A version argument matches the configured request literally: to
|
|
remove `node = "20"`, use `mise unuse node@20`, not the installed version it
|
|
resolved to. Omit the version to remove every request for that tool from the
|
|
selected file.
|
|
|
|
The installed versions the arguments name are pruned only when no remaining
|
|
tracked config or tool stub needs them; mise says which file keeps one. A tool
|
|
named without a version has all of its unused versions pruned. Pass
|
|
`--no-prune` to edit the config and keep the installations. To remove an
|
|
installation without editing config, use `mise uninstall`.
|
|
"""#
|
|
flag "-e --env" help="Edit mise.<ENV>.toml in the current directory, or .mise.<ENV>.toml if that exists" {
|
|
long_help #"""
|
|
Edit mise.<ENV>.toml in the current directory, or .mise.<ENV>.toml if that exists
|
|
|
|
Not the same as the global -E, which only chooses which config files are loaded.
|
|
"""#
|
|
overrides "--global" "--path"
|
|
arg <ENV>
|
|
}
|
|
flag "-g --global" help="Use the global config file (`~/.config/mise/config.toml`) instead of the local one" {
|
|
overrides "--path" "--env"
|
|
}
|
|
flag "-p --path --file" help="Edit this config file, or the config file in this directory" {
|
|
overrides "--global" "--env"
|
|
arg <PATH>
|
|
}
|
|
flag --override help="Write to the global override file, `config.override.toml`" {
|
|
long_help #"""
|
|
Write to the global override file, `config.override.toml`
|
|
|
|
The override file outranks all project config. With `--env`, writes `config.<ENV>.override.toml` instead. See https://mise.jdx.dev/configuration.html#override-file
|
|
"""#
|
|
conflicts "--global" "--path"
|
|
}
|
|
flag --no-prune help="Do not also prune the installed version"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <INSTALLED_TOOL@VERSION>… help="Tools to remove from the config, with the version written as in the config" var=#true
|
|
example "mise unuse node@22.0.0" help="Remove node@22.0.0 from mise.toml and uninstall it if nothing else uses it"
|
|
example "mise unuse -g node@22.0.0" help="Remove it from the global config instead"
|
|
example "mise unuse --env staging node@20" help="Remove the node@20 request from mise.staging.toml"
|
|
complete path type=path
|
|
}
|
|
cmd upgrade help="Upgrade outdated tools" effect=write {
|
|
alias up
|
|
long_help #"""
|
|
Upgrade outdated tools
|
|
|
|
By default, keeps the range in mise.toml: with `node = "20"`, it installs the
|
|
newest 20.x release. Use `--bump` to upgrade to the newest release overall
|
|
and update the version in mise.toml. Also updates mise.lock when lockfiles
|
|
are enabled; see https://mise.jdx.dev/dev-tools/mise-lock.html
|
|
|
|
The version you upgraded from is removed after the `upgrade.prune_after`
|
|
setting's grace period unless a tracked config or tool stub still uses it.
|
|
Pass `--prune` to remove it now or `--no-prune` to keep it.
|
|
"""#
|
|
after_long_help "\u{1b}[1m\u{1b}[4mDeprecation:\u{1b}[22m\u{1b}[24m\n\nThe `-l` shorthand for `--bump` is deprecated and will be removed in mise 2027.8.5.\nUse `-b` or `--bump` instead.\n\nThe `--local` flag is deprecated in favor of `--no-global`. mise warns about it from\n2027.1.0 and removes it in 2027.7.0."
|
|
flag "-b --bump" help="Upgrade past the configured range to the newest release, and update the config to match" {
|
|
long_help #"""
|
|
Upgrade past the configured range to the newest release, and update the config to match
|
|
|
|
The config keeps its precision: `node = "20"` becomes `node = "22"`, and `node = "20.0.0"` becomes `node = "22.1.0"`. If you name a version on the command line (`node@latest`, `node@3`, or `node@prefix:3`), that request is written instead; `mise upgrade node@latest --bump` writes `latest`. With the `pin` setting on, a version request such as `node@3` is written as the version it resolved to, and a bare `mise upgrade --bump` writes the resolved version for every request that is not exact, such as `latest` or `20`. Requests that do not come from a config file mise can write, such as `MISE_NODE_VERSION`, are upgraded but not written.
|
|
"""#
|
|
}
|
|
flag --pin help="With --bump, write the resolved version instead of keeping the request's precision" requires=--bump {
|
|
long_help #"""
|
|
With --bump, write the resolved version instead of keeping the request's precision
|
|
|
|
`node = "latest"` and `node = "20"` become `node = "24.14.0"`. A named request such as `node@3` is written as the version it resolved to. Make this the default with the `pin` setting (`MISE_PIN=1`).
|
|
"""#
|
|
}
|
|
flag "-i --interactive" help="Choose which tools to upgrade from a multiselect menu" conflicts=INSTALLED_TOOL@VERSION
|
|
flag "-j --jobs" help="Number of jobs to run in parallel (default: the `jobs` setting)" env=MISE_JOBS {
|
|
arg <JOBS>
|
|
}
|
|
flag -l help="Deprecated shorthand for --bump" hide=#true
|
|
flag "-n --dry-run" help="Show what would change without changing anything"
|
|
flag "-x --exclude" help="Tools to exclude from upgrading, such as go python" var=#true {
|
|
arg <INSTALLED_TOOL>
|
|
}
|
|
flag --dry-run-code help="Like --dry-run, but exit with code 1 if there are outdated tools" {
|
|
long_help #"""
|
|
Like --dry-run, but exit with code 1 if there are outdated tools
|
|
|
|
Use it in scripts that check whether tools need upgrading.
|
|
"""#
|
|
}
|
|
flag --inactive help="Also upgrade installed tools that the current config does not request" {
|
|
conflicts "--local" "--no-global"
|
|
}
|
|
flag --global help="Only upgrade tools defined in the global config" {
|
|
long_help #"""
|
|
Only upgrade tools defined in the global config
|
|
|
|
Upgrades the requests in the global and system config (~/.config/mise/config.toml, /etc/mise/config.toml), even where a project config or a `MISE_<TOOL>_VERSION` environment variable sets its own version of the tool. It runs as if from outside any project, so project config, lockfiles, and `[env]` are neither read nor changed. Tools that update themselves, such as coding agents, run this instead of their own updater; see https://mise.jdx.dev/dev-tools/self-updating-tools.html
|
|
"""#
|
|
conflicts "--local" "--no-global" "--inactive"
|
|
}
|
|
flag --local help="Deprecated alias for --no-global" {
|
|
long_help #"""
|
|
Deprecated alias for --no-global
|
|
|
|
Removed in mise 2027.7.0.
|
|
"""#
|
|
conflicts "--global" "--no-global"
|
|
}
|
|
flag --no-global help="Only upgrade tools defined in project config files" {
|
|
long_help #"""
|
|
Only upgrade tools defined in project config files
|
|
|
|
Skips tools defined in the global config (~/.config/mise/config.toml) and tools set through `MISE_<TOOL>_VERSION` environment variables.
|
|
"""#
|
|
conflicts "--global" "--local"
|
|
}
|
|
flag --minimum-release-age help="Only upgrade to versions released before this date or older than this duration" {
|
|
alias "--before" hide=#true
|
|
long_help #"""
|
|
Only upgrade to versions released before this date or older than this duration
|
|
|
|
Supports absolute dates such as "2024-06-01" and relative durations such as "90d" or "1y".
|
|
|
|
Applies only to requests that can match several versions, such as "20" or "latest". Exact versions such as "22.5.0" are not filtered.
|
|
"""#
|
|
arg <MINIMUM_RELEASE_AGE>
|
|
}
|
|
flag --monorepo help="Placeholder for future monorepo upgrades; `mise upgrade --monorepo` is not implemented yet." hide=#true
|
|
flag --no-prune help="Do not uninstall the versions that were upgraded away from" overrides=--prune {
|
|
long_help #"""
|
|
Do not uninstall the versions that were upgraded away from
|
|
|
|
The old version is left in place and is not scheduled for removal. Use this when something outside mise points at the install directory.
|
|
|
|
Set `upgrade.auto_prune = false` to make this the default.
|
|
"""#
|
|
}
|
|
flag --prune help="Immediately uninstall the versions that were upgraded away from" overrides=--no-prune {
|
|
long_help #"""
|
|
Immediately uninstall the versions that were upgraded away from
|
|
|
|
Use this to bypass `upgrade.prune_after`, or to override `upgrade.auto_prune = false` for a single run.
|
|
"""#
|
|
}
|
|
flag --raw help="Connect the install commands' stdin, stdout, and stderr to the terminal" overrides=--jobs {
|
|
long_help #"""
|
|
Connect the install commands' stdin, stdout, and stderr to the terminal
|
|
|
|
Implies `--jobs=1`.
|
|
"""#
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[INSTALLED_TOOL@VERSION]…" help="Tools to upgrade, such as node@20 python@3.10" help_long=#"""
|
|
Tools to upgrade, such as node@20 python@3.10
|
|
|
|
Upgrades every configured tool when omitted.
|
|
"""# required=#false var=#true
|
|
example "mise upgrade" help="Upgrade every configured tool within its range"
|
|
example "mise upgrade node" help="Upgrade only node"
|
|
example "mise upgrade --bump" help="Upgrade every tool to its newest release and update mise.toml"
|
|
example "mise upgrade --dry-run" help="Show what would be upgraded"
|
|
example "mise upgrade --exclude go" help="Upgrade everything except go"
|
|
example "mise upgrade --interactive" help="Choose tools from a menu"
|
|
example "mise upgrade --global claude" help="Upgrade claude within the global config's request, leaving project config alone"
|
|
}
|
|
cmd usage hide=#true help="Generate a usage CLI spec" effect=read {
|
|
long_help #"""
|
|
Generate a usage CLI spec
|
|
|
|
See https://usage.jdx.dev for more information on this specification.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
}
|
|
cmd use help="Install a tool and add it to configuration" effect=write {
|
|
alias u
|
|
long_help #"""
|
|
Install a tool and add it to configuration
|
|
|
|
Installs missing tool versions and records the requests in a config file.
|
|
By default, mise selects the nearest directory with a supported config and
|
|
writes to its lowest-precedence file, such as `mise.toml` rather than
|
|
`mise.local.toml`. If no project config exists, it creates one in the current
|
|
directory. Run from your home directory, it writes to the global config.
|
|
|
|
Use `--path` for an explicit file or directory, `--global` for personal
|
|
defaults, or `--env` to write `mise.ENV.toml` in the current directory (an
|
|
existing `.mise.ENV.toml` is used instead). If you pass more than one, the
|
|
last one wins.
|
|
|
|
See https://mise.jdx.dev/configuration.html#target-file-for-write-operations
|
|
for filename overrides and config precedence. The change takes effect in an
|
|
activated shell at its next prompt, and immediately in `mise exec` commands.
|
|
"""#
|
|
flag "-e --env" help="Write mise.<ENV>.toml in the current directory, or .mise.<ENV>.toml if that exists" {
|
|
long_help #"""
|
|
Write mise.<ENV>.toml in the current directory, or .mise.<ENV>.toml if that exists
|
|
|
|
Not the same as the global -E, which only chooses which config files are loaded.
|
|
"""#
|
|
overrides "--global" "--path"
|
|
arg <ENV>
|
|
}
|
|
flag "-f --force" help="Reinstall even if already installed" requires=TOOL@VERSION
|
|
flag "-g --global" help="Write to the global config instead of the project config" {
|
|
long_help #"""
|
|
Write to the global config instead of the project config
|
|
|
|
Updates the global config file that already declares the tool, otherwise the file set by the `write_targets.tools` setting, otherwise ~/.config/mise/config.toml.
|
|
"""#
|
|
overrides "--path" "--env"
|
|
}
|
|
flag "-j --jobs" help="Number of jobs to run in parallel (default: the `jobs` setting)" env=MISE_JOBS {
|
|
arg <JOBS>
|
|
}
|
|
flag "-n --dry-run" help="Show what would change without changing anything"
|
|
flag "-p --path" help="Write to this config file, or to the config file in this directory" {
|
|
long_help #"""
|
|
Write to this config file, or to the config file in this directory
|
|
|
|
For a directory, mise picks the file by the usual write-target rules.
|
|
"""#
|
|
overrides "--global" "--env"
|
|
arg <PATH>
|
|
}
|
|
flag --override help="Write to the global override file, `config.override.toml`" {
|
|
long_help #"""
|
|
Write to the global override file, `config.override.toml`
|
|
|
|
The override file outranks all project config. With `--env`, writes `config.<ENV>.override.toml` instead. See https://mise.jdx.dev/configuration.html#override-file
|
|
"""#
|
|
conflicts "--global" "--path"
|
|
}
|
|
flag --dry-run-code help="Like --dry-run, but exit with code 1 if there are changes to make" {
|
|
long_help #"""
|
|
Like --dry-run, but exit with code 1 if there are changes to make
|
|
|
|
Use it in scripts that check whether tools need to be added or removed.
|
|
"""#
|
|
}
|
|
flag --fuzzy help="Write the version as requested, such as `20` for node@20" overrides=--pin {
|
|
long_help #"""
|
|
Write the version as requested, such as `20` for node@20
|
|
|
|
This is the default unless the `pin` setting is on.
|
|
"""#
|
|
}
|
|
flag --minimum-release-age help="Only install versions released before this date or older than this duration" {
|
|
alias "--before" hide=#true
|
|
long_help #"""
|
|
Only install versions released before this date or older than this duration
|
|
|
|
Supports absolute dates such as "2024-06-01" and relative durations such as "90d" or "1y".
|
|
"""#
|
|
arg <MINIMUM_RELEASE_AGE>
|
|
}
|
|
flag --pin help="Write the resolved version, such as `20.19.5` for node@20" overrides=--fuzzy {
|
|
long_help #"""
|
|
Write the resolved version, such as `20.19.5` for node@20
|
|
|
|
If the request exactly matches an available release, mise uses that release rather than an installed version that only matches it as a prefix. Write `prefix:` before the version, as in `node@prefix:20`, to force prefix matching. Make this the default with the `pin` setting (`MISE_PIN=1`).
|
|
|
|
To record exact versions without editing mise.toml, use a lockfile: https://mise.jdx.dev/dev-tools/mise-lock.html
|
|
"""#
|
|
}
|
|
flag --raw help="Connect the install commands' stdin, stdout, and stderr to the terminal" overrides=--jobs {
|
|
long_help #"""
|
|
Connect the install commands' stdin, stdout, and stderr to the terminal
|
|
|
|
Implies `--jobs=1`.
|
|
"""#
|
|
}
|
|
flag --remove help="Remove these tools from the config file" var=#true {
|
|
alias "--rm" "--unset" hide=#true
|
|
arg <TOOL>
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
clause tools {
|
|
flag --postinstall help="Command to run after installing this tool" {
|
|
arg <COMMAND>
|
|
}
|
|
flag --tool-option help="Set an option for the tool that follows; repeat for several options" var=#true {
|
|
long_help #"""
|
|
Set an option for the tool that follows; repeat for several options
|
|
|
|
Values use inline tool-option types; unquoted text is a string. Put these flags before the tool they apply to.
|
|
"""#
|
|
arg "<KEY=VALUE>"
|
|
}
|
|
arg <TOOL@VERSION> help="Tool to add to the config file, such as node@24, cargo:ripgrep@latest, or npm:prettier@3" help_long=#"""
|
|
Tool to add to the config file, such as node@24, cargo:ripgrep@latest, or npm:prettier@3
|
|
|
|
Without a version, mise requests `latest` but reuses the newest installed version.
|
|
Write `@latest` to install the newest release; in locked mode the lockfile still decides.
|
|
With --pin it writes the resolved version.
|
|
Tool options can also be set inline:
|
|
|
|
mise use "cargo:ripgrep[features=pcre2]"
|
|
"""#
|
|
}
|
|
example "mise use" help="Choose tools from an interactive selector"
|
|
example "mise use node@24" help="Use node 24.x in the project config and record the request `24`"
|
|
example "mise use --postinstall \"mbx setup --defaults\" mr-boxington" help="Run a command after installing a tool"
|
|
example "mise use --postinstall \"corepack enable\" node@24 --postinstall \"python -m pip install -U pip\" python@3.13" help="Give each tool its own postinstall command"
|
|
example "mise use --tool-option mr_boxington=true rust mr-boxington" help="Enable a Rust tool option while installing Rust and mbx"
|
|
example "mise use -g --pin node@24" help="Use node 24.x globally and record the exact version it resolves to"
|
|
example "mise use --env local node@24" help="Write mise.local.toml (an existing .mise.local.toml is used instead)"
|
|
example "mise use --env staging node@24" help="Write mise.staging.toml, which mise loads when MISE_ENV=staging"
|
|
complete path type=path
|
|
}
|
|
cmd vars help="List, set, and ask for config vars" effect=write {
|
|
long_help #"""
|
|
List, set, and ask for config vars
|
|
|
|
Like `mise set`: with no arguments, lists every var and where it comes from;
|
|
`mise vars NAME=VALUE` saves a value on this machine and `mise vars NAME`
|
|
prints one. Saved values live in `$MISE_STATE_DIR/vars.toml`, outside every
|
|
config file, and sit above a var's `default` but below any value a config
|
|
file sets. `mise vars prompt` asks for the `[vars]` that declare a `prompt`;
|
|
only it and `mise bootstrap --prompt-vars` ever ask.
|
|
See https://mise.jdx.dev/configuration/vars.html#prompt
|
|
"""#
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --json-extended help="Output in JSON format with sources"
|
|
flag --no-header help="Do not print the table header" {
|
|
conflicts "--json" "--json-extended"
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[NAME[=VALUE]]…" help="Values to save (`NAME=VALUE`) or to print (`NAME`)" required=#false var=#true
|
|
group output "--json" "--json-extended"
|
|
cmd ls help="List every var, with the file it comes from" effect=read {
|
|
alias list
|
|
long_help #"""
|
|
List every var, with the file it comes from
|
|
|
|
Lists the `[vars]` of every config file mise loads here, plus the answers
|
|
saved on this machine (source: `$MISE_STATE_DIR/vars.toml`). Values hidden
|
|
with `redact` show as `[redacted]`. A `required` var that is still unset only
|
|
warns here. `--json` prints an object of names and values, and
|
|
`--json-extended` adds each var's source.
|
|
"""#
|
|
flag "-J --json" help="Output in JSON format"
|
|
flag --json-extended help="Output in JSON format with sources"
|
|
flag --no-header help="Do not print the table header" {
|
|
conflicts "--json" "--json-extended"
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
group output "--json" "--json-extended"
|
|
}
|
|
cmd prompt help="Ask for the prompt vars that have no saved answer, or set answers directly" effect=write {
|
|
long_help #"""
|
|
Ask for the prompt vars that have no saved answer, or set answers directly
|
|
|
|
Enter accepts the suggested default. Each answer, accepted defaults
|
|
included, is saved and never asked for again; use `mise vars unset` to be
|
|
asked again. With no arguments, asks about every unanswered `prompt` var in
|
|
the config files that apply here. `NAME` asks for only that var;
|
|
`NAME=VALUE` saves the answer without asking, as `mise set` does for an
|
|
env var, so it needs no terminal.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[NAME[=VALUE]]…" help="Vars to ask for (`NAME`) or answers to save (`NAME=VALUE`)" required=#false var=#true
|
|
example "mise vars prompt" help="Ask for every unanswered prompt var"
|
|
example "mise vars prompt git_name" help="Ask for git_name only"
|
|
example "mise vars prompt git_name=\"Ada Lovelace\"" help="Set the answer for git_name without asking"
|
|
}
|
|
cmd unset help="Forget saved answers so they are asked for again" effect=write {
|
|
alias rm remove
|
|
long_help #"""
|
|
Forget saved answers so they are asked for again
|
|
|
|
Edits `$MISE_STATE_DIR/vars.toml`; no config is loaded. The next
|
|
`mise vars prompt` or `mise bootstrap --prompt-vars` asks again.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[NAME]…" help="The vars whose answers to forget" required=#false var=#true
|
|
example "mise vars unset git_name" help="Be asked for git_name again"
|
|
}
|
|
example "mise vars git_name=\"Ada Lovelace\"" help="Save a value on this machine without asking"
|
|
example "mise vars git_name" help="Print the saved value of git_name"
|
|
example "mise vars" help="List every var and its source"
|
|
}
|
|
cmd version help="Show the version of mise" effect=read {
|
|
alias v
|
|
long_help #"""
|
|
Show the version of mise
|
|
|
|
Prints the version, OS, architecture, and build date, and warns when a newer
|
|
release is available. `mise --version`, `mise -V`, and `mise -v` with no
|
|
other arguments print the same line.
|
|
"""#
|
|
flag "-J --json" help="Print the version information in JSON format"
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
example #"""
|
|
mise version
|
|
2026.10.4 linux-x64 (2026-10-07)
|
|
"""# help="Show the version"
|
|
example "mise version --json" help="Also show the latest release and the build time, as JSON"
|
|
}
|
|
cmd watch help="Run tasks and rerun them when files change" unknown_flags=value {
|
|
alias w
|
|
long_help #"""
|
|
Run tasks and rerun them when files change
|
|
|
|
Runs the tasks with `mise run` under watchexec, then reruns them whenever one of their `sources` changes, including the sources of their dependencies unless you pass `--skip-deps`. When no selected task declares `sources`, watchexec watches the current directory. With no task, runs the `default` task.
|
|
|
|
Choose what to watch with `--watch`, `--exts`, and `--filter`, and use `--print-events` to see what triggered a run. Arguments for the task go after `--`. Requires watchexec, which `mise use -g watchexec` installs.
|
|
|
|
To keep a server or database running alongside your tasks, with readiness checks and automatic restarts, see `mise daemons` (experimental): https://mise.jdx.dev/daemons.html. For cron scheduling and standalone process management, see pitchfork: https://pitchfork.jdx.dev
|
|
"""#
|
|
flag "-t --task-flag" help="Tasks to run" var=#true hide=#true {
|
|
arg <TASK_FLAG>
|
|
}
|
|
flag "-g --glob" help="Globs to watch instead of the tasks' sources" var=#true {
|
|
arg <GLOB>
|
|
}
|
|
flag --skip-deps help="Run and watch only the named tasks, not the tasks they depend on"
|
|
flag "-w --watch" help="Watch a file or directory" var=#true help_heading=Filtering {
|
|
long_help #"""
|
|
Watch a file or directory
|
|
|
|
By default, mise watches each task's directory and any source directory outside it, and filters events to the tasks' `sources`. When no task declares sources, watchexec watches the current directory. Paths given here are added to the task directories, or replace the current-directory default when there are no sources. Events are still filtered to the sources, so use `--filter` to widen what triggers a rerun.
|
|
|
|
To watch a single file, watch its directory and filter on the file name instead: some editors replace a file when they save it, and some platforms do not report changes to the replacement. Repeat the flag to watch several paths.
|
|
"""#
|
|
arg <PATH>
|
|
}
|
|
flag "-W --watch-non-recursive" help="Watch a directory without recursing into it" var=#true help_heading=Filtering {
|
|
long_help #"""
|
|
Watch a directory without recursing into it
|
|
|
|
Repeat the flag to watch several directories.
|
|
"""#
|
|
arg <PATH>
|
|
}
|
|
flag "-F --watch-file" help="Read paths to watch from a file, one per line" help_heading=Filtering {
|
|
long_help #"""
|
|
Read paths to watch from a file, one per line
|
|
|
|
Each line is treated like a `--watch` value. The value `-` reads from stdin and cannot be combined with `--stdin-quit`.
|
|
"""#
|
|
arg <PATH>
|
|
}
|
|
flag "-c --clear" help="Clear the screen before each run" value_optional=#true default_missing=clear help_heading=Output {
|
|
long_help #"""
|
|
Clear the screen before each run
|
|
|
|
If the default `clear` mode leaves output behind, use `--clear=reset`. Because the mode is optional, `mise watch --clear build` reads `build` as the mode: put `--clear` after the task name, as in `mise watch build --clear`, or write the mode with `=`.
|
|
"""#
|
|
arg "[MODE]" required=#false var_min=0 var_max=1 {
|
|
choices {
|
|
choice clear
|
|
choice reset
|
|
}
|
|
}
|
|
}
|
|
flag "-o --on-busy-update" help="What to do when files change while the tasks are running" hide_default_value=#true default=do-nothing {
|
|
long_help #"""
|
|
What to do when files change while the tasks are running
|
|
|
|
`do-nothing` (the default) ignores the change, so files the tasks write do not trigger another run. `queue` runs the tasks again when the current run finishes. `restart` stops the running tasks and starts them again. `signal` sends the `--signal` signal and keeps the tasks running, for programs that reload their configuration on a signal.
|
|
"""#
|
|
arg <MODE> {
|
|
choices {
|
|
choice queue
|
|
choice do-nothing
|
|
choice restart
|
|
choice signal
|
|
}
|
|
}
|
|
}
|
|
flag "-r --restart" help="Restart the tasks if they are still running when files change" conflicts=--on-busy-update {
|
|
long_help #"""
|
|
Restart the tasks if they are still running when files change
|
|
|
|
Same as `--on-busy-update=restart`.
|
|
"""#
|
|
}
|
|
flag "-s --signal" help="Signal to send to the running tasks when files change" conflicts=--restart {
|
|
long_help #"""
|
|
Signal to send to the running tasks when files change
|
|
|
|
Implies `--on-busy-update=signal`. Accepts the same forms as `--stop-signal`. Signals are not supported on Windows, where the tasks are always killed.
|
|
"""#
|
|
arg <SIGNAL>
|
|
}
|
|
flag --stop-signal help="Signal that stops the tasks before a restart (default on Unix: SIGTERM)" {
|
|
long_help #"""
|
|
Signal that stops the tasks before a restart (default on Unix: SIGTERM)
|
|
|
|
Used by the `restart` and `signal` modes of `--on-busy-update` unless `--signal` is given. Accepts a full name (`SIGTERM`), a short name (`TERM`), or a number (`15`), in any case. If the tasks have not exited after `--stop-timeout`, they are killed. On Windows the tasks are always killed.
|
|
"""#
|
|
arg <SIGNAL>
|
|
}
|
|
flag --stop-timeout help="How long to wait for the tasks to stop before killing them (default: 10s)" hide_default_value=#true default="10s" {
|
|
long_help #"""
|
|
How long to wait for the tasks to stop before killing them (default: 10s)
|
|
|
|
Takes a duration such as `5s` or `1min 20s`. Set it to 0 to kill the tasks right away. Has no effect on Windows, where the tasks are always killed.
|
|
"""#
|
|
arg <TIMEOUT>
|
|
}
|
|
flag --map-signal help="Translate a signal that watchexec receives into one it sends to the tasks" var=#true {
|
|
long_help #"""
|
|
Translate a signal that watchexec receives into one it sends to the tasks
|
|
|
|
Takes two signal names separated by a colon, such as `TERM:INT`. Leave out the second name to discard the first signal (`TERM:`). A mapped SIGINT or SIGTERM no longer stops watching; `INT:INT` passes Ctrl-C to the tasks without stopping watchexec. Repeat the flag to map several signals.
|
|
"""#
|
|
arg <SIGNAL:SIGNAL>
|
|
}
|
|
flag "-d --debounce" help="How long to wait for more changes before running (default: 50ms)" hide_default_value=#true default="50ms" {
|
|
long_help #"""
|
|
How long to wait for more changes before running (default: 50ms)
|
|
|
|
One save can produce several events, and a file can be written in pieces, so watchexec waits this long after an event before running the tasks. Takes a duration such as `500ms` or `2s`.
|
|
"""#
|
|
arg <TIMEOUT>
|
|
}
|
|
flag --stdin-quit help="Exit when stdin closes"
|
|
flag --no-vcs-ignore help="Do not apply Git and other version control ignore files" help_heading=Filtering {
|
|
long_help #"""
|
|
Do not apply Git and other version control ignore files
|
|
|
|
Use it to watch files that Git ignores. A task can turn this on for itself with `watch = { no_vcs_ignore = true }`.
|
|
"""#
|
|
}
|
|
flag --no-project-ignore help="Do not apply ignore files in the project, such as `.gitignore` and `.ignore`" help_heading=Filtering
|
|
flag --no-global-ignore help="Do not apply global ignore files, such as `~/.gitignore` and `~/.config/watchexec/ignore`" help_heading=Filtering
|
|
flag --no-default-ignore help="Do not apply watchexec's built-in ignores" help_heading=Filtering {
|
|
long_help #"""
|
|
Do not apply watchexec's built-in ignores
|
|
|
|
They cover editor swap files, `*.pyc`, `.DS_Store`, and version control directories such as `.git`.
|
|
"""#
|
|
}
|
|
flag --no-discover-ignore help="Do not look for ignore files at all" help_heading=Filtering {
|
|
long_help #"""
|
|
Do not look for ignore files at all
|
|
|
|
Same as `--no-global-ignore --no-vcs-ignore --no-project-ignore`, but faster. Built-in ignores still apply.
|
|
"""#
|
|
}
|
|
flag --ignore-nothing help="Ignore nothing" help_heading=Filtering {
|
|
long_help #"""
|
|
Ignore nothing
|
|
|
|
Same as `--no-discover-ignore --no-default-ignore`. Patterns from `--ignore` and `--ignore-file` still apply.
|
|
"""#
|
|
}
|
|
flag "-p --postpone" help="Wait for the first change before running the tasks"
|
|
flag --delay-run help="Wait this long after a change before running the tasks, e.g. 5s" {
|
|
arg <DURATION>
|
|
}
|
|
flag --poll help="Poll for changes instead of using native file watching" value_optional=#true default_missing="30s" {
|
|
alias "--force-poll" hide=#true
|
|
long_help #"""
|
|
Poll for changes instead of using native file watching
|
|
|
|
Use it on file systems where native events do not work, such as network shares. Takes an optional interval such as `2s` (default: 30s). Also accepted as `--force-poll`.
|
|
"""#
|
|
arg "[INTERVAL]" required=#false var_min=0 var_max=1
|
|
}
|
|
flag --shell help="Use a different shell" help_heading=Command {
|
|
long_help #"""
|
|
Use a different shell
|
|
|
|
By default, Watchexec will use '$SHELL' if it's defined or a default of 'sh' on Unix-likes, and either 'pwsh', 'powershell', or 'cmd' (CMD.EXE) on Windows, depending on what Watchexec detects is the running shell.
|
|
|
|
With this option, you can override that and use a different shell, for example one with more features or one which has your custom aliases and functions.
|
|
|
|
If the value has spaces, it is parsed as a command line, and the first word used as the shell program, with the rest as arguments to the shell.
|
|
|
|
The command is run with the '-c' flag (except for 'cmd' on Windows, where it's '/C').
|
|
|
|
The special value 'none' can be used to disable shell use entirely. In that case, the command provided to Watchexec will be parsed, with the first word being the executable and the rest being the arguments, and executed directly. Note that this parsing is rudimentary, and may not work as expected in all cases.
|
|
|
|
Using 'none' is a little more efficient and can enable a stricter interpretation of the input, but it also means that you can't use shell features like globbing, redirection, control flow, logic, or pipes.
|
|
|
|
Examples:
|
|
|
|
Use without shell:
|
|
|
|
$ watchexec -n -- zsh -x -o shwordsplit scr
|
|
|
|
Use with powershell core:
|
|
|
|
$ watchexec --shell=pwsh -- Test-Connection localhost
|
|
|
|
Use with CMD.exe:
|
|
|
|
$ watchexec --shell=cmd -- dir
|
|
|
|
Use with a different unix shell:
|
|
|
|
$ watchexec --shell=bash -- 'echo $BASH_VERSION'
|
|
|
|
Use with a unix shell and options:
|
|
|
|
$ watchexec --shell='zsh -x -o shwordsplit' -- scr
|
|
"""#
|
|
arg <SHELL>
|
|
}
|
|
flag -n help="Shorthand for '--shell=none'" help_heading=Command
|
|
flag --emit-events-to help="Configure event emission" hide_default_value=#true help_heading=Command default=none {
|
|
long_help #"""
|
|
Configure event emission
|
|
|
|
Watchexec can emit event information when running a command, which can be used by the child
|
|
process to target specific changed files.
|
|
|
|
One thing to take care with is assuming inherent behaviour where there is only chance.
|
|
Notably, it could appear as if the `RENAMED` variable contains both the original and the new
|
|
path being renamed. In previous versions, it would even appear on some platforms as if the
|
|
original always came before the new. However, none of this was true. It's impossible to
|
|
reliably and portably know which changed path is the old or new, "half" renames may appear
|
|
(only the original, only the new), "unknown" renames may appear (change was a rename, but
|
|
whether it was the old or new isn't known), rename events might split across two debouncing
|
|
boundaries, and so on.
|
|
|
|
This option controls where that information is emitted. It defaults to 'none', which doesn't
|
|
emit event information at all. The other options are 'environment' (deprecated), 'stdio',
|
|
'file', 'json-stdio', and 'json-file'.
|
|
|
|
The 'stdio' and 'file' modes are text-based: 'stdio' writes absolute paths to the stdin of
|
|
the command, one per line, each prefixed with `create:`, `remove:`, `rename:`, `modify:`,
|
|
or `other:`, then closes the handle; 'file' writes the same thing to a temporary file, and
|
|
its path is given with the $WATCHEXEC_EVENTS_FILE environment variable.
|
|
|
|
There are also two JSON modes, which are based on JSON objects and can represent the full
|
|
set of events Watchexec handles. Here's an example of a folder being created on Linux:
|
|
|
|
```json
|
|
{
|
|
"tags": [
|
|
{
|
|
"kind": "path",
|
|
"absolute": "/home/user/your/new-folder",
|
|
"filetype": "dir"
|
|
},
|
|
{
|
|
"kind": "fs",
|
|
"simple": "create",
|
|
"full": "Create(Folder)"
|
|
},
|
|
{
|
|
"kind": "source",
|
|
"source": "filesystem"
|
|
}
|
|
],
|
|
"metadata": {
|
|
"notify-backend": "inotify"
|
|
}
|
|
}
|
|
```
|
|
|
|
The fields are as follows:
|
|
|
|
- `tags`, structured event data.
|
|
- `tags[].kind`, which can be:
|
|
* 'path', along with:
|
|
+ `absolute`, an absolute path.
|
|
+ `filetype`, a file type if known ('dir', 'file', 'symlink', 'other').
|
|
* 'fs':
|
|
+ `simple`, the "simple" event type ('access', 'create', 'modify', 'remove', or 'other').
|
|
+ `full`, the "full" event type, which is too complex to fully describe here, but looks like 'General(Precise(Specific))'.
|
|
* 'source', along with:
|
|
+ `source`, the source of the event ('filesystem', 'keyboard', 'mouse', 'os', 'time', 'internal').
|
|
* 'keyboard', along with:
|
|
+ `keycode`. Currently only the value 'eof' is supported.
|
|
* 'process', for events caused by processes:
|
|
+ `pid`, the process ID.
|
|
* 'signal', for signals sent to Watchexec:
|
|
+ `signal`, the normalised signal name ('hangup', 'interrupt', 'quit', 'terminate', 'user1', 'user2').
|
|
* 'completion', for when a command ends:
|
|
+ `disposition`, the exit disposition ('success', 'error', 'signal', 'stop', 'exception', 'continued').
|
|
+ `code`, the exit, signal, stop, or exception code.
|
|
- `metadata`, additional information about the event.
|
|
|
|
The 'json-stdio' mode will emit JSON events to the standard input of the command, one per
|
|
line, then close stdin. The 'json-file' mode will create a temporary file, write the
|
|
events to it, and provide the path to the file with the $WATCHEXEC_EVENTS_FILE
|
|
environment variable.
|
|
|
|
Finally, the 'environment' mode was the default until 2.0. It sets environment variables
|
|
with the paths of the affected files, for filesystem events:
|
|
|
|
$WATCHEXEC_COMMON_PATH is set to the longest common path of all of the below variables,
|
|
and so should be prepended to each path to obtain the full/real path. Then:
|
|
|
|
- $WATCHEXEC_CREATED_PATH is set when files/folders were created
|
|
- $WATCHEXEC_REMOVED_PATH is set when files/folders were removed
|
|
- $WATCHEXEC_RENAMED_PATH is set when files/folders were renamed
|
|
- $WATCHEXEC_WRITTEN_PATH is set when files/folders were modified
|
|
- $WATCHEXEC_META_CHANGED_PATH is set when files/folders' metadata were modified
|
|
- $WATCHEXEC_OTHERWISE_CHANGED_PATH is set for every other kind of pathed event
|
|
|
|
Multiple paths are separated by the system path separator, ';' on Windows and ':' on unix.
|
|
Within each variable, paths are deduplicated and sorted in binary order (i.e. neither
|
|
Unicode nor locale aware).
|
|
|
|
This is the legacy mode, is deprecated, and will be removed in the future. The environment
|
|
is a very restricted space, while also limited in what it can usefully represent. Large
|
|
numbers of files will either cause the environment to be truncated, or may error or crash
|
|
the process entirely. The $WATCHEXEC_COMMON_PATH is also unintuitive, as demonstrated by the
|
|
multiple confused queries that have landed in my inbox over the years.
|
|
"""#
|
|
required_if_eq "--only-emit-events" "true"
|
|
arg <MODE> {
|
|
choices {
|
|
choice environment
|
|
choice stdio
|
|
choice file
|
|
choice json-stdio
|
|
choice json-file
|
|
choice none
|
|
}
|
|
}
|
|
}
|
|
flag --only-emit-events help="Only emit events to stdout, run no commands." conflicts=--manual help_heading=Output {
|
|
long_help #"""
|
|
Only emit events to stdout, run no commands.
|
|
|
|
This is a convenience option for using Watchexec as a file watcher, without running any commands. It is almost equivalent to using `cat` as the command, except that it will not spawn a new process for each event.
|
|
|
|
This option requires `--emit-events-to` to be set, and restricts the available modes to `stdio` and `json-stdio`, modifying their behaviour to write to stdout instead of the stdin of the command.
|
|
"""#
|
|
}
|
|
flag --watchexec-env help="Add env vars to the command" var=#true help_heading=Command {
|
|
long_help #"""
|
|
Add env vars to the command
|
|
|
|
This is a convenience option for setting environment variables for the command, without setting them for the Watchexec process itself.
|
|
|
|
Use key=value syntax. Multiple variables can be set by repeating the option.
|
|
|
|
This is watchexec's '--env'. In mise, '-E'/'--env' selects the mise environment (`mise.<ENV>.toml`), as it does for every other command.
|
|
"""#
|
|
arg "<KEY=VALUE>"
|
|
}
|
|
flag --wrap-process help="How to wrap the task process: group, session, or none" help_heading=Command {
|
|
long_help #"""
|
|
How to wrap the task process: group, session, or none
|
|
|
|
By default watchexec uses a session on macOS, a process group on other Unix systems, and a Job Object on Windows. Some programs need a session, and some do not work in a process group; `none` runs the command directly. On Windows, `group` and `session` both use a Job Object.
|
|
"""#
|
|
arg <MODE> {
|
|
choices {
|
|
choice group
|
|
choice session
|
|
choice none
|
|
}
|
|
}
|
|
}
|
|
flag "-N --notify" help="Alert when commands start and end" help_heading=Output {
|
|
long_help #"""
|
|
Alert when commands start and end
|
|
|
|
With this, Watchexec will emit a desktop notification when a command starts and ends, on supported platforms. On unsupported platforms, it may silently do nothing, or log a warning.
|
|
"""#
|
|
}
|
|
flag --color help="When to use terminal colours" help_heading=Output default=auto {
|
|
alias "--colour" hide=#true
|
|
long_help #"""
|
|
When to use terminal colours
|
|
|
|
Setting the environment variable `NO_COLOR` to any value is equivalent to `--color=never`.
|
|
"""#
|
|
arg <MODE> {
|
|
choices {
|
|
choice auto
|
|
choice always
|
|
choice never
|
|
}
|
|
}
|
|
}
|
|
flag --timings help="Print how long the command took to run" help_heading=Output {
|
|
long_help #"""
|
|
Print how long the command took to run
|
|
|
|
This may not be exactly accurate, as it includes some overhead from Watchexec itself. Use the `time` utility, high-precision timers, or benchmarking tools for more accurate results.
|
|
"""#
|
|
}
|
|
flag --watchexec-quiet help="Don't print starting and stopping messages" help_heading=Output {
|
|
long_help #"""
|
|
Don't print starting and stopping messages
|
|
|
|
By default Watchexec will print a message when the command starts and stops. This option disables this behaviour, so only the command's output, warnings, and errors will be printed.
|
|
|
|
This is watchexec's '--quiet'. In mise, '-q'/'--quiet' quiets mise's own messages, as it does for every other command.
|
|
"""#
|
|
}
|
|
flag --bell help="Ring the terminal bell on command completion" help_heading=Output
|
|
flag --project-origin help="Set the project origin" {
|
|
long_help #"""
|
|
Set the project origin
|
|
|
|
Watchexec will attempt to discover the project's "origin" (or "root") by searching for a variety of markers, like files or directory patterns. It does its best but sometimes gets it it wrong, and you can override that with this option.
|
|
|
|
The project origin is used to determine the path of certain ignore files, which VCS is being used, the meaning of a leading '/' in filtering patterns, and maybe more in the future.
|
|
|
|
When set, Watchexec will also not bother searching, which can be significantly faster.
|
|
|
|
The directory must contain every watched task's sources, which mise makes relative to it.
|
|
"""#
|
|
arg <DIRECTORY>
|
|
}
|
|
flag --workdir help="Has no effect: mise runs each task from its own `dir`" hide=#true {
|
|
long_help #"""
|
|
Has no effect: mise runs each task from its own `dir`
|
|
|
|
Accepted so scripts that pass it keep working. Forwarding it would make the nested `mise run` look for tasks in that directory instead of this project.
|
|
"""#
|
|
arg <DIRECTORY>
|
|
}
|
|
flag "-e --exts" help="Only react to files with these extensions, e.g. js,ts" var=#true help_heading=Filtering {
|
|
long_help #"""
|
|
Only react to files with these extensions, e.g. js,ts
|
|
|
|
Give extensions with or without the leading dot. Repeat the flag or separate extensions with commas.
|
|
"""#
|
|
arg <EXTENSIONS> delimiter=,
|
|
}
|
|
flag "-f --filter" help="Only react to files that match this glob" var=#true help_heading=Filtering {
|
|
long_help #"""
|
|
Only react to files that match this glob
|
|
|
|
Combined with the patterns mise derives from the tasks' `sources`. Repeat the flag for more patterns. Events that do not come from files, such as signals, pass through.
|
|
"""#
|
|
arg <PATTERN>
|
|
}
|
|
flag --filter-file help="Files to load filters from" var=#true hide_env=#true env=WATCHEXEC_FILTER_FILES help_heading=Filtering {
|
|
long_help #"""
|
|
Files to load filters from
|
|
|
|
Provide a path to a file containing filters, one per line. Empty lines and lines starting with '#' are ignored. Uses the same pattern format as the '--filter' option.
|
|
|
|
This can also be used via the $WATCHEXEC_FILTER_FILES environment variable.
|
|
"""#
|
|
arg <PATH> delimiter=:
|
|
}
|
|
flag "-J --filter-prog" help="[experimental] Filter programs." var=#true help_heading=Filtering {
|
|
long_help #"""
|
|
[experimental] Filter programs.
|
|
|
|
/!\ This option is EXPERIMENTAL and may change and/or vanish without notice.
|
|
|
|
Provide your own custom filter programs in jaq (similar to jq) syntax. Programs are given
|
|
an event in the same format as described in '--emit-events-to' and must return a boolean.
|
|
Invalid programs will make watchexec fail to start; use '-v' to see program runtime errors.
|
|
|
|
In addition to the jaq stdlib, watchexec adds some custom filter definitions:
|
|
|
|
- 'path | file_meta' returns file metadata or null if the file does not exist.
|
|
|
|
- 'path | file_size' returns the size of the file at path, or null if it does not exist.
|
|
|
|
- 'path | file_read(bytes)' returns a string with the first n bytes of the file at path.
|
|
If the file is smaller than n bytes, the whole file is returned. There is no filter to
|
|
read the whole file at once to encourage limiting the amount of data read and processed.
|
|
|
|
- 'string | hash', and 'path | file_hash' return the hash of the string or file at path.
|
|
No guarantee is made about the algorithm used: treat it as an opaque value.
|
|
|
|
- 'any | kv_store(key)', 'kv_fetch(key)', and 'kv_clear' provide a simple key-value store.
|
|
Data is kept in memory only, there is no persistence. Consistency is not guaranteed.
|
|
|
|
- 'any | printout', 'any | printerr', and 'any | log(level)' will print or log any given
|
|
value to stdout, stderr, or the log (levels = error, warn, info, debug, trace), and
|
|
pass the value through (so '[1] | log("debug") | .[]' will produce a '1' and log '[1]').
|
|
|
|
All filtering done with such programs, and especially those using kv or filesystem access,
|
|
is much slower than the other filtering methods. If filtering is too slow, events will back
|
|
up and stall watchexec. Take care when designing your filters.
|
|
|
|
If the argument to this option starts with an '@', the rest of the argument is taken to be
|
|
the path to a file containing a jaq program.
|
|
|
|
Jaq programs are run in order, after all other filters, and short-circuit: if a filter (jaq
|
|
or not) rejects an event, execution stops there, and no other filters are run. Additionally,
|
|
they stop after outputting the first value, so you'll want to use 'any' or 'all' when
|
|
iterating, otherwise only the first item will be processed, which can be quite confusing!
|
|
|
|
Find user-contributed programs or submit your own useful ones at
|
|
<https://github.com/watchexec/watchexec/discussions/592>.
|
|
|
|
## Examples:
|
|
|
|
Regexp ignore filter on paths:
|
|
|
|
'all(.tags[] | select(.kind == "path"); .absolute | test("[.]test[.]js$")) | not'
|
|
|
|
Pass any event that creates a file:
|
|
|
|
'any(.tags[] | select(.kind == "fs"); .simple == "create")'
|
|
|
|
Pass events that touch executable files:
|
|
|
|
'any(.tags[] | select(.kind == "path" and .filetype == "file"); .absolute | file_meta | .executable)'
|
|
|
|
Ignore files that start with shebangs:
|
|
|
|
'any(.tags[] | select(.kind == "path" and .filetype == "file"); .absolute | file_read(2) == "#!") | not'
|
|
"""#
|
|
arg <EXPRESSION>
|
|
}
|
|
flag "-i --ignore" help="Ignore files that match this glob" var=#true help_heading=Filtering {
|
|
long_help #"""
|
|
Ignore files that match this glob
|
|
|
|
Repeat the flag for more patterns. Events that do not come from files, such as signals, pass through.
|
|
"""#
|
|
arg <PATTERN>
|
|
}
|
|
flag --ignore-file help="Read ignore patterns from a file, one per line" var=#true hide_env=#true env=WATCHEXEC_IGNORE_FILES help_heading=Filtering {
|
|
long_help #"""
|
|
Read ignore patterns from a file, one per line
|
|
|
|
Empty lines and lines that start with `#` are skipped. The patterns use the same format as `--ignore`. Also read from `$WATCHEXEC_IGNORE_FILES`.
|
|
"""#
|
|
arg <PATH> delimiter=:
|
|
}
|
|
flag --fs-events help="Filesystem events to filter to" var=#true hide_default_value=#true help_heading=Filtering default=create,remove,rename,modify,metadata {
|
|
long_help #"""
|
|
Filesystem events to filter to
|
|
|
|
This is a quick filter to only emit events for the given types of filesystem changes. Choose from 'access', 'create', 'remove', 'rename', 'modify', 'metadata'. Multiple types can be given by repeating the option or by separating them with commas. By default, this is all types except for 'access'.
|
|
|
|
This may apply filtering at the kernel level when possible, which can be more efficient, but may be more confusing when reading the logs.
|
|
"""#
|
|
arg <EVENTS> delimiter=, {
|
|
choices {
|
|
choice access
|
|
choice create
|
|
choice remove
|
|
choice rename
|
|
choice modify
|
|
choice metadata
|
|
}
|
|
}
|
|
}
|
|
flag --no-meta help="Don't emit fs events for metadata changes" conflicts=--fs-events help_heading=Filtering {
|
|
long_help #"""
|
|
Don't emit fs events for metadata changes
|
|
|
|
This is a shorthand for '--fs-events create,remove,rename,modify'. Using it alongside the '--fs-events' option is non-sensical and not allowed.
|
|
"""#
|
|
}
|
|
flag --print-events help="Print the events that trigger each run" help_heading=Debugging {
|
|
long_help #"""
|
|
Print the events that trigger each run
|
|
|
|
Use it to check which files `--watch`, `--filter`, and the tasks' `sources` are reacting to.
|
|
"""#
|
|
}
|
|
flag --manual help="Show the manual page" help_heading=Debugging {
|
|
long_help #"""
|
|
Show the manual page
|
|
|
|
This shows the manual page for Watchexec, if the output is a terminal and the 'man' program is available. If not, the manual page is printed to stdout in ROFF format (suitable for writing to a watchexec.1 file).
|
|
"""#
|
|
}
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[TASK]" help="Task to watch (default: `default`); separate several tasks with `:::`" required=#false
|
|
arg "[ARGS]…" help="Arguments for the task; `:::` starts the next task" required=#false double_dash=automatic var=#true
|
|
example "mise watch build" help="Run build and rerun it whenever its sources change"
|
|
example "mise watch build --clear" help="Clear the screen before each run"
|
|
example "mise watch serve --watch src --exts rs --restart" help="Start an API server and restart it when Rust files in ./src change"
|
|
example "mise watch test -- --verbose" help="Pass arguments after -- to the task"
|
|
complete path type=path
|
|
complete directory type=dir
|
|
}
|
|
cmd where help="Show the install directory of a tool version" effect=read {
|
|
long_help #"""
|
|
Show the install directory of a tool version
|
|
|
|
Fails if no matching version is installed.
|
|
"""#
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg <TOOL@VERSION> help="Tool to look up, such as ruby@3" help_long=#"""
|
|
Tool to look up, such as ruby@3
|
|
|
|
With a version prefix, shows the newest installed version that matches it. Otherwise, shows the active installed version.
|
|
"""#
|
|
arg "[ASDF_VERSION]" help=#"""
|
|
the version prefix to use when querying the latest version
|
|
same as the first argument after the "@"
|
|
used for asdf compatibility
|
|
"""# required=#false hide=#true
|
|
example #"""
|
|
mise where node@20
|
|
~/.local/share/mise/installs/node/20.0.0
|
|
"""# help="Show the newest installed node 20.x"
|
|
example #"""
|
|
mise where node
|
|
~/.local/share/mise/installs/node/20.0.0
|
|
"""# help="Show the active node, or the newest installed node if no config requests one"
|
|
}
|
|
cmd which help="Show the path a tool's executable resolves to" effect=read {
|
|
long_help #"""
|
|
Show the path a tool's executable resolves to
|
|
|
|
Prints the real path of the executable mise would run for BIN_NAME in the
|
|
current directory, bypassing shims. Use `--version` or `--plugin` to see
|
|
which tool version provides it.
|
|
"""#
|
|
flag "-t --tool" help="Look in a specific tool version, such as `mise which npm --tool=node@20`" {
|
|
arg <TOOL@VERSION>
|
|
}
|
|
flag --complete hide=#true
|
|
flag --plugin help="Show the name of the tool that provides the executable" conflicts=--version
|
|
flag --version help="Show the version instead of the path" conflicts=--plugin
|
|
flag "-h --help" help="Print help" action=help builtin=#true
|
|
arg "[BIN_NAME]" help="The executable to look up" required=#false required_unless=--complete
|
|
example #"""
|
|
mise which node
|
|
~/.local/share/mise/installs/node/20.0.0/bin/node
|
|
"""# help="Show the path of the node executable"
|
|
example #"""
|
|
mise which node --plugin
|
|
node
|
|
"""# help="Show the tool that provides it"
|
|
example #"""
|
|
mise which node --version
|
|
20.0.0
|
|
"""# help="Show the version that provides it"
|
|
}
|