Skip to content

Conversation

@jdx
Copy link
Owner

@jdx jdx commented Nov 27, 2025

Summary

  • Remove support for single-version [tools.name] format in lockfiles
  • Now only the array format [[tools.name]] is accepted
  • Simplifies the codebase by removing auto-migration logic

Test plan

  • Unit tests updated and passing
  • Lint checks passing

🤖 Generated with Claude Code


Note

Enforces [[tools.]] lockfile format, removes single-version handling, and updates formatting, unit tests, and e2e tests accordingly.

  • Lockfile core:
    • Enforce array-of-tables format: read now errors unless [[tools.<name>]]; removed auto-migration from single-version format.
    • Save always writes array format; simplified formatter to handle only array-of-tables.
    • Updated unit tests to require array format and verify save behavior.
  • E2E tests:
    • Updated lockfile expectations across GitHub/GitLab/HTTP/Java/CLI tests to use [[tools.*]] and nested platform sections.
    • Adjusted fixtures to write lockfiles in array format and assert backend/platform fields accordingly.

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

Copilot AI review requested due to automatic review settings November 27, 2025 19:39
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 refactors the lockfile handling to enforce a consistent array format ([[tools.name]]) for all tool entries, removing support for the legacy single-version format ([tools.name]). This simplifies the codebase by eliminating auto-migration logic and potential confusion from supporting multiple formats.

Key Changes:

  • Removed auto-migration code that converted single-version format to array format
  • Updated parsing to return an error when non-array format is encountered
  • Simplified the format() function by removing handling for the Item::Table variant
  • Updated test cases to reflect the new array-only format requirement

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

Comment on lines +512 to 553
if let toml_edit::Item::ArrayOfTables(art) = v {
for t in art.iter_mut() {
t.sort_values_by(|a, _, b, _| {
Copy link

Copilot AI Nov 27, 2025

Choose a reason for hiding this comment

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

The sorting logic for table values appears to be duplicated from the removed Item::Table branch. The indentation suggests this code block may not be properly nested within the if let statement. Please verify that the sorting logic (lines 514-524) is correctly indented and nested within the if let block to ensure it only applies to ArrayOfTables items.

Copilot uses AI. Check for mistakes.
// Test that single-version format is read correctly and writes as multi-version
let single_version_toml = r#"
[tools.node]
fn test_array_format_required() {
Copy link

Copilot AI Nov 27, 2025

Choose a reason for hiding this comment

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

[nitpick] The test name 'test_array_format_required' doesn't clearly communicate what aspect of the array format is being tested. Consider renaming to 'test_lockfile_parses_array_format' or 'test_array_format_parsing' to better describe the test's purpose.

Suggested change
fn test_array_format_required() {
fn test_lockfile_parses_array_format() {

Copilot uses AI. Check for mistakes.
jdx and others added 2 commits November 27, 2025 11:45
Remove support for single-version `[tools.name]` format in lockfiles.
Now only the array format `[[tools.name]]` is accepted, which simplifies
the codebase and makes the format consistent.

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

Co-Authored-By: Claude <[email protected]>
Update all e2e tests to use [[tools.name]] array format instead of
[tools.name] single-version format for lockfiles.

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

Co-Authored-By: Claude <[email protected]>
@jdx jdx force-pushed the feat/lockfile-array-format branch from 33eb4b0 to ae62e3c Compare November 27, 2025 19:47
@github-actions
Copy link

github-actions bot commented Nov 27, 2025

Hyperfine Performance

mise x -- echo

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2025.11.10 x -- echo 19.2 ± 0.3 18.3 21.2 1.00
mise x -- echo 19.6 ± 0.5 18.6 22.1 1.02 ± 0.03

mise env

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2025.11.10 env 18.2 ± 0.8 17.5 26.1 1.00
mise env 18.3 ± 0.6 17.6 26.4 1.00 ± 0.05

mise hook-env

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2025.11.10 hook-env 18.1 ± 0.4 17.6 23.0 1.00
mise hook-env 18.4 ± 0.3 17.8 20.3 1.02 ± 0.03

mise ls

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2025.11.10 ls 15.7 ± 0.2 15.2 16.7 1.00
mise ls 16.2 ± 0.5 15.4 19.0 1.03 ± 0.04

xtasks/test/perf

Command mise-2025.11.10 mise Variance
install (cached) 104ms 107ms -2%
ls (cached) 63ms 64ms -1%
bin-paths (cached) 70ms 71ms -1%
task-ls (cached) 418ms 417ms +0%

}
_ => bail!(
"invalid lockfile format for tool {short}: expected array ([[tools.{short}]])"
),
Copy link

Choose a reason for hiding this comment

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

Bug: Old-format lockfiles silently lose locked version data

The refactoring rejects old single-version lockfile format with a bail!() error, but the callers of Lockfile::read catch this error via handle_missing_lockfile and silently return an empty lockfile. This means users with old-format lockfiles will have their locked versions silently discarded (with only a warning logged), and the lockfile will be overwritten with fresh version data. The intent to reject old format conflicts with the lenient error handling that treats parse failures the same as missing files.

Additional Locations (1)

Fix in Cursor Fix in Web

@jdx jdx enabled auto-merge (squash) November 27, 2025 20:14
Update test_where and test_lockfile_use to write lockfiles in the
correct [[tools.name]] array format.

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

Co-Authored-By: Claude <[email protected]>
@jdx jdx force-pushed the feat/lockfile-array-format branch from d2a49f6 to 253ba7d Compare November 27, 2025 20:20
@jdx jdx merged commit c90630e into main Nov 27, 2025
28 checks passed
@jdx jdx deleted the feat/lockfile-array-format branch November 27, 2025 20:39
jdx added a commit that referenced this pull request Nov 28, 2025
## Summary

Updates the lockfile documentation (`docs/dev-tools/mise-lock.md`) to
reflect the recent changes since v2025.11.10:

- **#7091** - Cross-platform lockfile generation
- **#7093** - Always use TOML array format `[[tools.name]]`
- **#7092** - Added `options` field for backend-specific artifact
identity
- **#7098** - Added `locked` setting for strict lockfile mode
- **#7099** - Added `env` field and `mise.local.lock` support

### Changes

- Update file format examples to use array syntax `[[tools.name]]`
- Add documentation for new fields: `options`, `env`
- Add **Environment-Specific Versions** section (env field, MISE_ENV
workflow)
- Add **Local Lockfiles** section (mise.local.lock, --local flag)
- Add **Strict Lockfile Mode** section (locked setting)
- Remove outdated **Legacy Format Migration** and **Benefits of the New
Format** sections

## Test plan

- [ ] Verify docs build correctly with `mise run docs`
- [ ] Review documentation renders correctly on the site

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

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Refreshes `mise.lock` docs to use `[[tools.name]]` array syntax, add
`options`/`env`, document environment-specific and local lockfiles, and
introduce strict `locked` mode while removing obsolete sections.
> 
> - **Docs (lockfile)**
>   - **File format**:
>     - Switch examples to `[[tools.name]]` array syntax
> - Add fields: `options`, `env`; clarify `platforms` metadata and
platform key formats
>   - **Environment-specific versions**:
> - Document `MISE_ENV` workflow and resolution priority; show
`mise.test.toml` example
>   - **Local lockfiles**:
> - Explain `mise.local.toml` → `mise.local.lock`, `--local` usage and
commands
>   - **Strict lockfile mode**:
> - Add `locked` setting (`mise settings locked=true`, `MISE_LOCKED=1`)
and `mise lock` URL pre-resolution workflow
>   - **Cleanup**:
>     - Remove Legacy Format Migration and Benefits sections
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
e6fe67f. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

Co-authored-by: Claude <[email protected]>
jdx pushed a commit that referenced this pull request Nov 30, 2025
### 🚀 Features

- **(backend)** add filter_bins option to github/gitlab backends by
@risu729 in [#7105](#7105)
- **(ci)** auto-close PRs from non-maintainers by @jdx in
[#7108](#7108)
- **(conda)** add conda backend for installing packages from conda-forge
by @jdx in [#7139](#7139)
- **(github)** add rename_exe option and switch elm, opam, yt-dlp from
ubi by @jdx in [#7140](#7140)
- **(install)** add --locked flag for strict lockfile mode by @jdx in
[#7098](#7098)
- **(lock)** implement cross-platform lockfile generation by @jdx in
[#7091](#7091)
- **(lockfile)** add options field for tool artifact identity by @jdx in
[#7092](#7092)
- **(lockfile)** add env field and local lockfile support by @jdx in
[#7099](#7099)
- **(lockfile)** add URL support for deno, go, and zig backends by @jdx
in [#7112](#7112)
- **(lockfile)** add URL support for vfox backend by @jdx in
[#7114](#7114)
- **(lockfile)** add multi-platform checksums without downloading
tarballs by @jdx in [#7113](#7113)

### 🐛 Bug Fixes

- **(backend)** allow platform-specific strip_components by @risu729 in
[#7106](#7106)
- **(backend)** prefer path root for bin path if it contains an
executable by @risu729 in [#7151](#7151)
- **(bash)** avoid deactivate error on (no)unset PROMPT_COMMAND by @scop
in [#7096](#7096)
- **(ci)** use updatedAt instead of createdAt for stale PR detection by
@jdx in [#7109](#7109)
- **(github)** search subdirectories for executables in
discover_bin_paths by @jdx in
[#7138](#7138)
- **(lockfile)** combine api_url with asset_pattern for GitHub release
URLs by @jdx in [#7111](#7111)

### 🚜 Refactor

- **(lock)** simplify lockfile to always use array format by @jdx in
[#7093](#7093)
- **(lockfile)** use compact inline table format by @jdx in
[#7141](#7141)

### 📚 Documentation

- **(gitlab)** document rename_exe option also for gitlab backend by
@risu729 in [#7149](#7149)
- **(lockfile)** update documentation for recent lockfile changes by
@jdx in [#7107](#7107)
- **(node)** use config_root in _.path for pnpm example by @risu729 in
[#7146](#7146)
- **(registry)** add github/gitlab backends to the preferred backends
list by @risu729 in [#7148](#7148)
- **(registry)** add url mappings for all backends by @risu729 in
[#7147](#7147)

### 📦️ Dependency Updates

- update docker/metadata-action digest to c299e40 by @renovate[bot] in
[#7101](#7101)
- update ghcr.io/jdx/mise:alpine docker digest to 693c5f6 by
@renovate[bot] in [#7102](#7102)
- update ghcr.io/jdx/mise:deb docker digest to 9985cab by @renovate[bot]
in [#7104](#7104)
- update ghcr.io/jdx/mise:copr docker digest to 564d8e1 by
@renovate[bot] in [#7103](#7103)
- update rust crate ubi to 0.8.4 by @risu729 in
[#7154](#7154)

### 📦 Registry

- add aqua backend as primary for e1s by @jdx in
[#7115](#7115)
- add gem backend for bashly by @jdx in
[6af6607](6af6607)
- switch 1password from asdf to vfox backend by @jdx in
[#7116](#7116)
- add vfox backend for bfs by @jdx in
[#7126](#7126)
- add github backend for btrace by @jdx in
[#7129](#7129)
- add github backend for cf by @jdx in
[#7131](#7131)
- add vfox backend for bpkg by @jdx in
[#7130](#7130)
- switch apollo-ios from asdf to github backend by @jdx in
[#7118](#7118)
- add vfox backend for chromedriver by @jdx in
[#7134](#7134)
- switch superhtml, vespa-cli, xcsift from ubi to github backend by @jdx
in [#7137](#7137)
- add vfox backend for clickhouse by @jdx in
[#7136](#7136)
- switch chicken to vfox plugin by @jdx in
[#7135](#7135)
- switch chezscheme from asdf to vfox backend by @jdx in
[#7132](#7132)
- add vfox backend for carthage by @jdx in
[#7133](#7133)
- switch azure-functions-core-tools from asdf to vfox backend by @jdx in
[#7128](#7128)
- switch aapt2 to vfox backend by @jdx in
[#7117](#7117)
- switch ant to vfox backend by @jdx in
[#7119](#7119)
- switch asciidoctorj from asdf to vfox backend by @jdx in
[#7121](#7121)
- switch awscli-local to pipx backend by @jdx in
[#7120](#7120)
- add omnictl by @risu729 in
[#7145](#7145)
- remove pnpm asdf plugin from fallback by @risu729 in
[#7143](#7143)
- switch tanzu to github backend by @jdx in
[#7124](#7124)
- switch android-sdk to vfox plugin by @jdx in
[#7127](#7127)
- add vfox backend for ag (The Silver Searcher) by @jdx in
[#7122](#7122)

### Chore

- **(registry)** ignore deleted tools in test-tool workflow by @risu729
in [#7081](#7081)
- **(release)** show registry section last in changelog by @jdx in
[#7156](#7156)
- update mise.lock with checksums by @jdx in
[71e9123](71e9123)
- disable cancel-in-progress for test workflow on main branch by
@risu729 in [#7152](#7152)

## 📦 Aqua Registry Updates

#### Updated Packages (1)

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