diff --git a/schema/mise.json b/schema/mise.json index dc2462fccf..4900f3ca47 100644 --- a/schema/mise.json +++ b/schema/mise.json @@ -378,6 +378,35 @@ "description": "Pushes tools' bin-paths to the front of PATH instead of allowing modifications of PATH after activation to take precedence.", "type": "boolean" }, + "age": { + "type": "object", + "additionalProperties": false, + "properties": { + "identity_files": { + "description": "[experimental] List of age identity files to use for decryption.", + "type": "array", + "items": { + "type": "string" + } + }, + "key_file": { + "description": "[experimental] Path to the age private key file to use for encryption/decryption.", + "type": "string" + }, + "ssh_identity_files": { + "description": "[experimental] List of SSH identity files to use for age decryption.", + "type": "array", + "items": { + "type": "string" + } + }, + "strict": { + "default": true, + "description": "If true, fail when age decryption fails (including when age is not available, the key is missing, or the key is invalid). If false, skip decryption and continue in these cases.", + "type": "boolean" + } + } + }, "all_compile": { "description": "do not use precompiled binaries for any tool", "type": "boolean" @@ -483,17 +512,6 @@ "type": "boolean", "deprecated": true }, - "conda": { - "type": "object", - "additionalProperties": false, - "properties": { - "channel": { - "default": "conda-forge", - "description": "Default channel for conda packages.", - "type": "string" - } - } - }, "cd": { "description": "Path to change to after launching mise", "type": "string" @@ -522,6 +540,17 @@ "type": "string", "enum": ["default", "charm", "base16", "catppuccin", "dracula"] }, + "conda": { + "type": "object", + "additionalProperties": false, + "properties": { + "channel": { + "default": "conda-forge", + "description": "Default channel for conda packages.", + "type": "string" + } + } + }, "debug": { "description": "Sets log level to debug", "type": "boolean" @@ -614,14 +643,14 @@ "description": "TTL for cached environments", "type": "string" }, - "env_shell_expand": { - "description": "Enable shell-style variable expansion in env values (e.g., $FOO, ${BAR:-default})", - "type": "boolean" - }, "env_file": { "description": "Path to a file containing environment variables to automatically load.", "type": "string" }, + "env_shell_expand": { + "description": "Enable shell-style variable expansion in env values (e.g., $FOO, ${BAR:-default})", + "type": "boolean" + }, "erlang": { "type": "object", "additionalProperties": false, @@ -651,19 +680,6 @@ "description": "Timeout in seconds for HTTP requests to fetch new tool versions in mise.", "type": "string" }, - "gix": { - "default": true, - "description": "Use gix for git operations, set to false to shell out to git.", - "type": "boolean" - }, - "global_config_file": { - "description": "Path to the global mise config file. Default is `~/.config/mise/config.toml`. This must be an env var.", - "type": "string" - }, - "global_config_root": { - "description": "Path which is used as `{{config_root}}` for the global config file. Default is `$HOME`. This must be an env var.", - "type": "string" - }, "github": { "type": "object", "additionalProperties": false, @@ -680,11 +696,24 @@ } } }, - "slsa": { + "github_attestations": { "default": true, - "description": "Enable SLSA provenance verification globally.", + "description": "Enable GitHub Artifact Attestations verification for supported tools.", "type": "boolean" }, + "gix": { + "default": true, + "description": "Use gix for git operations, set to false to shell out to git.", + "type": "boolean" + }, + "global_config_file": { + "description": "Path to the global mise config file. Default is `~/.config/mise/config.toml`. This must be an env var.", + "type": "string" + }, + "global_config_root": { + "description": "Path which is used as `{{config_root}}` for the global config file. Default is `$HOME`. This must be an env var.", + "type": "string" + }, "go_default_packages_file": { "default": "~/.default-go-packages", "description": "Path to a file containing default go packages to install when installing go", @@ -722,21 +751,6 @@ "description": "Use gpg to verify all tool signatures.", "type": "boolean" }, - "github_attestations": { - "default": true, - "description": "Enable GitHub Artifact Attestations verification for supported tools.", - "type": "boolean" - }, - "http_timeout": { - "default": "30s", - "description": "Timeout in seconds for all HTTP requests in mise.", - "type": "string" - }, - "http_retries": { - "default": 0, - "description": "Number of retries for HTTP requests in mise.", - "type": "number" - }, "hook_env": { "type": "object", "additionalProperties": false, @@ -753,6 +767,16 @@ } } }, + "http_retries": { + "default": 0, + "description": "Number of retries for HTTP requests in mise.", + "type": "number" + }, + "http_timeout": { + "default": "30s", + "description": "Timeout in seconds for all HTTP requests in mise.", + "type": "string" + }, "idiomatic_version_file": { "description": "Set to false to disable the idiomatic version files such as .node-version, .ruby-version, etc.", "type": "boolean", @@ -812,16 +836,16 @@ "description": "Use libgit2 for git operations, set to false to shell out to git.", "type": "boolean" }, - "lockfile": { - "default": true, - "description": "Create and read lockfiles for tool versions.", - "type": "boolean" - }, "locked": { "default": false, "description": "Require lockfile URLs to be present during installation.", "type": "boolean" }, + "lockfile": { + "default": true, + "description": "Create and read lockfiles for tool versions.", + "type": "boolean" + }, "log_level": { "default": "info", "description": "Show more/less output.", @@ -939,15 +963,15 @@ "description": "Use uvx instead of pipx if uv is installed and on PATH.", "type": "boolean" }, - "prefer_offline": { - "description": "Prefer locally cached data over remote fetches when possible.", - "type": "boolean" - }, "plugin_autoupdate_last_check_duration": { "default": "7d", "description": "How long to wait before updating plugins automatically (note this isn't currently implemented).", "type": "string" }, + "prefer_offline": { + "description": "Prefer locally cached data over remote fetches when possible.", + "type": "boolean" + }, "profile": { "description": "Profile to use for mise.${MISE_PROFILE}.toml files.", "type": "string", @@ -1074,11 +1098,6 @@ "description": "Connect stdin/stdout/stderr to child processes.", "type": "boolean" }, - "terminal_progress": { - "default": true, - "description": "Enable terminal progress indicators (OSC 9;4) for compatible terminals.", - "type": "boolean" - }, "ruby": { "type": "object", "additionalProperties": false, @@ -1096,6 +1115,10 @@ "description": "Path to a file containing default ruby gems to install when installing ruby.", "type": "string" }, + "github_attestations": { + "description": "Enable GitHub Artifact Attestations verification for precompiled Ruby binaries.", + "type": "boolean" + }, "precompiled_arch": { "description": "Override architecture identifier for precompiled Ruby binaries.", "type": "string" @@ -1109,10 +1132,6 @@ "description": "URL template or GitHub repo for precompiled Ruby binaries.", "type": "string" }, - "github_attestations": { - "description": "Enable GitHub Artifact Attestations verification for precompiled Ruby binaries.", - "type": "boolean" - }, "ruby_build_opts": { "description": "Options to pass to ruby-build.", "type": "string" @@ -1163,34 +1182,10 @@ "description": "Suppress all `mise run|watch` output except errors—including what tasks output.", "type": "boolean" }, - "age": { - "type": "object", - "additionalProperties": false, - "properties": { - "identity_files": { - "description": "[experimental] List of age identity files to use for decryption.", - "type": "array", - "items": { - "type": "string" - } - }, - "key_file": { - "description": "[experimental] Path to the age private key file to use for encryption/decryption.", - "type": "string" - }, - "ssh_identity_files": { - "description": "[experimental] List of SSH identity files to use for age decryption.", - "type": "array", - "items": { - "type": "string" - } - }, - "strict": { - "default": true, - "description": "If true, fail when age decryption fails (including when age is not available, the key is missing, or the key is invalid). If false, skip decryption and continue in these cases.", - "type": "boolean" - } - } + "slsa": { + "default": true, + "description": "Enable SLSA provenance verification globally.", + "type": "boolean" }, "sops": { "type": "object", @@ -1233,15 +1228,15 @@ "description": "Show configured env vars when entering a directory with a mise.toml file.", "type": "boolean" }, - "show_tools": { - "description": "Show configured tools when entering a directory with a mise.toml file.", - "type": "boolean" - }, "show_prepare_stale": { "default": true, "description": "Show warning when prepare providers have stale dependencies.", "type": "boolean" }, + "show_tools": { + "description": "Show configured tools when entering a directory with a mise.toml file.", + "type": "boolean" + }, "truncate": { "default": true, "description": "Truncate status messages.", @@ -1267,6 +1262,45 @@ "description": "Path to the system mise config file. Default is `/etc/mise/config.toml`. This must be an env var.", "type": "string" }, + "task": { + "type": "object", + "additionalProperties": false, + "properties": { + "disable_spec_from_run_scripts": { + "default": false, + "description": "Opt out of parsing task run scripts to infer the usage spec (arguments and flags). When enabled, mise will derive the usage spec only from the `usage` field, ignoring any `arg()`, `option()`, or `flag()` templates used in run scripts. This can restore previous behavior and avoid the extra template pass over run scripts when collecting specs.", + "type": "boolean" + }, + "monorepo_depth": { + "default": 5, + "description": "Maximum depth to search for task files in monorepo subdirectories.", + "type": "number" + }, + "monorepo_exclude_dirs": { + "default": [], + "description": "Directory patterns to exclude when discovering monorepo subdirectories.", + "type": "array", + "items": { + "type": "string" + } + }, + "monorepo_respect_gitignore": { + "default": true, + "description": "Whether to respect .gitignore files when discovering monorepo subdirectories.", + "type": "boolean" + }, + "source_freshness_equal_mtime_is_fresh": { + "default": false, + "description": "When source mtime equals output mtime, consider sources fresh (use <=). Default false uses strict < comparison.", + "type": "boolean" + }, + "source_freshness_hash_contents": { + "default": false, + "description": "Use content hashing (blake3) instead of metadata for source freshness. More accurate but slower.", + "type": "boolean" + } + } + }, "task_disable_paths": { "default": [], "description": "Paths that mise will not look for tasks in.", @@ -1297,6 +1331,10 @@ "description": "Automatically install missing tools when executing tasks.", "type": "boolean" }, + "task_show_full_cmd": { + "description": "Disable truncation of command lines in task execution output. When true, the full command line will be shown.", + "type": "boolean" + }, "task_skip": { "default": [], "description": "Tasks to skip when running `mise run`.", @@ -1317,8 +1355,9 @@ "description": "Show completion message with elapsed time for each task on `mise run`. Default shows when output type is `prefix`.", "type": "boolean" }, - "task_show_full_cmd": { - "description": "Disable truncation of command lines in task execution output. When true, the full command line will be shown.", + "terminal_progress": { + "default": true, + "description": "Enable terminal progress indicators (OSC 9;4) for compatible terminals.", "type": "boolean" }, "trace": { @@ -1411,45 +1450,6 @@ "type": "boolean" } } - }, - "task": { - "type": "object", - "additionalProperties": false, - "properties": { - "disable_spec_from_run_scripts": { - "default": false, - "description": "Opt out of parsing task run scripts to infer the usage spec (arguments and flags). When enabled, mise will derive the usage spec only from the `usage` field, ignoring any `arg()`, `option()`, or `flag()` templates used in run scripts. This can restore previous behavior and avoid the extra template pass over run scripts when collecting specs.", - "type": "boolean" - }, - "monorepo_depth": { - "default": 5, - "description": "Maximum depth to search for task files in monorepo subdirectories.", - "type": "number" - }, - "monorepo_exclude_dirs": { - "default": [], - "description": "Directory patterns to exclude when discovering monorepo subdirectories.", - "type": "array", - "items": { - "type": "string" - } - }, - "monorepo_respect_gitignore": { - "default": true, - "description": "Whether to respect .gitignore files when discovering monorepo subdirectories.", - "type": "boolean" - }, - "source_freshness_equal_mtime_is_fresh": { - "default": false, - "description": "When source mtime equals output mtime, consider sources fresh (use <=). Default false uses strict < comparison.", - "type": "boolean" - }, - "source_freshness_hash_contents": { - "default": false, - "description": "Use content hashing (blake3) instead of metadata for source freshness. More accurate but slower.", - "type": "boolean" - } - } } } }, diff --git a/settings.toml b/settings.toml index 251e2be11a..ef2e7123d4 100644 --- a/settings.toml +++ b/settings.toml @@ -1,6 +1,5 @@ # This file generates code and documentation for settings in mise # When this file is updated, run `mise run render` to update generated files - [activate_aggressive] description = "Pushes tools' bin-paths to the front of PATH instead of allowing modifications of PATH after activation to take precedence." docs = """ @@ -30,6 +29,33 @@ In that case, using this example again, `/some/other/python` will be after mise' env = "MISE_ACTIVATE_AGGRESSIVE" type = "Bool" +[age.identity_files] +description = "[experimental] List of age identity files to use for decryption." +env = "MISE_AGE_IDENTITY_FILES" +optional = true +rust_type = "Vec" +type = "ListPath" + +[age.key_file] +default_docs = "~/.config/mise/age.txt" +description = "[experimental] Path to the age private key file to use for encryption/decryption." +env = "MISE_AGE_KEY_FILE" +optional = true +type = "Path" + +[age.ssh_identity_files] +description = "[experimental] List of SSH identity files to use for age decryption." +env = "MISE_AGE_SSH_IDENTITY_FILES" +optional = true +rust_type = "Vec" +type = "ListPath" + +[age.strict] +default = true +description = "If true, fail when age decryption fails (including when age is not available, the key is missing, or the key is invalid). If false, skip decryption and continue in these cases." +env = "MISE_AGE_STRICT" +type = "Bool" + [all_compile] description = "do not use precompiled binaries for any tool" docs = """ @@ -211,21 +237,6 @@ hide = true optional = true type = "Bool" -[conda.channel] -default = "conda-forge" -description = "Default channel for conda packages." -docs = """ -Default conda channel when installing packages with the conda backend. -Override per-package with `conda:package[channel=bioconda]`. - -The most common channels are: -- `conda-forge` - Community-maintained packages (default) -- `bioconda` - Bioinformatics packages -- `nvidia` - NVIDIA CUDA packages -""" -env = "MISE_CONDA_CHANNEL" -type = "String" - [cd] description = "Path to change to after launching mise" env = "MISE_CD" @@ -287,6 +298,21 @@ enum = ["default", "charm", "base16", "catppuccin", "dracula"] env = "MISE_COLOR_THEME" type = "String" +[conda.channel] +default = "conda-forge" +description = "Default channel for conda packages." +docs = """ +Default conda channel when installing packages with the conda backend. +Override per-package with `conda:package[channel=bioconda]`. + +The most common channels are: +- `conda-forge` - Community-maintained packages (default) +- `bioconda` - Bioinformatics packages +- `nvidia` - NVIDIA CUDA packages +""" +env = "MISE_CONDA_CHANNEL" +type = "String" + [debug] description = "Sets log level to debug" env = "MISE_DEBUG" @@ -453,6 +479,12 @@ tool versions, settings, or watched files change. env = "MISE_ENV_CACHE_TTL" type = "Duration" +[env_file] +description = "Path to a file containing environment variables to automatically load." +env = "MISE_ENV_FILE" +optional = true +type = "Path" + [env_shell_expand] description = "Enable shell-style variable expansion in env values (e.g., $FOO, ${BAR:-default})" docs = """ @@ -478,12 +510,6 @@ env = "MISE_ENV_SHELL_EXPAND" optional = true type = "Bool" -[env_file] -description = "Path to a file containing environment variables to automatically load." -env = "MISE_ENV_FILE" -optional = true -type = "Path" - [erlang.compile] description = "If true, compile erlang from source. If false, use precompiled binaries. If not set, use precompiled binaries if available." env = "MISE_ERLANG_COMPILE" @@ -539,29 +565,6 @@ description = "Timeout in seconds for HTTP requests to fetch new tool versions i env = "MISE_FETCH_REMOTE_VERSIONS_TIMEOUT" type = "Duration" -[gix] -default = true -description = "Use gix for git operations, set to false to shell out to git." -docs = """ -Use gix for git operations. This is generally faster but may not be as compatible if the -system's gix is not the same version as the one used by mise. -""" -env = "MISE_GIX" -hide = true -type = "Bool" - -[global_config_file] -description = "Path to the global mise config file. Default is `~/.config/mise/config.toml`. This must be an env var." -env = "MISE_GLOBAL_CONFIG_FILE" -optional = true -type = "Path" - -[global_config_root] -description = "Path which is used as `{{config_root}}` for the global config file. Default is `$HOME`. This must be an env var." -env = "MISE_GLOBAL_CONFIG_ROOT" -optional = true -type = "Path" - [github.github_attestations] default = true description = "Enable GitHub Artifact Attestations verification for github backend tools." @@ -584,17 +587,42 @@ using SLSA provenance attestations. env = "MISE_GITHUB_SLSA" type = "Bool" -[slsa] +[github_attestations] default = true -description = "Enable SLSA provenance verification globally." +description = "Enable GitHub Artifact Attestations verification for supported tools." docs = """ -Enable/disable SLSA provenance verification globally for all backends that support it. -When enabled, mise will verify the supply-chain integrity of downloaded tools -using SLSA provenance attestations. +Enable/disable GitHub Artifact Attestations verification globally. +When enabled, mise will verify the authenticity and integrity of downloaded tools +using GitHub's artifact attestation system for tools that support it (e.g., Ruby precompiled binaries). + +Individual tools can override this setting with their own `.github_attestations` setting. """ -env = "MISE_SLSA" +env = "MISE_GITHUB_ATTESTATIONS" +type = "Bool" + +[gix] +default = true +description = "Use gix for git operations, set to false to shell out to git." +docs = """ +Use gix for git operations. This is generally faster but may not be as compatible if the +system's gix is not the same version as the one used by mise. +""" +env = "MISE_GIX" +hide = true type = "Bool" +[global_config_file] +description = "Path to the global mise config file. Default is `~/.config/mise/config.toml`. This must be an env var." +env = "MISE_GLOBAL_CONFIG_FILE" +optional = true +type = "Path" + +[global_config_root] +description = "Path which is used as `{{config_root}}` for the global config file. Default is `$HOME`. This must be an env var." +env = "MISE_GLOBAL_CONFIG_ROOT" +optional = true +type = "Path" + [go_default_packages_file] default = "~/.default-go-packages" description = "Path to a file containing default go packages to install when installing go" @@ -647,34 +675,6 @@ env = "MISE_GPG_VERIFY" optional = true type = "Bool" -[github_attestations] -default = true -description = "Enable GitHub Artifact Attestations verification for supported tools." -docs = """ -Enable/disable GitHub Artifact Attestations verification globally. -When enabled, mise will verify the authenticity and integrity of downloaded tools -using GitHub's artifact attestation system for tools that support it (e.g., Ruby precompiled binaries). - -Individual tools can override this setting with their own `.github_attestations` setting. -""" -env = "MISE_GITHUB_ATTESTATIONS" -type = "Bool" - -[http_timeout] -default = "30s" -description = "Timeout in seconds for all HTTP requests in mise." -env = "MISE_HTTP_TIMEOUT" -type = "Duration" - -[http_retries] -default = 0 -description = "Number of retries for HTTP requests in mise." -docs = """ -Uses an exponential backoff strategy. The duration is calculated by taking the base (10ms) to the n-th power. -""" -env = "MISE_HTTP_RETRIES" -type = "Integer" - [hook_env.cache_ttl] default = "0s" description = "Cache hook-env directory checks for this duration. Useful for slow filesystems like NFS." @@ -711,6 +711,21 @@ This setting is useful when: env = "MISE_HOOK_ENV_CHPWD_ONLY" type = "Bool" +[http_retries] +default = 0 +description = "Number of retries for HTTP requests in mise." +docs = """ +Uses an exponential backoff strategy. The duration is calculated by taking the base (10ms) to the n-th power. +""" +env = "MISE_HTTP_RETRIES" +type = "Integer" + +[http_timeout] +default = "30s" +description = "Timeout in seconds for all HTTP requests in mise." +env = "MISE_HTTP_TIMEOUT" +type = "Duration" + [idiomatic_version_file] deprecated = "This has been replaced with the idiomatic_version_file_enable_tools setting." description = "Set to false to disable the idiomatic version files such as .node-version, .ruby-version, etc." @@ -831,6 +846,34 @@ env = "MISE_LIBGIT2" hide = true type = "Bool" +[locked] +default = false +description = "Require lockfile URLs to be present during installation." +docs = """ + +> [!NOTE] +> This setting requires [lockfile](#lockfile) to be enabled. + +When enabled, `mise install` will fail if tools don't have pre-resolved URLs in the lockfile +for the current platform. This prevents API calls to GitHub, aqua registry, etc. and ensures +reproducible installations. + +This is useful in CI/CD environments where you want to: +- Avoid GitHub API rate limits +- Ensure deterministic builds using pre-resolved URLs +- Fail fast if the lockfile is incomplete + +To generate lockfile URLs, run: + +```sh +mise lock +``` + +Equivalent to passing `--locked` to `mise install`. +""" +env = "MISE_LOCKED" +type = "Bool" + [lockfile] default = true description = "Create and read lockfiles for tool versions." @@ -861,34 +904,6 @@ The lockfile is named the same as the config file but with `.lock` instead of `. env = "MISE_LOCKFILE" type = "Bool" -[locked] -default = false -description = "Require lockfile URLs to be present during installation." -docs = """ - -> [!NOTE] -> This setting requires [lockfile](#lockfile) to be enabled. - -When enabled, `mise install` will fail if tools don't have pre-resolved URLs in the lockfile -for the current platform. This prevents API calls to GitHub, aqua registry, etc. and ensures -reproducible installations. - -This is useful in CI/CD environments where you want to: -- Avoid GitHub API rate limits -- Ensure deterministic builds using pre-resolved URLs -- Fail fast if the lockfile is incomplete - -To generate lockfile URLs, run: - -```sh -mise lock -``` - -Equivalent to passing `--locked` to `mise install`. -""" -env = "MISE_LOCKED" -type = "Bool" - [log_level] default = "info" description = "Show more/less output." @@ -1125,6 +1140,12 @@ hide = true optional = true type = "Bool" +[plugin_autoupdate_last_check_duration] +default = "7d" +description = "How long to wait before updating plugins automatically (note this isn't currently implemented)." +env = "MISE_PLUGIN_AUTOUPDATE_LAST_CHECK_DURATION" +type = "String" + [prefer_offline] description = "Prefer locally cached data over remote fetches when possible." docs = """ @@ -1137,12 +1158,6 @@ This is automatically enabled for fast commands like `hook-env`, `activate`, `ex env = "MISE_PREFER_OFFLINE" type = "Bool" -[plugin_autoupdate_last_check_duration] -default = "7d" -description = "How long to wait before updating plugins automatically (note this isn't currently implemented)." -env = "MISE_PLUGIN_AUTOUPDATE_LAST_CHECK_DURATION" -type = "String" - [profile] deprecated = "Use MISE_ENV_FILE instead." description = "Profile to use for mise.${MISE_PROFILE}.toml files." @@ -1336,33 +1351,11 @@ description = "Connect stdin/stdout/stderr to child processes." env = "MISE_RAW" type = "Bool" -[terminal_progress] -default = true -description = "Enable terminal progress indicators (OSC 9;4) for compatible terminals." -docs = """ -Enable terminal progress indicators using OSC 9;4 escape sequences. This provides -native progress bars in the terminal window chrome for terminals that support it, -including Ghostty, iTerm2, VS Code's integrated terminal, Windows Terminal, and VTE-based -terminals (GNOME Terminal, Ptyxis, etc.). - -When enabled, mise will send progress updates to the terminal during operations like -tool installations. The progress bar appears in the terminal's window UI, separate -from the text output. - -mise automatically detects whether your terminal supports OSC 9;4 and will only send -these sequences if supported. Terminals like Alacritty, WezTerm, and kitty -do not support OSC 9;4 and will not receive these sequences. - -Set to false to disable this feature if you prefer not to see these indicators. -""" -env = "MISE_TERMINAL_PROGRESS" -type = "Bool" - -[ruby.apply_patches] -description = "A list of patch files or URLs to apply to ruby source." -env = "MISE_RUBY_APPLY_PATCHES" -optional = true -type = "String" +[ruby.apply_patches] +description = "A list of patch files or URLs to apply to ruby source." +env = "MISE_RUBY_APPLY_PATCHES" +optional = true +type = "String" [ruby.compile] description = "Set to true to compile ruby from source, false to use precompiled binaries." @@ -1383,6 +1376,18 @@ description = "Path to a file containing default ruby gems to install when insta env = "MISE_RUBY_DEFAULT_PACKAGES_FILE" type = "String" +[ruby.github_attestations] +description = "Enable GitHub Artifact Attestations verification for precompiled Ruby binaries." +docs = """ +Override the global `github_attestations` setting for Ruby precompiled binaries. +When enabled, mise will verify the authenticity of precompiled Ruby binaries from jdx/ruby. + +Defaults to the global `github_attestations` setting if not specified. +""" +env = "MISE_RUBY_GITHUB_ATTESTATIONS" +optional = true +type = "Bool" + [ruby.precompiled_arch] description = "Override architecture identifier for precompiled Ruby binaries." env = "MISE_RUBY_PRECOMPILED_ARCH" @@ -1416,18 +1421,6 @@ precompiled_url = "https://my-mirror.example.com/ruby-{version}.{platform}.tar.g env = "MISE_RUBY_PRECOMPILED_URL" type = "String" -[ruby.github_attestations] -description = "Enable GitHub Artifact Attestations verification for precompiled Ruby binaries." -docs = """ -Override the global `github_attestations` setting for Ruby precompiled binaries. -When enabled, mise will verify the authenticity of precompiled Ruby binaries from jdx/ruby. - -Defaults to the global `github_attestations` setting if not specified. -""" -env = "MISE_RUBY_GITHUB_ATTESTATIONS" -optional = true -type = "Bool" - [ruby.ruby_build_opts] description = "Options to pass to ruby-build." env = "MISE_RUBY_BUILD_OPTS" @@ -1503,31 +1496,15 @@ description = "Suppress all `mise run|watch` output except errors—including wh env = "MISE_SILENT" type = "Bool" -[age.identity_files] -description = "[experimental] List of age identity files to use for decryption." -env = "MISE_AGE_IDENTITY_FILES" -optional = true -rust_type = "Vec" -type = "ListPath" - -[age.key_file] -default_docs = "~/.config/mise/age.txt" -description = "[experimental] Path to the age private key file to use for encryption/decryption." -env = "MISE_AGE_KEY_FILE" -optional = true -type = "Path" - -[age.ssh_identity_files] -description = "[experimental] List of SSH identity files to use for age decryption." -env = "MISE_AGE_SSH_IDENTITY_FILES" -optional = true -rust_type = "Vec" -type = "ListPath" - -[age.strict] +[slsa] default = true -description = "If true, fail when age decryption fails (including when age is not available, the key is missing, or the key is invalid). If false, skip decryption and continue in these cases." -env = "MISE_AGE_STRICT" +description = "Enable SLSA provenance verification globally." +docs = """ +Enable/disable SLSA provenance verification globally for all backends that support it. +When enabled, mise will verify the supply-chain integrity of downloaded tools +using SLSA provenance attestations. +""" +env = "MISE_SLSA" type = "Bool" [sops.age_key] @@ -1583,17 +1560,17 @@ description = "Show configured env vars when entering a directory with a mise.to env = "MISE_STATUS_MESSAGE_SHOW_ENV" type = "Bool" -[status.show_tools] -description = "Show configured tools when entering a directory with a mise.toml file." -env = "MISE_STATUS_MESSAGE_SHOW_TOOLS" -type = "Bool" - [status.show_prepare_stale] default = true description = "Show warning when prepare providers have stale dependencies." env = "MISE_STATUS_SHOW_PREPARE_STALE" type = "Bool" +[status.show_tools] +description = "Show configured tools when entering a directory with a mise.toml file." +env = "MISE_STATUS_MESSAGE_SHOW_TOOLS" +type = "Bool" + [status.truncate] default = true description = "Truncate status messages." @@ -1619,6 +1596,85 @@ env = "MISE_SYSTEM_CONFIG_FILE" optional = true type = "Path" +[task.disable_spec_from_run_scripts] +default = false +description = "Opt out of parsing task run scripts to infer the usage spec (arguments and flags). When enabled, mise will derive the usage spec only from the `usage` field, ignoring any `arg()`, `option()`, or `flag()` templates used in run scripts. This can restore previous behavior and avoid the extra template pass over run scripts when collecting specs." +docs = """ +When enabled, `arg()`, `option()`, and `flag()` Tera functions in run scripts will not contribute +to the task's usage spec—only the explicit `usage` field is used. + +This is useful for: +- Skipping the extra template pass over run scripts (performance) +- Avoiding two-pass parsing quirks where template functions return empty strings during spec collection +- Early opt-out before Tera template arguments are removed in 2026.11.0 +""" +env = "MISE_TASK_DISABLE_SPEC_FROM_RUN_SCRIPTS" +type = "Bool" + +[task.monorepo_depth] +default = 5 +description = "Maximum depth to search for task files in monorepo subdirectories." +docs = """ +When using monorepo mode (experimental_monorepo_root = true), this controls how deep +mise will search for task files in subdirectories. + +**Depth levels:** +- 1 = immediate children only (monorepo_root/projects/) +- 2 = grandchildren (monorepo_root/projects/frontend/) +- 5 = default (5 levels deep) + +**Performance tip:** Reduce this value if you have a very large monorepo and notice +slow task discovery. For example, if your projects are all at `projects/*`, set to 2. + +**Example:** +```toml +[settings] +task.monorepo_depth = 3 # Only search 3 levels deep +``` + +Or via environment variable: +```bash +export MISE_TASK_MONOREPO_DEPTH=3 +``` +""" +env = "MISE_TASK_MONOREPO_DEPTH" +type = "Integer" + +[task.monorepo_exclude_dirs] +default = [] +description = "Directory patterns to exclude when discovering monorepo subdirectories." +docs = """ +If empty (default), uses default exclusions: node_modules, target, dist, build. +If you specify any patterns, ONLY those patterns will be excluded (defaults are NOT included). +For example, setting to [".temp", "vendor"] will exclude only those two directories. +""" +env = "MISE_TASK_MONOREPO_EXCLUDE_DIRS" +parse_env = "list_by_comma" +rust_type = "Vec" +type = "ListString" + +[task.monorepo_respect_gitignore] +default = true +description = "Whether to respect .gitignore files when discovering monorepo subdirectories." +docs = """ +When enabled, mise will skip directories that are ignored by .gitignore files +when discovering tasks in a monorepo. +""" +env = "MISE_TASK_MONOREPO_RESPECT_GITIGNORE" +type = "Bool" + +[task.source_freshness_equal_mtime_is_fresh] +default = false +description = "When source mtime equals output mtime, consider sources fresh (use <=). Default false uses strict < comparison." +env = "MISE_TASK_SOURCE_FRESHNESS_EQUAL_MTIME_IS_FRESH" +type = "Bool" + +[task.source_freshness_hash_contents] +default = false +description = "Use content hashing (blake3) instead of metadata for source freshness. More accurate but slower." +env = "MISE_TASK_SOURCE_FRESHNESS_HASH_CONTENTS" +type = "Bool" + [task_disable_paths] default = [] description = "Paths that mise will not look for tasks in." @@ -1658,6 +1714,11 @@ description = "Automatically install missing tools when executing tasks." env = "MISE_TASK_RUN_AUTO_INSTALL" type = "Bool" +[task_show_full_cmd] +description = "Disable truncation of command lines in task execution output. When true, the full command line will be shown." +env = "MISE_TASK_SHOW_CMD_NO_TRUNC" +type = "Bool" + [task_skip] default = [] description = "Tasks to skip when running `mise run`." @@ -1683,9 +1744,26 @@ env = "MISE_TASK_TIMINGS" optional = true type = "Bool" -[task_show_full_cmd] -description = "Disable truncation of command lines in task execution output. When true, the full command line will be shown." -env = "MISE_TASK_SHOW_CMD_NO_TRUNC" +[terminal_progress] +default = true +description = "Enable terminal progress indicators (OSC 9;4) for compatible terminals." +docs = """ +Enable terminal progress indicators using OSC 9;4 escape sequences. This provides +native progress bars in the terminal window chrome for terminals that support it, +including Ghostty, iTerm2, VS Code's integrated terminal, Windows Terminal, and VTE-based +terminals (GNOME Terminal, Ptyxis, etc.). + +When enabled, mise will send progress updates to the terminal during operations like +tool installations. The progress bar appears in the terminal's window UI, separate +from the text output. + +mise automatically detects whether your terminal supports OSC 9;4 and will only send +these sequences if supported. Terminals like Alacritty, WezTerm, and kitty +do not support OSC 9;4 and will not receive these sequences. + +Set to false to disable this feature if you prefer not to see these indicators. +""" +env = "MISE_TERMINAL_PROGRESS" type = "Bool" [trace] @@ -1842,82 +1920,3 @@ server list inside `mise cache path`, folder `zig` as `community-mirrors.txt`. """ env = "MISE_ZIG_USE_COMMUNITY_MIRRORS" type = "Bool" - -[task.disable_spec_from_run_scripts] -default = false -description = "Opt out of parsing task run scripts to infer the usage spec (arguments and flags). When enabled, mise will derive the usage spec only from the `usage` field, ignoring any `arg()`, `option()`, or `flag()` templates used in run scripts. This can restore previous behavior and avoid the extra template pass over run scripts when collecting specs." -docs = """ -When enabled, `arg()`, `option()`, and `flag()` Tera functions in run scripts will not contribute -to the task's usage spec—only the explicit `usage` field is used. - -This is useful for: -- Skipping the extra template pass over run scripts (performance) -- Avoiding two-pass parsing quirks where template functions return empty strings during spec collection -- Early opt-out before Tera template arguments are removed in 2026.11.0 -""" -env = "MISE_TASK_DISABLE_SPEC_FROM_RUN_SCRIPTS" -type = "Bool" - -[task.monorepo_depth] -default = 5 -description = "Maximum depth to search for task files in monorepo subdirectories." -docs = """ -When using monorepo mode (experimental_monorepo_root = true), this controls how deep -mise will search for task files in subdirectories. - -**Depth levels:** -- 1 = immediate children only (monorepo_root/projects/) -- 2 = grandchildren (monorepo_root/projects/frontend/) -- 5 = default (5 levels deep) - -**Performance tip:** Reduce this value if you have a very large monorepo and notice -slow task discovery. For example, if your projects are all at `projects/*`, set to 2. - -**Example:** -```toml -[settings] -task.monorepo_depth = 3 # Only search 3 levels deep -``` - -Or via environment variable: -```bash -export MISE_TASK_MONOREPO_DEPTH=3 -``` -""" -env = "MISE_TASK_MONOREPO_DEPTH" -type = "Integer" - -[task.monorepo_exclude_dirs] -default = [] -description = "Directory patterns to exclude when discovering monorepo subdirectories." -docs = """ -If empty (default), uses default exclusions: node_modules, target, dist, build. -If you specify any patterns, ONLY those patterns will be excluded (defaults are NOT included). -For example, setting to [".temp", "vendor"] will exclude only those two directories. -""" -env = "MISE_TASK_MONOREPO_EXCLUDE_DIRS" -parse_env = "list_by_comma" -rust_type = "Vec" -type = "ListString" - -[task.monorepo_respect_gitignore] -default = true -description = "Whether to respect .gitignore files when discovering monorepo subdirectories." -docs = """ -When enabled, mise will skip directories that are ignored by .gitignore files -when discovering tasks in a monorepo. -""" -env = "MISE_TASK_MONOREPO_RESPECT_GITIGNORE" -type = "Bool" - -[task.source_freshness_equal_mtime_is_fresh] -default = false -description = "When source mtime equals output mtime, consider sources fresh (use <=). Default false uses strict < comparison." -env = "MISE_TASK_SOURCE_FRESHNESS_EQUAL_MTIME_IS_FRESH" -type = "Bool" - -[task.source_freshness_hash_contents] -default = false -description = "Use content hashing (blake3) instead of metadata for source freshness. More accurate but slower." -env = "MISE_TASK_SOURCE_FRESHNESS_HASH_CONTENTS" -type = "Bool" diff --git a/src/config/settings.rs b/src/config/settings.rs index 636d0896b0..2612b4db0a 100644 --- a/src/config/settings.rs +++ b/src/config/settings.rs @@ -831,4 +831,44 @@ mod tests { assert!(!settings.offline); Settings::reset(None); } + + #[test] + fn test_settings_toml_is_sorted() { + let content = + std::fs::read_to_string(concat!(env!("CARGO_MANIFEST_DIR"), "/settings.toml")) + .expect("failed to read settings.toml"); + let table: toml::Table = content.parse().expect("failed to parse settings.toml"); + + fn collect_keys(table: &toml::Table, prefix: &str) -> Vec { + let mut keys = Vec::new(); + for (key, value) in table { + let full_key = if prefix.is_empty() { + key.clone() + } else { + format!("{prefix}.{key}") + }; + if let toml::Value::Table(sub) = value { + // A nested table that has no "type" or "description" is a grouping table + // (e.g., [aqua], [node]), not a setting itself. + if !sub.contains_key("type") && !sub.contains_key("description") { + keys.extend(collect_keys(sub, &full_key)); + continue; + } + } + keys.push(full_key); + } + keys + } + + let keys = collect_keys(&table, ""); + let mut sorted = keys.clone(); + sorted.sort(); + + for (i, (got, expected)) in keys.iter().zip(sorted.iter()).enumerate() { + assert_eq!( + got, expected, + "settings.toml is not alphabetically sorted at index {i}: found \"{got}\", expected \"{expected}\". Run the sort script or reorder manually." + ); + } + } }