feat(vfox): add semver Lua module for version sorting#7739
Conversation
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>
There was a problem hiding this comment.
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
semverRust module with version parsing, comparison, and sorting functions - Exposes the module to Lua plugins via
require("semver")andrequire("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.
crates/vfox/src/lua_mod/semver.rs
Outdated
| // 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 |
There was a problem hiding this comment.
Use Lua comment syntax -- instead of // for comments in Lua code blocks.
| // 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 |
crates/vfox/src/lua_mod/semver.rs
Outdated
| // 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 |
There was a problem hiding this comment.
Use Lua comment syntax -- instead of // for comments in Lua code blocks.
| // 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 |
crates/vfox/src/lua_mod/semver.rs
Outdated
| // 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 |
There was a problem hiding this comment.
Use Lua comment syntax -- instead of // for comments in Lua code blocks.
| // 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 |
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>
There was a problem hiding this comment.
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.
crates/vfox/src/lua_mod/semver.rs
Outdated
| local parts = semver.parse("1.2.3") | ||
| assert(parts[1] == 1 and parts[2] == 2 and parts[3] == 3, "parse") | ||
|
|
||
| // Test sort |
There was a problem hiding this comment.
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.
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>
Hyperfine Performance
|
| 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% |
### 🚀 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)
## [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)
## [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)
Summary
semverLua module that vfox plugins can use for semantic version comparison and sortingAPI
semver.compare(v1, v2)- Returns -1, 0, or 1semver.parse(version)- Returns table of numeric partssemver.sort(versions)- Sorts string array ascendingsemver.sort_by(items, field)- Sorts table array by version fieldExample Usage
Test Plan
parse_version,compare_versionsRelated
🤖 Generated with Claude Code
Note
Adds a built-in
semverLua module and integrates it into the plugin runtime.lua_mod/semver.rsexportscompare,parse,sort, andsort_byfor semantic version handling; includes unit and Lua integration testssemverinlua_mod/mod.rsand loads it inplugin.rssorequire("semver")is available to pluginsdocs/plugin-lua-modules.mdwithsemverusage and examplesWritten by Cursor Bugbot for commit e97711a. This will update automatically on new commits. Configure here.