Skip to content

feat(vfox): add semver Lua module for version sorting#7739

Merged
jdx merged 3 commits intomainfrom
feat/vfox-semver-module
Jan 18, 2026
Merged

feat(vfox): add semver Lua module for version sorting#7739
jdx merged 3 commits intomainfrom
feat/vfox-semver-module

Conversation

@jdx
Copy link
Owner

@jdx jdx commented Jan 18, 2026

Summary

  • Adds a new semver Lua module that vfox plugins can use for semantic version comparison and sorting
  • Eliminates the need for each plugin to implement their own version sorting logic

API

  • semver.compare(v1, v2) - Returns -1, 0, or 1
  • semver.parse(version) - Returns table of numeric parts
  • semver.sort(versions) - Sorts string array ascending
  • semver.sort_by(items, field) - Sorts table array by version field

Example Usage

local semver = require("semver")

-- Method 1: Use in custom sort
table.sort(result, function(a, b)
    return semver.compare(a.version, b.version) < 0
end)

-- Method 2: Use sort_by helper
result = semver.sort_by(result, "version")

Test Plan

  • Unit tests for parse_version, compare_versions
  • Lua integration test

Related

🤖 Generated with Claude Code


Note

Adds a built-in semver Lua module and integrates it into the plugin runtime.

  • New lua_mod/semver.rs exports compare, parse, sort, and sort_by for semantic version handling; includes unit and Lua integration tests
  • Registers semver in lua_mod/mod.rs and loads it in plugin.rs so require("semver") is available to plugins
  • Updates docs/plugin-lua-modules.md with semver usage and examples

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

Adds a new `semver` Lua module that vfox plugins can use for semantic
version comparison and sorting. This eliminates the need for each plugin
to implement their own version sorting logic.

API:
- `semver.compare(v1, v2)` - Returns -1, 0, or 1
- `semver.parse(version)` - Returns table of numeric parts
- `semver.sort(versions)` - Sorts string array ascending
- `semver.sort_by(items, field)` - Sorts table array by version field

Example usage in plugin:
```lua
local semver = require("semver")
table.sort(result, function(a, b)
    return semver.compare(a.version, b.version) < 0
end)
-- or simply:
result = semver.sort_by(result, "version")
```

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings January 18, 2026 22:22
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR adds a reusable semver Lua module to the vfox plugin system, providing standardized semantic version comparison and sorting functionality that plugins can use instead of implementing their own version sorting logic.

Changes:

  • Implements a new semver Rust module with version parsing, comparison, and sorting functions
  • Exposes the module to Lua plugins via require("semver") and require("vfox.semver")
  • Adds comprehensive unit and integration tests for the semver functionality

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 3 comments.

File Description
crates/vfox/src/plugin.rs Registers the new semver module in the plugin initialization
crates/vfox/src/lua_mod/semver.rs Implements the complete semver module with parsing, comparison, sorting functions and tests
crates/vfox/src/lua_mod/mod.rs Adds module declaration and export for the semver module

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +108 to +119
// Test compare
assert(semver.compare("1.2.3", "1.2.3") == 0, "equal versions")
assert(semver.compare("1.2.3", "1.2.4") == -1, "less than")
assert(semver.compare("1.2.4", "1.2.3") == 1, "greater than")
assert(semver.compare("9.6.9", "9.6.24") == -1, "numeric comparison")
assert(semver.compare("10.0", "9.6.24") == 1, "major version")

// Test parse
local parts = semver.parse("1.2.3")
assert(parts[1] == 1 and parts[2] == 2 and parts[3] == 3, "parse")

// Test sort
Copy link

Copilot AI Jan 18, 2026

Choose a reason for hiding this comment

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

Use Lua comment syntax -- instead of // for comments in Lua code blocks.

Suggested change
// Test compare
assert(semver.compare("1.2.3", "1.2.3") == 0, "equal versions")
assert(semver.compare("1.2.3", "1.2.4") == -1, "less than")
assert(semver.compare("1.2.4", "1.2.3") == 1, "greater than")
assert(semver.compare("9.6.9", "9.6.24") == -1, "numeric comparison")
assert(semver.compare("10.0", "9.6.24") == 1, "major version")
// Test parse
local parts = semver.parse("1.2.3")
assert(parts[1] == 1 and parts[2] == 2 and parts[3] == 3, "parse")
// Test sort
-- Test compare
assert(semver.compare("1.2.3", "1.2.3") == 0, "equal versions")
assert(semver.compare("1.2.3", "1.2.4") == -1, "less than")
assert(semver.compare("1.2.4", "1.2.3") == 1, "greater than")
assert(semver.compare("9.6.9", "9.6.24") == -1, "numeric comparison")
assert(semver.compare("10.0", "9.6.24") == 1, "major version")
-- Test parse
local parts = semver.parse("1.2.3")
assert(parts[1] == 1 and parts[2] == 2 and parts[3] == 3, "parse")
-- Test sort

Copilot uses AI. Check for mistakes.
Comment on lines +108 to +119
// Test compare
assert(semver.compare("1.2.3", "1.2.3") == 0, "equal versions")
assert(semver.compare("1.2.3", "1.2.4") == -1, "less than")
assert(semver.compare("1.2.4", "1.2.3") == 1, "greater than")
assert(semver.compare("9.6.9", "9.6.24") == -1, "numeric comparison")
assert(semver.compare("10.0", "9.6.24") == 1, "major version")

// Test parse
local parts = semver.parse("1.2.3")
assert(parts[1] == 1 and parts[2] == 2 and parts[3] == 3, "parse")

// Test sort
Copy link

Copilot AI Jan 18, 2026

Choose a reason for hiding this comment

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

Use Lua comment syntax -- instead of // for comments in Lua code blocks.

Suggested change
// Test compare
assert(semver.compare("1.2.3", "1.2.3") == 0, "equal versions")
assert(semver.compare("1.2.3", "1.2.4") == -1, "less than")
assert(semver.compare("1.2.4", "1.2.3") == 1, "greater than")
assert(semver.compare("9.6.9", "9.6.24") == -1, "numeric comparison")
assert(semver.compare("10.0", "9.6.24") == 1, "major version")
// Test parse
local parts = semver.parse("1.2.3")
assert(parts[1] == 1 and parts[2] == 2 and parts[3] == 3, "parse")
// Test sort
-- Test compare
assert(semver.compare("1.2.3", "1.2.3") == 0, "equal versions")
assert(semver.compare("1.2.3", "1.2.4") == -1, "less than")
assert(semver.compare("1.2.4", "1.2.3") == 1, "greater than")
assert(semver.compare("9.6.9", "9.6.24") == -1, "numeric comparison")
assert(semver.compare("10.0", "9.6.24") == 1, "major version")
-- Test parse
local parts = semver.parse("1.2.3")
assert(parts[1] == 1 and parts[2] == 2 and parts[3] == 3, "parse")
-- Test sort

Copilot uses AI. Check for mistakes.
Comment on lines +108 to +119
// Test compare
assert(semver.compare("1.2.3", "1.2.3") == 0, "equal versions")
assert(semver.compare("1.2.3", "1.2.4") == -1, "less than")
assert(semver.compare("1.2.4", "1.2.3") == 1, "greater than")
assert(semver.compare("9.6.9", "9.6.24") == -1, "numeric comparison")
assert(semver.compare("10.0", "9.6.24") == 1, "major version")

// Test parse
local parts = semver.parse("1.2.3")
assert(parts[1] == 1 and parts[2] == 2 and parts[3] == 3, "parse")

// Test sort
Copy link

Copilot AI Jan 18, 2026

Choose a reason for hiding this comment

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

Use Lua comment syntax -- instead of // for comments in Lua code blocks.

Suggested change
// Test compare
assert(semver.compare("1.2.3", "1.2.3") == 0, "equal versions")
assert(semver.compare("1.2.3", "1.2.4") == -1, "less than")
assert(semver.compare("1.2.4", "1.2.3") == 1, "greater than")
assert(semver.compare("9.6.9", "9.6.24") == -1, "numeric comparison")
assert(semver.compare("10.0", "9.6.24") == 1, "major version")
// Test parse
local parts = semver.parse("1.2.3")
assert(parts[1] == 1 and parts[2] == 2 and parts[3] == 3, "parse")
// Test sort
-- Test compare
assert(semver.compare("1.2.3", "1.2.3") == 0, "equal versions")
assert(semver.compare("1.2.3", "1.2.4") == -1, "less than")
assert(semver.compare("1.2.4", "1.2.3") == 1, "greater than")
assert(semver.compare("9.6.9", "9.6.24") == -1, "numeric comparison")
assert(semver.compare("10.0", "9.6.24") == 1, "major version")
-- Test parse
local parts = semver.parse("1.2.3")
assert(parts[1] == 1 and parts[2] == 2 and parts[3] == 3, "parse")
-- Test sort

Copilot uses AI. Check for mistakes.
Documents the new semver module with examples for:
- Version comparison
- Parsing versions to numeric parts
- Sorting version strings
- Sorting tables by version field
- Real-world Available() hook example

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
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.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Bugbot Autofix is OFF. To automatically fix reported issues with Cloud Agents, enable Autofix in the Cursor dashboard.

local parts = semver.parse("1.2.3")
assert(parts[1] == 1 and parts[2] == 2 and parts[3] == 3, "parse")

// Test sort
Copy link

Choose a reason for hiding this comment

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

Lua test uses invalid comment syntax

Medium Severity

The Lua integration test uses // for comments, but Lua uses -- for comments. In Lua 5.3+, // is the floor division operator, and having // Test compare at the start of a statement without a left operand causes a syntax error. Existing tests in cmd.rs correctly use -- (e.g., -- Test with working directory). This causes the test to fail at runtime, providing no actual test coverage for the semver Lua API.

Fix in Cursor Fix in Web

Changed // to -- for Lua comments. Lua uses -- for single-line
comments, not // (which is the floor division operator in Lua 5.3+).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@github-actions
Copy link

Hyperfine Performance

mise x -- echo

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.1.4 x -- echo 15.0 ± 0.3 14.1 16.6 1.00
mise x -- echo 15.3 ± 0.4 14.6 17.2 1.02 ± 0.03

mise env

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.1.4 env 14.6 ± 0.3 13.8 15.6 1.00
mise env 15.3 ± 0.5 14.3 20.3 1.05 ± 0.04

mise hook-env

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.1.4 hook-env 14.9 ± 0.5 13.8 17.7 1.00
mise hook-env 15.4 ± 0.9 14.3 27.6 1.03 ± 0.07

mise ls

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.1.4 ls 14.1 ± 0.3 13.2 16.0 1.00
mise ls 14.5 ± 0.4 13.6 16.3 1.03 ± 0.04

xtasks/test/perf

Command mise-2026.1.4 mise Variance
install (cached) 82ms 84ms -2%
ls (cached) 53ms 54ms -1%
bin-paths (cached) 55ms 56ms -1%
task-ls (cached) 242ms 228ms +6%

@jdx jdx merged commit 8485cca into main Jan 18, 2026
36 checks passed
@jdx jdx deleted the feat/vfox-semver-module branch January 18, 2026 23:00
jdx pushed a commit that referenced this pull request Jan 19, 2026
### 🚀 Features

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

### 🐛 Bug Fixes

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

### 📚 Documentation

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

### 📦️ Dependency Updates

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

### Chore

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

### New Contributors

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

## 📦 Aqua Registry Updates

#### New Packages (2)

-
[`F1bonacc1/process-compose`](https://github.com/F1bonacc1/process-compose)
- [`kkinnear/zprint`](https://github.com/kkinnear/zprint)

#### Updated Packages (1)

- [`theryangeary/choose`](https://github.com/theryangeary/choose)
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