Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
c9f85a5
feat(installs): list installations and choose the one unlocked reques…
jdx Oct 5, 2026
6f067f2
fix(installs): answer a shared-root selection only from that root
jdx Oct 5, 2026
fc77e3f
fix(installs): resolve unlocked requests across roots from the user's…
jdx Oct 5, 2026
b2fd630
fix(installs): give an ambiguous request no installation path
jdx Oct 5, 2026
b5f0bc6
fix(installs): select makes the version link when it is missing or stale
jdx Oct 5, 2026
90bef0b
fix(installs): unlink only the version links that name the removed in…
jdx Oct 5, 2026
753b35c
fix(installs): move the tool's version link across variants on select…
jdx Oct 5, 2026
3d76824
fix(installs): uninstall forgets the selection of the installation it…
jdx Oct 5, 2026
e921029
fix(installs): link an adopted shared installation, list ambiguous co…
jdx Oct 5, 2026
e5df859
fix(install): use an install made before the layout over a pruned sel…
jdx Oct 5, 2026
a239791
fix(install): rebuild a missing version link to the selected installa…
jdx Oct 5, 2026
9adf839
fix(installs): write and forget selections under the catalog lock
jdx Oct 5, 2026
08ce826
fix(installs): find a selected shared installation by its receipt whe…
jdx Oct 5, 2026
6ef9ad6
fix(installs): move the version links with a selection under the same…
jdx Oct 5, 2026
24e9478
fix(installs): select a shared installation by its receipt when the s…
jdx Oct 5, 2026
4e87aac
fix(installs): count a shared root's installations by their receipts …
jdx Oct 5, 2026
73f68d4
fix(installs): repair missing version links under the catalog lock
jdx Oct 5, 2026
d3bc9aa
fix(installs): select a shared installation by its own receipt when i…
jdx Oct 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion docs/.vitepress/cli-reference.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ const guides: Record<string, [string, string]> = {
set: ["Environment variables", "/environments/"],
unset: ["Environment variables", "/environments/"],
exec: ["Running tools", "/dev-tools/"],
installs: ["Install layout", "/dev-tools/install-layout.html"],
backends: ["Choosing backends", "/dev-tools/backends/"],
config: ["Configuration", "/configuration.html"],
edit: ["Configuration", "/configuration.html"],
Expand Down Expand Up @@ -145,7 +146,7 @@ const guides: Record<string, [string, string]> = {
const categories = [
[
"Install and inspect tools",
"use install install-into uninstall unuse upgrade outdated lock latest ls ls-remote tool where which bin-paths registry search backends link sync prune reshim tool-stub packslip",
"use install install-into installs uninstall unuse upgrade outdated lock latest ls ls-remote tool where which bin-paths registry search backends link sync prune reshim tool-stub packslip",
],
[
"Shell and environment",
Expand Down
11 changes: 11 additions & 0 deletions docs/.vitepress/cli_commands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -697,6 +697,17 @@ export const commands: { [key: string]: Command } = {
"install-into": {
hide: false,
},
installs: {
hide: false,
subcommands: {
ls: {
hide: false,
},
select: {
hide: false,
},
},
},
latest: {
hide: false,
},
Expand Down
1 change: 1 addition & 0 deletions docs/cli/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ Choose a command family below. Its page lists the available subcommands.
- [`mise use`](/cli/use.html) — Install a tool and add it to configuration
- [`mise install`](/cli/install.html) — Install a tool version
- [`mise install-into`](/cli/install-into.html) — Install a tool version to a specific path
- [`mise installs`](/cli/installs.html) — [experimental] Inspect and choose installations of the identity install layout
- [`mise uninstall`](/cli/uninstall.html) — Remove installed tool versions
- [`mise unuse`](/cli/unuse.html) — Remove tool requests from configuration and prune unused installations
- [`mise upgrade`](/cli/upgrade.html) — Upgrade outdated tools
Expand Down
34 changes: 34 additions & 0 deletions docs/cli/installs.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
---
description: "[experimental] Inspect and choose installations of the identity install layout"
---

<!-- @generated by usage-cli from usage spec -->
# `mise installs`

- **Usage:** `mise installs [SUBCOMMAND]`
- **Effect:** read-only
- **Source code:** [`src/cli/installs/mod.rs`](https://github.com/jdx/mise/blob/main/src/cli/installs/mod.rs)

[experimental] Inspect and choose installations of the identity install layout

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 and choose which one requests
without a lockfile use.

## Flags
- **`-h --help`** — Print help

## Subcommands

- [`mise installs ls [-J --json] [--no-header] [TOOL]…`](/cli/installs/ls.html)
- [`mise installs select <INSTALLATION>`](/cli/installs/select.html)

<!-- generated reference navigation -->

## Related documentation

- [Install layout](/dev-tools/install-layout.html).
- [All commands](/cli/).
- [Global flags and argument syntax](/cli/#global-flags).
49 changes: 49 additions & 0 deletions docs/cli/installs/ls.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
---
description: "List the installations of the identity install layout"
---

<!-- @generated by usage-cli from usage spec -->
# `mise installs ls`

- **Usage:** `mise installs ls [-J --json] [--no-header] [TOOL]…`
- **Aliases:** `list`
- **Effect:** read-only
- **Source code:** [`src/cli/installs/ls.rs`](https://github.com/jdx/mise/blob/main/src/cli/installs/ls.rs)

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 says which installation requests without
a lockfile use (`selected`), which a lockfile adopted (`pinned`), and which
live in a read-only shared installs directory (`shared`).

## Arguments
- **`[TOOL]…`** — Only show the installations of these tools

## Flags
- **`-J --json`** — Output in JSON format
- **`--no-header`** — Don't display headers
- **`-h --help`** — Print help

## Examples

Every installation in the identity layout

```
mise installs ls
```

The installations of node, as JSON

```
mise installs ls node --json
```

<!-- generated reference navigation -->

## Related documentation

- [Install layout](/dev-tools/install-layout.html).
- [`mise installs [SUBCOMMAND]`](/cli/installs.html).
- [Global flags and argument syntax](/cli/#global-flags).
46 changes: 46 additions & 0 deletions docs/cli/installs/select.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
---
description: "Choose the installation that requests without a lockfile use"
---

<!-- @generated by usage-cli from usage spec -->
# `mise installs select`

- **Usage:** `mise installs select <INSTALLATION>`
- **Effect:** modifies state
- **Source code:** [`src/cli/installs/select.rs`](https://github.com/jdx/mise/blob/main/src/cli/installs/select.rs)

Choose the installation that requests without a lockfile use

Several installations can answer the same request: a refresh that could not
replace a lockfile's installation in place, or installations made for
different lockfiles. Requests without a lockfile entry use the one selected
for their tool, version, platform and options, and when none is selected and
several match, mise stops and asks for 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.

## Arguments
- **`<INSTALLATION>`** — The installation to select: its directory name, or its path

## Flags
- **`-h --help`** — Print help

## Examples

Find jq's installations, then choose one

```
mise installs ls jq
mise installs select jq-hm3qa4vb
```

<!-- generated reference navigation -->

## Related documentation

- [Install layout](/dev-tools/install-layout.html).
- [`mise installs [SUBCOMMAND]`](/cli/installs.html).
- [Global flags and argument syntax](/cli/#global-flags).
52 changes: 51 additions & 1 deletion docs/dev-tools/install-layout.md
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,54 @@ one project does not retarget what another project's unlocked request selects.
Unlocked selections are local to your machine. To carry a particular choice to
other machines or teammates, commit a lockfile.

## Choosing an installation: `mise installs`

Several installations can answer one unlocked request: a forced refresh that
could not replace a lockfile's installation in place, or installations that
lockfiles in other projects made. `mise installs ls` lists every installation
and says which one each request uses:

```sh
mise installs ls jq
# Installation Tool Version Platform Status
# jq-hm3qa4vb jq 1.7.1 linux-x64 selected
# jq-ezjqmxa4 jq 1.7.1 linux-x64 pinned
```

`selected` is the installation requests without a lockfile use, `pinned` means a
lockfile adopted it, and `shared` means it is in a read-only shared installs
directory. Add `--json` for the full identity, including options and the
artifact checksum.

`mise installs select` makes another installation the selected one, and points
the version link (`installs/jq/1.7.1`) at it:

```sh
mise installs select jq-ezjqmxa4
```

The selection applies to every project on the machine that asks for the same
tool, version, platform and options without a lockfile. Projects whose lockfile
pins an artifact keep that artifact's installation. To select an installation in
a shared installs directory, pass its path; the selection is kept in your own
installs directory, and nothing is written to the shared one.

**When nothing is selected.** The first unlocked install of a request selects
the installation it made. If the selection is lost (the catalog was rebuilt from
receipts, for example), or the request was only ever installed by lockfiles,
mise looks at the installations that answer it. With exactly one, mise uses and
selects it. With several, mise stops instead of guessing, and lists them:

```text
mise ERROR jq@1.7.1 matches several installations and none is selected:
jq-hm3qa4vb
jq-ezjqmxa4 (a lockfile pins it)
Choose one with `mise installs select <dir>`, or install a fresh one with `mise install --force jq@1.7.1`
```

If the selected installation has since been pruned, installing restores it in
the same directory rather than choosing another one.

## Pruning and uninstalling

Both work on one installation directory at a time.
Expand All @@ -283,7 +331,9 @@ Both work on one installation directory at a time.
the install store that has neither a receipt nor a reservation in the
catalog. Removing one variant leaves the others in place.
- Removing an installation keeps its catalog record, so installing the same
identity again lands in the same directory.
identity again lands in the same directory. `mise uninstall` also forgets the
selection that named it, so the requests it answered choose again; a pruned
installation keeps its selection and is restored in place.
- `mise prune` keeps an installation while a tracked config needs it. An unlocked
request needs the installation it selects. A tracked lockfile entry needs the
installations of its backend and version, narrowed to the pinned artifact when
Expand Down
3 changes: 3 additions & 0 deletions docs/public/llms.txt
Original file line number Diff line number Diff line change
Expand Up @@ -349,6 +349,9 @@
- [mise implode](https://mise.jdx.dev/cli/implode.html): Remove the mise CLI and all related data
- [mise install](https://mise.jdx.dev/cli/install.html): Install a tool version
- [mise install-into](https://mise.jdx.dev/cli/install-into.html): Install a tool version to a specific path
- [mise installs](https://mise.jdx.dev/cli/installs.html): [experimental] Inspect and choose installations of the identity install layout
- [mise installs ls](https://mise.jdx.dev/cli/installs/ls.html): List the installations of the identity install layout
- [mise installs select](https://mise.jdx.dev/cli/installs/select.html): Choose the installation that requests without a lockfile use
- [mise latest](https://mise.jdx.dev/cli/latest.html): Resolve the latest matching version request for a tool
- [mise link](https://mise.jdx.dev/cli/link.html): Symlink a tool version into mise
- [mise lock](https://mise.jdx.dev/cli/lock.html): Create or refresh lockfile versions, checksums, and download URLs
Expand Down
Loading
Loading