coreybutler/nvm-windows · error

Version not installed. Run "nvm ls" to see available…

Error message

Version not installed. Run "nvm ls" to see available versions.

What it means

Generic terminal error emitted by `nvm use` when the requested version+arch is not installed and no cross-architecture suggestion applies. It directs the user to `nvm ls` to see what is available. Note the source sends this Status after the arch-hint Status without returning, so both messages can be emitted for the same failure.

Solutions

  1. Run `nvm ls` and use an exact version that is listed as installed
  2. Install the version first: `nvm install <version>` then `nvm use <version>`
  3. Verify NVM_HOME points to the directory that actually contains the v<version> folders
  4. If the version folder exists but is corrupt, remove it (`nvm uninstall <version>`) and reinstall

Example fix

# before
nvm use 21.6.1

# after
nvm ls              # confirm availability
nvm install 21.6.1
nvm use 21.6.1
Defensive patterns

Strategy: validation

Validate before calling

versions, _ := node.GetInstalled(env.root)
found := false
for _, v := range versions {
    if strings.HasPrefix(v, "v"+requested) { found = true }
}
if !found {
    // install before use
    _ = exec.Command("nvm", "install", requested).Run()
}

Prevention

When it happens

Trigger: `nvm use 18.0.0` (or with any arch) where v18.0.0 is not present under the NVM root (env.root) for either 32- or 64-bit, i.e. IsVersionInstalled is false for the requested arch and the opposite arch too.

Common situations: Typo in the version string (e.g. `nvm use 18.0` vs installed `18.0.0`), fresh machine where versions were never installed, NVM_HOME/NVM_SYMLINK pointing at an empty or wrong directory, or a partially deleted version directory after a failed uninstall.

Related errors


AI-assisted analysis of coreybutler/nvm-windows@5b18223ca1 (2026-08-15). Data as JSON: /api/errors/1aee1825117bedc0. Report an issue: GitHub.

Appendix: source

Thrown at src/nvm.go:1174

		// Check if a change is needed
		curVersion, curCpuarch := node.GetCurrentVersion()
		if version == curVersion && cpuarch == curCpuarch {
			fmt.Println("node v" + version + " (" + cpuarch + "-bit) is already in use.")
			status <- Status{Done: true}
			return
		}

		// Make sure the version is installed. If not, warn.
		if !node.IsVersionInstalled(env.root, version, cpuarch) {
			err = fmt.Errorf("node v%s (%v-bit) is not installed.", version, cpuarch)
			if notifications {
				status <- Status{Err: err, Done: true}
			}
			if (cpuarch == "32" && node.IsVersionInstalled(env.root, version, "64")) || (cpuarch == "64" && node.IsVersionInstalled(env.root, version, "32")) {
				status <- Status{Err: fmt.Errorf("Did you mean node v%s (%v-bit)?\nIf so, type \"nvm use %s %v\" to use it.", version, cpuarch, version, cpuarch), Done: true}
			}
			status <- Status{Err: fmt.Errorf("Version not installed. Run \"nvm ls\" to see available versions."), Done: true}
		}

		// Remove symlink if it already exists
		sym, _ := os.Lstat(env.symlink)
		if sym != nil {
			err = validSymlink(env.symlink)
			if err != nil {
				status <- Status{Err: err, Done: true}
			}

			// _, err := runElevated(fmt.Sprintf(`"%s" cmd /C rmdir "%s"`, filepath.Join(env.root, "elevate.cmd"), filepath.Clean(env.symlink)))
			_, err := elevatedRun("rmdir", filepath.Clean(env.symlink))
			if err != nil {
				if accessDenied(err) {
					status <- Status{Err: err, Done: true}
				}
			}
		}

View on GitHub (pinned to 5b18223ca1)