Skip to content

fix(backend): allow upgrading vfox backend tools with symlinked installations#7012

Merged
jdx merged 7 commits intojdx:mainfrom
TyceHerrman:nix-backend-auto-upgrade
Jan 14, 2026
Merged

fix(backend): allow upgrading vfox backend tools with symlinked installations#7012
jdx merged 7 commits intojdx:mainfrom
TyceHerrman:nix-backend-auto-upgrade

Conversation

@TyceHerrman
Copy link
Contributor

@TyceHerrman TyceHerrman commented Nov 19, 2025

Summary

Fixes #5909

Vfox backend tools (like nix:helmfile) create symlinks as part of their normal installation process (e.g., symlinks to /nix/store). The upgrade check was incorrectly skipping these symlinked versions, causing them to never appear in mise outdated or be upgraded.

Changes

  • Override symlink_path() in VfoxBackend to return None
  • This indicates these are backend-managed symlinks (not user-created version aliases)
  • Allows vfox backend tools to be included in upgrade checks

🤖 Generated with Claude Code


Note

Improves upgrade handling for symlink-based installs and tightens CLI display logic.

  • Backend: update symlink_path() to only consider symlinks pointing within installs/ as user-managed aliases; backend-managed symlinks (e.g., HTTP cache) no longer cause upgrades to be skipped
  • CLI ls: detect/install-path symlinks directly for JSON and table output (using is_runtime_symlink) while keeping upgrade-skip logic separate
  • E2E: add e2e/backend/test_http_upgrade validating HTTP backend tools with cached symlink installs are shown as outdated and upgrade correctly

Written by Cursor Bugbot for commit 3557fe0. This will update automatically on new commits. Configure here.

@jdx
Copy link
Owner

jdx commented Nov 19, 2025

this doesn't seem like the right thing to do to me

@TyceHerrman
Copy link
Contributor Author

ok fair enough. Any thoughts on direction to take this?

@jdx
Copy link
Owner

jdx commented Dec 17, 2025

maybe something like this?

// In symlink_path() or a new method
  if let Some(target) = resolve_symlink(path) {
      // Only consider it a "skippable" symlink if it points to another version
      if target.starts_with(&installs_dir) {
          return Some(path);
      }
  }

@jdx jdx marked this pull request as draft December 17, 2025 22:49
@TyceHerrman
Copy link
Contributor Author

Added relative symlink resolution for the relative paths of user aliases (e.g., ./20.10.0).

Without this, target.starts_with(installs_dir) would return false for relative symlinks (I think) even though it points within installs.

@TyceHerrman TyceHerrman force-pushed the nix-backend-auto-upgrade branch from acf3b97 to a6fd913 Compare December 18, 2025 18:20
TyceHerrman and others added 4 commits December 18, 2025 14:33
…llations

Vfox backend tools (like nix) create symlinks as part of their normal
installation process (e.g., symlinks to /nix/store). The upgrade check
was incorrectly skipping these symlinked versions, causing them to never
appear in `mise outdated` or be upgraded.

This fix overrides symlink_path() in VfoxBackend to return None,
indicating these are not user-created symlinks to other tool versions
and should not be skipped during upgrade checks.

Fixes jdx#5909

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
…upgrades

  The previous commit (5675a8c) changed symlink_path() to only return
  Some for symlinks pointing within dirs::INSTALLS, which fixed vfox
  backend upgrade checks but broke the (symlink) display for mise link
  created external symlinks.

  This separates the two concerns:
  - symlink_path() controls upgrade-skip logic (unchanged)
  - Display logic in ls.rs now checks is_symlink() && !is_runtime_symlink()
    directly, showing (symlink) for all non-runtime symlinks

  Fixes jdx#5909

  🤖 Generated with [Claude Code](https://claude.com/claude-code)

  Co-Authored-By: Claude <noreply@anthropic.com>
…mlinks

  The JSON output was using symlink_path() which now only returns symlinks
  pointing within installs (for upgrade-skip logic). This fix checks
  is_symlink() && !is_runtime_symlink() directly, matching the terminal
  display logic.

  Fixes test_sync_nvm test failure.

  🤖 Generated with [Claude Code](https://claude.com/claude-code)

  Co-Authored-By: Claude <noreply@anthropic.com>
@TyceHerrman TyceHerrman force-pushed the nix-backend-auto-upgrade branch from ee34c3c to 98096b4 Compare December 18, 2025 19:44
@TyceHerrman TyceHerrman marked this pull request as ready for review December 18, 2025 20:11
}
fn symlink_path(&self, tv: &ToolVersion) -> Option<PathBuf> {
match tv.install_path() {
path if path.is_symlink() && !is_runtime_symlink(&path) => Some(path),
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why didn't this cover this situation to begin with? seems like we're just reimplementing is_runtime_symlink

Copy link
Contributor Author

@TyceHerrman TyceHerrman Dec 19, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My understanding is that is_runtime_symlink checks if the symlink target starts with ./. It identifies mise's internal version alias symlinks (like ./20.18.0), so the original logic !is_runtime_symlink means "anything that's not a ./ symlink."

Nix backend symlinks point to /nix/store/..., which doesn't start with ./, so is_runtime_symlink returns false, and !false = true results in returns Some(path) which skips upgrade.

So somehow we have to look if a symlink points within installs.

We could perhaps modify is_runtime_symlink directly instead. Something like:

  pub fn is_runtime_symlink(path: &Path) -> bool {
      if let Ok(Some(link)) = file::resolve_symlink(path) {
          let target = if link.is_absolute() {
              link
          } else {
              path.parent().unwrap_or(path).join(&link)
          };
          return target.starts_with(*dirs::INSTALLS);
      }
      false
  }

An edge case with that approach could be if a user manually creates an absolute symlink pointing within installs (myalias → /home/user/.local/share/mise/installs/node/20.18.0), the existing implementation doesn't treat that as a mise-created symlink, but the new code would treat that same user-created absolute path symlink as a mise-created symlink and so might delete it during a clean up.

@jdx
Copy link
Owner

jdx commented Jan 14, 2026

bugbot run

Copy link

@cursor cursor bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Bugbot reviewed your changes and found no bugs!

Adds an e2e test that validates the fix for symlinked HTTP backend
installations being skipped in outdated checks.

The test:
1. Installs an HTTP backend tool (which creates symlinks to cache)
2. Verifies mise latest sees the newer version
3. Verifies mise outdated --bump correctly detects it as outdated
4. Verifies mise upgrade --bump --dry-run shows the upgrade

This test fails without the fix (symlink_path change) and passes with it.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@jdx jdx enabled auto-merge (squash) January 14, 2026 17:29
};
if target.starts_with(*dirs::INSTALLS) {
return Some(path);
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Non-canonicalized paths can bypass symlink check

Low Severity

The symlink_path function joins relative symlink targets with the parent directory but doesn't canonicalize the result before checking starts_with(*dirs::INSTALLS). A relative symlink containing .. components (e.g., ../../http-tarballs/xxx) would produce a path like /path/to/installs/tool/../../http-tarballs/xxx that passes the starts_with check despite the actual resolved path being outside the installs directory. This could cause such symlinks to be incorrectly skipped during upgrade checks.

Fix in Cursor Fix in Web

@jdx jdx merged commit 4a96a4a into jdx:main Jan 14, 2026
34 checks passed
jdx added a commit that referenced this pull request Jan 14, 2026
## Summary

Follow-up to #7012 - addresses an issue flagged by Cursor Bugbot.

The `symlink_path` function joins relative symlink targets with the
parent directory but didn't canonicalize the result before checking
`starts_with(*dirs::INSTALLS)`. A relative symlink containing `..`
components (e.g., `../../http-tarballs/xxx`) would produce a path like
`/path/to/installs/tool/../../http-tarballs/xxx` that passes the
`starts_with` check despite the actual resolved path being outside the
installs directory.

## Changes

- Added `canonicalize()` call to resolve `..` components before the
`starts_with` check
- Falls back to the original path if canonicalization fails (e.g., path
doesn't exist)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Enhances symlink detection in `symlink_path` to avoid misclassifying
user-created aliases as backend-managed installs.
> 
> - Canonicalizes resolved symlink target before checking `starts_with`
to handle `..` components
> - Treats non-canonicalizable targets (missing paths) as needing
install (no skip)
> - Canonicalizes `dirs::INSTALLS` for consistent comparison (supports
symlinked data dirs)
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
a567b79. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
jdx pushed a commit that referenced this pull request Jan 16, 2026
### 🚀 Features

- **(s3)** add S3 backend for private artifact storage by @jdx in
[#7668](#7668)
- **(upgrade)** use installed_tool completer for mise upgrade by @jdx in
[#7670](#7670)
- **(upgrade)** add --exclude flag to mise upgrade command by @jdx in
[#7669](#7669)
- add no hooks and no env flags by @aacebedo in
[#7560](#7560)

### 🐛 Bug Fixes

- **(backend)** allow upgrading vfox backend tools with symlinked
installations by @TyceHerrman in
[#7012](#7012)
- **(backend)** reject architecture mismatches in asset selection by
@jdx in [#7672](#7672)
- **(backend)** canonicalize symlink target before installs check by
@jdx in [#7671](#7671)
- **(self-update)** skip update when already at latest version by @jdx
in [#7666](#7666)
- fall back to GITHUB_TOKEN for github.com by @subdigital in
[#7667](#7667)
- GitHub token fallback by @subdigital in
[#7673](#7673)
- inherit tasks from parent configs in monorepos by @chadxz in
[#7643](#7643)

### 📚 Documentation

- **(contributing)** update registry examples by @scop in
[#7660](#7660)
- **(contributing)** update registry PR title rule by @scop in
[#7663](#7663)
- remove 404 link from contributing by @opswole in
[#7692](#7692)

### 📦️ Dependency Updates

- update ghcr.io/jdx/mise:alpine docker digest to 11f659e by
@renovate[bot] in [#7685](#7685)
- update ghcr.io/jdx/mise:copr docker digest to 3adaea4 by
@renovate[bot] in [#7686](#7686)
- update ghcr.io/jdx/mise:deb docker digest to 8bbca53 by @renovate[bot]
in [#7687](#7687)
- update ghcr.io/jdx/mise:rpm docker digest to de81415 by @renovate[bot]
in [#7688](#7688)
- update mcr.microsoft.com/devcontainers/rust:1 docker digest to 282e805
by @renovate[bot] in [#7690](#7690)
- update rust docker digest to bed2d7f by @renovate[bot] in
[#7691](#7691)

### 📦 Registry

- add oh-my-posh by @scop in
[#7659](#7659)
- add bibtex-tidy (npm:bibtex-tidy) by @3w36zj6 in
[#7677](#7677)
- remove misconfigured bin_path option from kscript by @risu729 in
[#7693](#7693)

### New Contributors

- @opswole made their first contribution in
[#7692](#7692)
- @subdigital made their first contribution in
[#7673](#7673)
- @aacebedo made their first contribution in
[#7560](#7560)

## 📦 Aqua Registry Updates

#### New Packages (5)

- [`BeaconBay/ck`](https://github.com/BeaconBay/ck)
- [`d-kuro/gwq`](https://github.com/d-kuro/gwq)
-
[`kubernetes/cloud-provider-gcp/gke-gcloud-auth-plugin`](https://github.com/kubernetes/cloud-provider-gcp/gke-gcloud-auth-plugin)
- [`smithy-lang/smithy`](https://github.com/smithy-lang/smithy)
- [`tassiovirginio/try-rs`](https://github.com/tassiovirginio/try-rs)

#### Updated Packages (1)

- [`dprint/dprint`](https://github.com/dprint/dprint)
netbsd-srcmastr pushed a commit to NetBSD/pkgsrc that referenced this pull request Jan 22, 2026
## [2026.1.5](https://github.com/jdx/mise/compare/v2026.1.4..v2026.1.5) - 2026-01-19

### 🚀 Features

- **(complete)** add PowerShell completion support by @jdx in [#7746](jdx/mise#7746)
- **(release)** add LLM-generated prose summary to release notes by @jdx in [#7737](jdx/mise#7737)
- **(vfox)** add semver Lua module for version sorting by @jdx in [#7739](jdx/mise#7739)
- **(vfox)** add rolling release support with checksum tracking by @jdx in [#7757](jdx/mise#7757)
- dry filetask parsing and validation by @makp0 in [#7738](jdx/mise#7738)

### 🐛 Bug Fixes

- **(completions)** bump usage-cli to 2.13.1 for PowerShell support by @jdx in [#7756](jdx/mise#7756)
- schema missing env required string variant by @vadimpiven in [#7734](jdx/mise#7734)
- validate unknown fields in filetask headers by @makp0 in [#7733](jdx/mise#7733)
- disable schemacrawler test by @jdx in [#7743](jdx/mise#7743)
- replace double forward slash with single slash in get_task_lists by @collinstevens in [#7744](jdx/mise#7744)
- require LLM for release notes and include aqua section by @jdx in [#7745](jdx/mise#7745)
- preserve {{ version }} in tool options during config load by @jdx in [#7755](jdx/mise#7755)

### 📚 Documentation

- add documentation URL structure guidance to CLAUDE.md by @jdx in [#7740](jdx/mise#7740)
- add pitchfork promotion by @jdx in [#7747](jdx/mise#7747)

### 📦️ Dependency Updates

- relax version constraints and update dependencies by @jdx in [#7736](jdx/mise#7736)
- lock file maintenance by @renovate[bot] in [#7749](jdx/mise#7749)

### Chore

- bump xx to 2.3.1 by @jdx in [#7753](jdx/mise#7753)

### New Contributors

- @collinstevens made their first contribution in [#7744](jdx/mise#7744)
- @makp0 made their first contribution in [#7738](jdx/mise#7738)
- @vadimpiven made their first contribution in [#7734](jdx/mise#7734)

## [2026.1.4](https://github.com/jdx/mise/compare/v2026.1.3..v2026.1.4) - 2026-01-17

### 🚀 Features

- **(conda)** add dependency locking for reproducible installations by @jdx in [#7708](jdx/mise#7708)
- **(http)** add JSON filter syntax for version extraction by @jdx in [#7707](jdx/mise#7707)
- **(http)** add version_expr support and Tera templating by @jdx in [#7723](jdx/mise#7723)
- **(task)** add [monorepo].config_roots for explicit config root listing by @jdx in [#7705](jdx/mise#7705)
- **(task)** support env vars in task dependencies by @jdx in [#7724](jdx/mise#7724)

### 🐛 Bug Fixes

- **(conda)** fix hardcoded library paths in conda packages by @jdx in [#7713](jdx/mise#7713)
- **(env)** avoid venv/go backend deadlock during env resolution by @stk0vrfl0w in [#7696](jdx/mise#7696)
- **(locked)** exempt tool stubs from lockfile requirements by @jdx in [#7729](jdx/mise#7729)
- **(python)** sort CPython versions at end of ls-remote output by @jdx in [#7721](jdx/mise#7721)
- **(task)** resolve remote task files before display and validation commands by @yannrouillard in [#7681](jdx/mise#7681)
- **(task)** support monorepo paths in `mise tasks deps` by @chadxz in [#7699](jdx/mise#7699)
- **(task)** resolve all monorepo path hints in deps by @chadxz in [#7698](jdx/mise#7698)

### 📚 Documentation

- remove outdated roadmap page by @jdx in [#7726](jdx/mise#7726)

### ⚡ Performance

- **(task)** fix task-ls cached performance regression by @jdx in [#7716](jdx/mise#7716)

### 📦️ Dependency Updates

- replace dependency @tsconfig/node22 with @tsconfig/node24 by @renovate[bot] in [#7618](jdx/mise#7618)

### 📦 Registry

- add aqua backend for smithy by @jdx in [#7661](jdx/mise#7661)
- remove low-usage asdf plugins by @jdx in [#7701](jdx/mise#7701)
- disable mirrord test by @jdx in [#7703](jdx/mise#7703)
- use vfox-dotnet as default backend by @jdx in [#7704](jdx/mise#7704)
- use vfox-lua as default lua backend by @jdx in [#7706](jdx/mise#7706)
- add vfox backend for redis by @jdx in [#7709](jdx/mise#7709)
- use vfox-postgres as default postgres backend by @jdx in [#7710](jdx/mise#7710)
- use github backend for kotlin by @jdx in [#7711](jdx/mise#7711)
- add vfox backend for leiningen by @jdx in [#7714](jdx/mise#7714)
- use pipx backend for meson by @jdx in [#7712](jdx/mise#7712)
- use github backend for crystal by @jdx in [#7715](jdx/mise#7715)
- use conda backend for sqlite by @jdx in [#7718](jdx/mise#7718)
- use conda backend for make by @jdx in [#7719](jdx/mise#7719)
- swift-package-list use github backend by @jdx in [#7720](jdx/mise#7720)

### Chore

- increase macos release build timeout to 90 minutes by @jdx in [#7725](jdx/mise#7725)

### New Contributors

- @yannrouillard made their first contribution in [#7681](jdx/mise#7681)
- @stk0vrfl0w made their first contribution in [#7696](jdx/mise#7696)

## [2026.1.3](https://github.com/jdx/mise/compare/v2026.1.2..v2026.1.3) - 2026-01-16

### 🚀 Features

- **(s3)** add S3 backend for private artifact storage by @jdx in [#7668](jdx/mise#7668)
- **(upgrade)** use installed_tool completer for mise upgrade by @jdx in [#7670](jdx/mise#7670)
- **(upgrade)** add --exclude flag to mise upgrade command by @jdx in [#7669](jdx/mise#7669)
- add no hooks and no env flags by @aacebedo in [#7560](jdx/mise#7560)

### 🐛 Bug Fixes

- **(backend)** allow upgrading vfox backend tools with symlinked installations by @TyceHerrman in [#7012](jdx/mise#7012)
- **(backend)** reject architecture mismatches in asset selection by @jdx in [#7672](jdx/mise#7672)
- **(backend)** canonicalize symlink target before installs check by @jdx in [#7671](jdx/mise#7671)
- **(npm)** avoid circular dependency when npm is in dependencies by @AprilNEA in [#7644](jdx/mise#7644)
- **(self-update)** skip update when already at latest version by @jdx in [#7666](jdx/mise#7666)
- fall back to GITHUB_TOKEN for github.com by @subdigital in [#7667](jdx/mise#7667)
- GitHub token fallback by @subdigital in [#7673](jdx/mise#7673)
- inherit tasks from parent configs in monorepos by @chadxz in [#7643](jdx/mise#7643)

### 📚 Documentation

- **(contributing)** update registry examples by @scop in [#7660](jdx/mise#7660)
- **(contributing)** update registry PR title rule by @scop in [#7663](jdx/mise#7663)
- remove 404 link from contributing by @opswole in [#7692](jdx/mise#7692)
- clarify that backend plugins should sort the version list by @ofalvai in [#7680](jdx/mise#7680)

### 📦️ Dependency Updates

- update ghcr.io/jdx/mise:alpine docker digest to 11f659e by @renovate[bot] in [#7685](jdx/mise#7685)
- update ghcr.io/jdx/mise:copr docker digest to 3adaea4 by @renovate[bot] in [#7686](jdx/mise#7686)
- update ghcr.io/jdx/mise:deb docker digest to 8bbca53 by @renovate[bot] in [#7687](jdx/mise#7687)
- update ghcr.io/jdx/mise:rpm docker digest to de81415 by @renovate[bot] in [#7688](jdx/mise#7688)
- update mcr.microsoft.com/devcontainers/rust:1 docker digest to 282e805 by @renovate[bot] in [#7690](jdx/mise#7690)
- update rust docker digest to bed2d7f by @renovate[bot] in [#7691](jdx/mise#7691)

### 📦 Registry

- add oh-my-posh by @scop in [#7659](jdx/mise#7659)
- add bibtex-tidy (npm:bibtex-tidy) by @3w36zj6 in [#7677](jdx/mise#7677)
- remove misconfigured bin_path option from kscript by @risu729 in [#7693](jdx/mise#7693)

### New Contributors

- @AprilNEA made their first contribution in [#7644](jdx/mise#7644)
- @opswole made their first contribution in [#7692](jdx/mise#7692)
- @subdigital made their first contribution in [#7673](jdx/mise#7673)
- @aacebedo made their first contribution in [#7560](jdx/mise#7560)
netbsd-srcmastr pushed a commit to NetBSD/pkgsrc that referenced this pull request Jan 25, 2026
## [2026.1.5](https://github.com/jdx/mise/compare/v2026.1.4..v2026.1.5) - 2026-01-19

### 🚀 Features

- **(complete)** add PowerShell completion support by @jdx in [#7746](jdx/mise#7746)
- **(release)** add LLM-generated prose summary to release notes by @jdx in [#7737](jdx/mise#7737)
- **(vfox)** add semver Lua module for version sorting by @jdx in [#7739](jdx/mise#7739)
- **(vfox)** add rolling release support with checksum tracking by @jdx in [#7757](jdx/mise#7757)
- dry filetask parsing and validation by @makp0 in [#7738](jdx/mise#7738)

### 🐛 Bug Fixes

- **(completions)** bump usage-cli to 2.13.1 for PowerShell support by @jdx in [#7756](jdx/mise#7756)
- schema missing env required string variant by @vadimpiven in [#7734](jdx/mise#7734)
- validate unknown fields in filetask headers by @makp0 in [#7733](jdx/mise#7733)
- disable schemacrawler test by @jdx in [#7743](jdx/mise#7743)
- replace double forward slash with single slash in get_task_lists by @collinstevens in [#7744](jdx/mise#7744)
- require LLM for release notes and include aqua section by @jdx in [#7745](jdx/mise#7745)
- preserve {{ version }} in tool options during config load by @jdx in [#7755](jdx/mise#7755)

### 📚 Documentation

- add documentation URL structure guidance to CLAUDE.md by @jdx in [#7740](jdx/mise#7740)
- add pitchfork promotion by @jdx in [#7747](jdx/mise#7747)

### 📦️ Dependency Updates

- relax version constraints and update dependencies by @jdx in [#7736](jdx/mise#7736)
- lock file maintenance by @renovate[bot] in [#7749](jdx/mise#7749)

### Chore

- bump xx to 2.3.1 by @jdx in [#7753](jdx/mise#7753)

### New Contributors

- @collinstevens made their first contribution in [#7744](jdx/mise#7744)
- @makp0 made their first contribution in [#7738](jdx/mise#7738)
- @vadimpiven made their first contribution in [#7734](jdx/mise#7734)

## [2026.1.4](https://github.com/jdx/mise/compare/v2026.1.3..v2026.1.4) - 2026-01-17

### 🚀 Features

- **(conda)** add dependency locking for reproducible installations by @jdx in [#7708](jdx/mise#7708)
- **(http)** add JSON filter syntax for version extraction by @jdx in [#7707](jdx/mise#7707)
- **(http)** add version_expr support and Tera templating by @jdx in [#7723](jdx/mise#7723)
- **(task)** add [monorepo].config_roots for explicit config root listing by @jdx in [#7705](jdx/mise#7705)
- **(task)** support env vars in task dependencies by @jdx in [#7724](jdx/mise#7724)

### 🐛 Bug Fixes

- **(conda)** fix hardcoded library paths in conda packages by @jdx in [#7713](jdx/mise#7713)
- **(env)** avoid venv/go backend deadlock during env resolution by @stk0vrfl0w in [#7696](jdx/mise#7696)
- **(locked)** exempt tool stubs from lockfile requirements by @jdx in [#7729](jdx/mise#7729)
- **(python)** sort CPython versions at end of ls-remote output by @jdx in [#7721](jdx/mise#7721)
- **(task)** resolve remote task files before display and validation commands by @yannrouillard in [#7681](jdx/mise#7681)
- **(task)** support monorepo paths in `mise tasks deps` by @chadxz in [#7699](jdx/mise#7699)
- **(task)** resolve all monorepo path hints in deps by @chadxz in [#7698](jdx/mise#7698)

### 📚 Documentation

- remove outdated roadmap page by @jdx in [#7726](jdx/mise#7726)

### ⚡ Performance

- **(task)** fix task-ls cached performance regression by @jdx in [#7716](jdx/mise#7716)

### 📦️ Dependency Updates

- replace dependency @tsconfig/node22 with @tsconfig/node24 by @renovate[bot] in [#7618](jdx/mise#7618)

### 📦 Registry

- add aqua backend for smithy by @jdx in [#7661](jdx/mise#7661)
- remove low-usage asdf plugins by @jdx in [#7701](jdx/mise#7701)
- disable mirrord test by @jdx in [#7703](jdx/mise#7703)
- use vfox-dotnet as default backend by @jdx in [#7704](jdx/mise#7704)
- use vfox-lua as default lua backend by @jdx in [#7706](jdx/mise#7706)
- add vfox backend for redis by @jdx in [#7709](jdx/mise#7709)
- use vfox-postgres as default postgres backend by @jdx in [#7710](jdx/mise#7710)
- use github backend for kotlin by @jdx in [#7711](jdx/mise#7711)
- add vfox backend for leiningen by @jdx in [#7714](jdx/mise#7714)
- use pipx backend for meson by @jdx in [#7712](jdx/mise#7712)
- use github backend for crystal by @jdx in [#7715](jdx/mise#7715)
- use conda backend for sqlite by @jdx in [#7718](jdx/mise#7718)
- use conda backend for make by @jdx in [#7719](jdx/mise#7719)
- swift-package-list use github backend by @jdx in [#7720](jdx/mise#7720)

### Chore

- increase macos release build timeout to 90 minutes by @jdx in [#7725](jdx/mise#7725)

### New Contributors

- @yannrouillard made their first contribution in [#7681](jdx/mise#7681)
- @stk0vrfl0w made their first contribution in [#7696](jdx/mise#7696)

## [2026.1.3](https://github.com/jdx/mise/compare/v2026.1.2..v2026.1.3) - 2026-01-16

### 🚀 Features

- **(s3)** add S3 backend for private artifact storage by @jdx in [#7668](jdx/mise#7668)
- **(upgrade)** use installed_tool completer for mise upgrade by @jdx in [#7670](jdx/mise#7670)
- **(upgrade)** add --exclude flag to mise upgrade command by @jdx in [#7669](jdx/mise#7669)
- add no hooks and no env flags by @aacebedo in [#7560](jdx/mise#7560)

### 🐛 Bug Fixes

- **(backend)** allow upgrading vfox backend tools with symlinked installations by @TyceHerrman in [#7012](jdx/mise#7012)
- **(backend)** reject architecture mismatches in asset selection by @jdx in [#7672](jdx/mise#7672)
- **(backend)** canonicalize symlink target before installs check by @jdx in [#7671](jdx/mise#7671)
- **(npm)** avoid circular dependency when npm is in dependencies by @AprilNEA in [#7644](jdx/mise#7644)
- **(self-update)** skip update when already at latest version by @jdx in [#7666](jdx/mise#7666)
- fall back to GITHUB_TOKEN for github.com by @subdigital in [#7667](jdx/mise#7667)
- GitHub token fallback by @subdigital in [#7673](jdx/mise#7673)
- inherit tasks from parent configs in monorepos by @chadxz in [#7643](jdx/mise#7643)

### 📚 Documentation

- **(contributing)** update registry examples by @scop in [#7660](jdx/mise#7660)
- **(contributing)** update registry PR title rule by @scop in [#7663](jdx/mise#7663)
- remove 404 link from contributing by @opswole in [#7692](jdx/mise#7692)
- clarify that backend plugins should sort the version list by @ofalvai in [#7680](jdx/mise#7680)

### 📦️ Dependency Updates

- update ghcr.io/jdx/mise:alpine docker digest to 11f659e by @renovate[bot] in [#7685](jdx/mise#7685)
- update ghcr.io/jdx/mise:copr docker digest to 3adaea4 by @renovate[bot] in [#7686](jdx/mise#7686)
- update ghcr.io/jdx/mise:deb docker digest to 8bbca53 by @renovate[bot] in [#7687](jdx/mise#7687)
- update ghcr.io/jdx/mise:rpm docker digest to de81415 by @renovate[bot] in [#7688](jdx/mise#7688)
- update mcr.microsoft.com/devcontainers/rust:1 docker digest to 282e805 by @renovate[bot] in [#7690](jdx/mise#7690)
- update rust docker digest to bed2d7f by @renovate[bot] in [#7691](jdx/mise#7691)

### 📦 Registry

- add oh-my-posh by @scop in [#7659](jdx/mise#7659)
- add bibtex-tidy (npm:bibtex-tidy) by @3w36zj6 in [#7677](jdx/mise#7677)
- remove misconfigured bin_path option from kscript by @risu729 in [#7693](jdx/mise#7693)

### New Contributors

- @AprilNEA made their first contribution in [#7644](jdx/mise#7644)
- @opswole made their first contribution in [#7692](jdx/mise#7692)
- @subdigital made their first contribution in [#7673](jdx/mise#7673)
- @aacebedo made their first contribution in [#7560](jdx/mise#7560)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants