mise
mise is the only allowed runtime and tool manager for projects this skill
applies to.
Every project pins all tools in mise.toml at the repo root,
records resolved versions in a committed mise.lock,
disables the ubi and asdf backends,
routes Python CLIs through pipx
and Node CLIs through npm,
and uses aqua (or mise's built-in core) for everything else.
Hard rules
mise is the only manager.
No brew install,
nvm,
asdf,
volta,
fnm,
pyenv,
rbenv,
tfenv,
goenv,
ad-hoc installers,
or curl-pipe scripts.
Every mise.toml carries this [settings] block:
[settings]
disable_backends = ["ubi", "asdf"]
lockfile = true
disable_backends removes ubi and asdf from the resolution
chain project-wide;
core runtimes (go, node, python, etc.) are unaffected because mise
keeps their aqua and core entries.
lockfile = true makes mise read and write mise.lock.
Backend per tool:
- Python CLIs (e.g.
black, ruff, poetry) → pipx: —
mise's pipx backend uses uvx under the hood and isolates each
CLI in its own venv,
so no aqua-bundled Python sneaks in.
- Node / JS CLIs (e.g.
typescript, prettier, eslint) → npm: —
mise's npm backend installs through a mise-managed Node,
so no aqua-bundled Node sneaks in.
- Everything else
(runtimes, single-binary CLIs like
terraform, kubectl) →
bare name,
resolved by mise to aqua or core.
- Rust CLI not in aqua →
cargo:.
Ruby CLI not in aqua → gem:.
ubi and asdf are out of bounds (see rule 2).
Versions are fully pinned.
No latest,
no lts,
no major-only (20),
no minor-only (20.11).
Always a complete version (20.11.1, 1.22.4, 1.7.5).
mise.lock is committed alongside mise.toml.
The project config is mise.toml at the repo root.
No .mise.toml,
no .tool-versions,
no .nvmrc,
no .python-version,
no .ruby-version.
If .mise.toml already exists,
do not edit it in place —
run the migration procedure.
Only the [tools] and [settings] sections are in scope.
[env],
[tasks],
and other sections — handle separately.
Local setup only.
CI integration is out of scope for this skill.
mise.lock is mise-generated, never hand-edited.
Only a mise command may write it —
normally mise install.
Never create, edit, or patch mise.lock by hand
or with any non-mise tool:
not the versions,
not the checksums,
not the platform entries.
To change what the lockfile records,
edit mise.toml and run mise install;
the lockfile follows.
Confirming what mise will do
Run mise registry <tool> to see mise's backend chain for a tool.
With ubi and asdf disabled,
mise falls through to the next entry in the chain
(typically aqua or core).
If nothing remains,
mise refuses to install —
that is the expected, visible failure,
and the trigger for the Tool not available procedure below.
Clarify before acting
Ask the user when any of these are unclear:
- which exact version to pin —
never invent one,
never write
latest;
- which backend to use when neither pipx nor npm applies and aqua does
not have the tool;
- whether to delete legacy config files
(
.nvmrc, .tool-versions, Brewfile, etc.) during migration;
- whether to make an exception for
asdf —
see Tool not available below.
If you cannot reach the network to resolve "the latest" version,
ask the user for an exact version instead of guessing.
Verifying memory against docs
mise changes settings, registry entries, and backend behavior between
releases.
If anything below — backend syntax, settings keys, registry contents,
trust behavior, lockfile semantics — looks unfamiliar or stale,
verify at https://mise.jdx.dev/ before writing config or running
commands.
Do not guess.
Procedure: new project setup
Confirm there is no existing mise.toml or .mise.toml.
If .mise.toml exists,
stop and run the migration procedure.
Create mise.toml at the repo root:
[settings]
disable_backends = ["ubi", "asdf"]
lockfile = true
[tools]
For every runtime and CLI the project uses,
resolve a complete version
(ask the user if unspecified)
and add an entry per the Backend per tool rule.
Examples:
[tools]
node = "20.11.1"
go = "1.22.4"
terraform = "1.7.5"
"pipx:black" = "24.4.2"
"npm:typescript" = "5.4.5"
Run mise trust to authorize the file.
Initialize the lockfile and install:
touch mise.lock && mise install
Verify with mise ls that the pinned versions are active.
Commit both mise.toml and mise.lock.
Procedure: add or pin a tool
- Verify
mise.toml exists at the repo root with the required
[settings] block.
If [settings] is missing or incomplete,
add it.
- Resolve the exact version to pin
(ask if unspecified).
- Pick the backend per the Backend per tool rule.
Run
mise registry <tool> when in doubt about which backend mise
will pick.
- Add the entry under
[tools].
- Run
mise trust.
In normal mode trust persists by path;
in paranoid mode mise hashes the file and re-trust is required
after each modification —
running mise trust after every write covers both modes safely.
- Run
mise install to materialize the version and refresh
mise.lock.
- Verify with
mise ls,
then commit mise.toml and mise.lock.
Procedure: migrate from another manager
Trigger when any of these are present:
.mise.toml,
.nvmrc,
.tool-versions,
.python-version,
.ruby-version,
Brewfile containing runtime or CLI tools,
volta or fnm config,
README lines like nvm install … or brew install <runtime>.
- List every tool managed by the other system,
resolving any ranges or
latest markers to a concrete pinned
version.
- Present a migration plan to the user:
the proposed
mise.toml (with [settings] and [tools]),
files that will be deleted,
docs lines that need rewriting.
For an existing .mise.toml:
propose renaming to mise.toml and adding the required
[settings] block —
do not edit .mise.toml in place.
- Wait for explicit confirmation before making changes.
- After confirmation:
write
mise.toml,
delete the obsolete config files,
update docs to reference mise install.
mise trust,
touch mise.lock && mise install,
mise ls.
- Commit
mise.toml and mise.lock.
Procedure: tool not available in any allowed backend
If mise registry <tool> shows only ubi or asdf,
or shows nothing at all:
- Stop.
- Surface the situation to the user:
tool name,
the backends mise lists for it,
the project policy that disables
ubi and asdf.
- Offer alternatives in this order:
- pick a different tool that has an aqua / core / pipx / npm /
cargo / gem option;
- install through a language-native manager
(
pipx, npm, cargo, gem)
if the tool's language matches one;
- as a last resort,
ask the user to approve removing
asdf from disable_backends
for this project.
- If the user approves the asdf override:
keep
ubi disabled,
write the tool entry,
and add a TOML comment on the entry recording why
(tool name, what other backends were checked, why none worked).
Never re-enable ubi.
Reporting
After changes,
state which mise.toml was written or updated,
which tools were added or pinned (with backend and version),
which legacy files were removed,
the state of mise.lock (created or refreshed),
and the commands the user should run next
(mise trust, mise install, mise ls).
1---2name: mise3description: Configures mise as the sole runtime and CLI tool manager for a project. Every mise.toml carries [settings] disable_backends = ["ubi", "asdf"] and lockfile = true, pins every version fully, commits mise.lock, routes Python CLIs through pipx and Node CLIs through npm, and rejects competing managers (brew/nvm/asdf/volta/fnm/pyenv/ubi).4---56# mise78mise is the only allowed runtime and tool manager for projects this skill9applies to.10Every project pins all tools in `mise.toml` at the repo root,11records resolved versions in a committed `mise.lock`,12disables the `ubi` and `asdf` backends,13routes Python CLIs through pipx14and Node CLIs through npm,15and uses aqua (or mise's built-in core) for everything else.1617## Hard rules18191. **mise is the only manager.**20 No `brew install`,21 `nvm`,22 `asdf`,23 `volta`,24 `fnm`,25 `pyenv`,26 `rbenv`,27 `tfenv`,28 `goenv`,29 ad-hoc installers,30 or curl-pipe scripts.312. **Every `mise.toml` carries this `[settings]` block:**3233 ```toml34 [settings]35 disable_backends = ["ubi", "asdf"]36 lockfile = true37 ```3839 `disable_backends` removes `ubi` and `asdf` from the resolution40 chain project-wide;41 core runtimes (go, node, python, etc.) are unaffected because mise42 keeps their aqua and core entries.43 `lockfile = true` makes mise read and write `mise.lock`.443. **Backend per tool:**45 - Python CLIs (e.g. `black`, `ruff`, `poetry`) → `pipx:` —46 mise's pipx backend uses `uvx` under the hood and isolates each47 CLI in its own venv,48 so no aqua-bundled Python sneaks in.49 - Node / JS CLIs (e.g. `typescript`, `prettier`, `eslint`) → `npm:` —50 mise's npm backend installs through a mise-managed Node,51 so no aqua-bundled Node sneaks in.52 - Everything else53 (runtimes, single-binary CLIs like `terraform`, `kubectl`) →54 bare name,55 resolved by mise to aqua or core.56 - Rust CLI not in aqua → `cargo:`.57 Ruby CLI not in aqua → `gem:`.58 - `ubi` and `asdf` are out of bounds (see rule 2).594. **Versions are fully pinned.**60 No `latest`,61 no `lts`,62 no major-only (`20`),63 no minor-only (`20.11`).64 Always a complete version (`20.11.1`, `1.22.4`, `1.7.5`).65 `mise.lock` is committed alongside `mise.toml`.665. **The project config is `mise.toml`** at the repo root.67 No `.mise.toml`,68 no `.tool-versions`,69 no `.nvmrc`,70 no `.python-version`,71 no `.ruby-version`.72 If `.mise.toml` already exists,73 do not edit it in place —74 run the migration procedure.756. **Only the `[tools]` and `[settings]` sections are in scope.**76 `[env]`,77 `[tasks]`,78 and other sections — handle separately.797. **Local setup only.**80 CI integration is out of scope for this skill.818. **`mise.lock` is mise-generated, never hand-edited.**82 Only a mise command may write it —83 normally `mise install`.84 Never create, edit, or patch `mise.lock` by hand85 or with any non-mise tool:86 not the versions,87 not the checksums,88 not the platform entries.89 To change what the lockfile records,90 edit `mise.toml` and run `mise install`;91 the lockfile follows.9293## Confirming what mise will do9495Run `mise registry <tool>` to see mise's backend chain for a tool.96With `ubi` and `asdf` disabled,97mise falls through to the next entry in the chain98(typically aqua or core).99If nothing remains,100mise refuses to install —101that is the expected, visible failure,102and the trigger for the **Tool not available** procedure below.103104## Clarify before acting105106Ask the user when any of these are unclear:107108- which exact version to pin —109 never invent one,110 never write `latest`;111- which backend to use when neither pipx nor npm applies and aqua does112 not have the tool;113- whether to delete legacy config files114 (`.nvmrc`, `.tool-versions`, `Brewfile`, etc.) during migration;115- whether to make an exception for `asdf` —116 see **Tool not available** below.117118If you cannot reach the network to resolve "the latest" version,119ask the user for an exact version instead of guessing.120121## Verifying memory against docs122123mise changes settings, registry entries, and backend behavior between124releases.125If anything below — backend syntax, settings keys, registry contents,126trust behavior, lockfile semantics — looks unfamiliar or stale,127verify at https://mise.jdx.dev/ before writing config or running128commands.129Do not guess.130131## Procedure: new project setup1321331. Confirm there is no existing `mise.toml` or `.mise.toml`.134 If `.mise.toml` exists,135 stop and run the migration procedure.1362. Create `mise.toml` at the repo root:137138 ```toml139 [settings]140 disable_backends = ["ubi", "asdf"]141 lockfile = true142143 [tools]144 ```1451463. For every runtime and CLI the project uses,147 resolve a complete version148 (ask the user if unspecified)149 and add an entry per the **Backend per tool** rule.150 Examples:151152 ```toml153 [tools]154 node = "20.11.1"155 go = "1.22.4"156 terraform = "1.7.5"157 "pipx:black" = "24.4.2"158 "npm:typescript" = "5.4.5"159 ```1601614. Run `mise trust` to authorize the file.1625. Initialize the lockfile and install:163164 ```sh165 touch mise.lock && mise install166 ```1671686. Verify with `mise ls` that the pinned versions are active.1697. Commit both `mise.toml` and `mise.lock`.170171## Procedure: add or pin a tool1721731. Verify `mise.toml` exists at the repo root with the required174 `[settings]` block.175 If `[settings]` is missing or incomplete,176 add it.1772. Resolve the exact version to pin178 (ask if unspecified).1793. Pick the backend per the **Backend per tool** rule.180 Run `mise registry <tool>` when in doubt about which backend mise181 will pick.1824. Add the entry under `[tools]`.1835. Run `mise trust`.184 In normal mode trust persists by path;185 in paranoid mode mise hashes the file and re-trust is required186 after each modification —187 running `mise trust` after every write covers both modes safely.1886. Run `mise install` to materialize the version and refresh189 `mise.lock`.1907. Verify with `mise ls`,191 then commit `mise.toml` and `mise.lock`.192193## Procedure: migrate from another manager194195Trigger when any of these are present:196`.mise.toml`,197`.nvmrc`,198`.tool-versions`,199`.python-version`,200`.ruby-version`,201`Brewfile` containing runtime or CLI tools,202`volta` or `fnm` config,203README lines like `nvm install …` or `brew install <runtime>`.2042051. List every tool managed by the other system,206 resolving any ranges or `latest` markers to a concrete pinned207 version.2082. Present a migration plan to the user:209 the proposed `mise.toml` (with `[settings]` and `[tools]`),210 files that will be deleted,211 docs lines that need rewriting.212 For an existing `.mise.toml`:213 propose renaming to `mise.toml` and adding the required214 `[settings]` block —215 do not edit `.mise.toml` in place.2163. **Wait for explicit confirmation** before making changes.2174. After confirmation:218 write `mise.toml`,219 delete the obsolete config files,220 update docs to reference `mise install`.2215. `mise trust`,222 `touch mise.lock && mise install`,223 `mise ls`.2246. Commit `mise.toml` and `mise.lock`.225226## Procedure: tool not available in any allowed backend227228If `mise registry <tool>` shows only `ubi` or `asdf`,229or shows nothing at all:2302311. Stop.2322. Surface the situation to the user:233 tool name,234 the backends mise lists for it,235 the project policy that disables `ubi` and `asdf`.2363. Offer alternatives in this order:237 - pick a different tool that has an aqua / core / pipx / npm /238 cargo / gem option;239 - install through a language-native manager240 (`pipx`, `npm`, `cargo`, `gem`)241 if the tool's language matches one;242 - as a last resort,243 ask the user to approve removing `asdf` from `disable_backends`244 for this project.2454. If the user approves the asdf override:246 keep `ubi` disabled,247 write the tool entry,248 and add a TOML comment on the entry recording why249 (tool name, what other backends were checked, why none worked).250 Never re-enable `ubi`.251252## Reporting253254After changes,255state which `mise.toml` was written or updated,256which tools were added or pinned (with backend and version),257which legacy files were removed,258the state of `mise.lock` (created or refreshed),259and the commands the user should run next260(`mise trust`, `mise install`, `mise ls`).