Skip to content

fix(http): store tool opts as native TOML to fix platform switching#8448

Merged
jdx merged 22 commits intomainfrom
fix/http-backend-stale-platforms-cache
Mar 7, 2026
Merged

fix(http): store tool opts as native TOML to fix platform switching#8448
jdx merged 22 commits intomainfrom
fix/http-backend-stale-platforms-cache

Conversation

@jdx
Copy link
Copy Markdown
Owner

@jdx jdx commented Mar 3, 2026

Summary

  • Store tool options as native TOML fields ([tool.opts]) in .mise-installs.toml instead of encoding them inside brackets in the full string
  • Fix parse_tool_options() to try TOML inline-table parsing first, correctly handling nested structures like platforms={linux-x64={url="..."}}
  • Extract split_bracketed_opts()/strip_opts() helpers and EPHEMERAL_OPT_KEYS constant to reduce duplication
  • Add backward compat: old manifests with bracketed opts in full are automatically migrated on read

Problem

When a tool is installed with a single url and later switched to platform-specific URLs ([tools."http:X".platforms]), the cached options in the install manifest were mangled during round-tripping. Options were encoded as a string inside brackets in the manifest's full field, but nested TOML structures were destroyed by comma-based parsing and re-serialization.

Before:

[hello]
short = "hello"
full = "http:hello[url=https://...,bin_path=bin]"

After:

[hello]
short = "hello"
full = "http:hello"

[hello.opts]
url = "https://..."
bin_path = "bin"

Fixes discussion #7034.

Test plan

  • New e2e test test_http_platform_switch validates the full scenario (single URL → platform-specific URLs)
  • All existing test_http e2e tests pass
  • Unit tests for TOML parsing, opts round-trip, and backward compat migration
  • cargo test passes

🤖 Generated with Claude Code


Note

Medium Risk
Touches core tool option parsing and install-state persistence/migration; bugs could affect installs/lockfiles across multiple backends, though changes are largely mechanical with added regression coverage.

Overview
Fixes a regression where switching an http: tool from a single url to platform-specific platforms.*.url could fail due to stale/mangled cached options shadowing new config values.

This changes ToolVersionOptions to store values as toml::Value (preserving nested tables/arrays), updates option parsing to prefer TOML inline-table parsing, and adjusts backends/callers to read string values via get()/opts_as_strings().

Install state now writes .mise-installs.toml with full without bracketed opts and persists non-ephemeral options in a dedicated opts map, automatically migrating legacy full[...] entries on read. Adds an e2e regression test for the platform-switch scenario and updates related unit tests/snapshots.

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

@gemini-code-assist
Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request resolves a critical issue in the HTTP backend configuration where stale cached options could incorrectly override new, platform-specific URL definitions. Previously, changing from a single URL to a [tools."http:X".platforms] structure would lead to an error due to mangled cached data. The fix ensures that when a configuration provides its own platform definitions, any conflicting or mangled cached platform data is properly discarded, allowing the correct configuration to take precedence and enabling seamless switching between URL configurations.

Highlights

  • Fixes HTTP backend configuration issue: Resolved a bug where switching from a single url to platform-specific URLs for HTTP backends would fail with a "Http backend requires 'url' option" error.
  • Prevents stale cached options: Addressed the problem of parse_tool_options mangling nested TOML structures and merge() preserving these stale, mangled values over correct configuration.
  • Improved platform option merging: Implemented logic to filter out root platforms or platform container keys from cached options when the configuration explicitly defines its own platform-specific URLs.
Changelog
  • e2e/backend/test_http_platform_switch
    • Added a new end-to-end test to validate the fix for switching between single and platform-specific HTTP URLs.
  • src/config/config_file/mise_toml.rs
    • Modified the retain logic within MiseToml to explicitly check for and remove root platforms or platform keys from cached options if the current configuration defines them.
Activity
  • Added a new e2e test, test_http_platform_switch, to cover the specific regression.
  • Confirmed that existing e2e tests, including test_http and the new test_http_platform_switch, pass.
  • Ensured that linting checks pass.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request addresses a bug that occurred when switching a tool's configuration from a single URL to platform-specific URLs. The issue was caused by stale, mangled platform data in the cache shadowing the new configuration. The fix correctly filters out these stale platforms or platform keys from cached options when a new platform definition is present in the configuration. A new e2e test has been added to verify this fix and prevent regressions. The changes are well-implemented and effectively solve the problem.

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps bot commented Mar 3, 2026

Greptile Summary

This PR changes how tool options are persisted in .mise-installs.toml: instead of embedding opts as a bracket-encoded string inside the full field (e.g. http:hello[url=...,bin_path=bin]), opts are now stored as native TOML under a [<tool>.opts] sub-table. The ToolVersionOptions.opts map is changed from IndexMap<String, String> to IndexMap<String, toml::Value>, preserving nested structures like platforms = { linux-x64 = { url = "..." } } through the full round-trip. A TOML-first parser is added to parse_tool_options with fallback to the legacy manual comma-splitter, and backward-compat migration automatically rewrites old manifests on read.

Key changes:

  • ToolVersionOptions.opts is now IndexMap<String, toml::Value>; a new get() returns Option<&str> for String values only, and opts_as_strings() converts the full map to IndexMap<String, String> for callers that need flat strings
  • write_backend_meta now writes full_without_opts() + a separate opts TOML map, with EPHEMERAL_OPT_KEYS (postinstall, install_env) excluded from persistence
  • From<InstallStateTool> for BackendArg merges manifest opts as defaults with or_insert, so live config opts always take priority
  • All backends updated from .cloned() to .map(|s| s.to_string()) for the narrowed get() return type
  • New e2e test test_http_platform_switch exercises the single-URL → platform-specific-URL migration scenario directly
  • A subtle inconsistency remains in value_exists_at_path: it only considers String leaf values as "existing", while get_nested_string also returns values for Integer/Boolean/Float leaves, meaning contains_key can return false for nested non-String scalars that do exist

Confidence Score: 4/5

  • Safe to merge with attention to the contains_key / value_exists_at_path inconsistency for non-String nested scalar values.
  • The core fix is correct and well-tested — new e2e test, unit tests for TOML parsing and round-trip, and backward-compat migration. The mechanical String → toml::Value updates across backends are all low-risk. A minor logic inconsistency exists between contains_key (only matches String leaves) and get_nested_string (handles Integer/Boolean/Float leaves), which could silently return false for nested non-string scalars (e.g. strip_components = 1 inside a platforms.linux-x64 table). This doesn't affect any current backend today but could surprise future maintainers. A small code-duplication in vfox.rs is also present.
  • src/toolset/tool_version_options.rsvalue_exists_at_path leaf check should mirror get_string_at_path to handle non-String scalars. src/backend/vfox.rs — second call site should use opts_as_strings() instead of an inline reimplementation.

Important Files Changed

Filename Overview
src/toolset/tool_version_options.rs Core change: opts map type changed from IndexMap<String, String> to IndexMap<String, toml::Value>. New get() returns Option<&str>, opts_as_strings() added, and parse_tool_options gains a TOML-first path for nested structures. Minor inconsistency: value_exists_at_path only returns true for String leaf values, unlike get_nested_string which handles Integer/Boolean/Float leaves.
src/toolset/install_state.rs Manifest format extended with a native opts TOML map. write_backend_meta now strips brackets from full and persists opts separately. Backward-compat migration strips [...] from legacy full strings on read and rewrites the manifest. Logic is correct for all expected states, but the migration only triggers when opts.is_empty().
src/cli/args/backend_arg.rs Extracted split_bracketed_opts and strip_opts helpers, replacing repeated inline regexes throughout. From<InstallStateTool> now merges manifest opts as defaults (using or_insert). full_with_opts correctly skips Table/Array values in bracket notation.
src/backend/vfox.rs First call site uses opts_as_strings(), but second call site (exec env path) inlines an equivalent mapping. Functional behaviour is correct but the duplication is a maintenance concern.
src/cli/tool_stub.rs Deserializer updated to keep native toml::Value instead of converting everything to strings. resolve_platform_specific_bin correctly switched from flat-key lookup to nested table navigation. has_http_backend_config properly handles both Table and legacy String representations of the platforms key.
src/config/config_file/mise_toml.rs Added toml_value_to_edit converter for serialization and updated deserialization to keep native TOML values. Template parsing restricted to String variants only. Both MiseTomlToolList and MiseTomlTool now store tables/arrays natively.
e2e/backend/test_http_platform_switch New e2e regression test that installs with a single URL, then switches to platform-specific URLs. Directly exercises the bug described in discussion #7034 and verifies that mise install succeeds in both steps.
src/backend/static_helpers.rs Mechanical updates: .cloned() replaced with `.map(

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[mise install / use] --> B[Read mise.toml config]
    B --> C[Build ToolVersionOptions\nopts: IndexMap&lt;String, toml::Value&gt;]
    C --> D{Has bracket opts\nin full string?}
    D -- Yes --> E[parse_tool_options\nTry TOML inline-table first\nFallback to manual comma-split]
    D -- No --> F[Use opts from struct directly]
    E --> G[Merge into BackendArg.opts]
    F --> G

    G --> H[Backend uses opts]
    H --> I[write_backend_meta]
    I --> J[.mise-installs.toml]
    J --> J1[full = 'http:hello'\nwithout brackets]
    J --> J2["[hello.opts]\nurl = '...'\nbin_path = 'bin'"]

    K[Next mise run: read manifest] --> L{Old format?\nopts empty +\nbrackets in full}
    L -- Yes --> M[Migration: extract opts\nfrom full brackets\nrewrite manifest]
    L -- No --> N[Use native opts map]
    M --> O[InstallStateTool\nfull = stripped\nopts = parsed]
    N --> O
    O --> P[From&lt;InstallStateTool&gt; for BackendArg\nmanifest opts inserted with or_insert\nconfig opts take priority]
Loading

Comments Outside Diff (2)

  1. src/toolset/tool_version_options.rs, line 126-141 (link)

    contains_key silently returns false for non-String nested leaf values

    value_exists_at_path only recognises a populated leaf if it is a toml::Value::String. However, get_nested_string (which also navigates the same path) handles Integer, Boolean, and Float at the leaf and converts them to strings. This means the two methods are inconsistent:

    • get_nested_string("platforms.linux-x64.strip_components")Some("1")
    • contains_key("platforms.linux-x64.strip_components")false ✗ (value exists as Integer(1))

    Non-String scalars can end up inside nested tables when deserialized natively (e.g. strip_components = 1 inside a [tools."http:x".platforms.linux-x64] sub-table). Any backend or future caller that guards on contains_key for such a nested key will silently skip the value even though it exists and can be read.

    Consider mirroring get_string_at_path's leaf logic:

  2. src/backend/vfox.rs, line 580-591 (link)

    Inline opts_as_strings duplication

    The backend_install call at line 119 correctly uses tool_opts.opts_as_strings(), but this second call in backend_exec_env re-implements the same logic inline. If the conversion semantics ever change, this site would be missed.

Fix All in Claude Code

Last reviewed commit: eabd6e9

@jdx jdx force-pushed the fix/http-backend-stale-platforms-cache branch from 2be05b4 to 17b32ba Compare March 3, 2026 13:06
@jdx
Copy link
Copy Markdown
Owner Author

jdx commented Mar 3, 2026

@greptileai

@jdx jdx force-pushed the fix/http-backend-stale-platforms-cache branch from 17b32ba to b4da894 Compare March 3, 2026 13:15
@jdx jdx changed the title fix(http): prevent stale cached platforms from shadowing config fix(http): use TOML parsing for tool options to fix platform switching Mar 3, 2026
When a tool is installed with a single `url` and later switched to
platform-specific URLs, the cached options in the install manifest
were mangled by the comma-based parser, causing "Http backend requires
'url' option" errors.

Fix: parse_tool_options() now tries TOML inline-table parsing first
(handling nested structures correctly), with a legacy manual fallback
for old unquoted manifests. full_with_opts() now quotes string values
to produce valid TOML.

Fixes discussion #7034.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@jdx jdx force-pushed the fix/http-backend-stale-platforms-cache branch from b4da894 to fd2bc60 Compare March 3, 2026 13:26
@github-actions
Copy link
Copy Markdown

github-actions bot commented Mar 3, 2026

Hyperfine Performance

mise x -- echo

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.3.3 x -- echo 25.8 ± 0.6 24.3 30.9 1.01 ± 0.07
mise x -- echo 25.7 ± 1.7 23.7 57.1 1.00

mise env

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.3.3 env 25.5 ± 0.6 23.7 30.5 1.01 ± 0.03
mise env 25.2 ± 0.6 23.4 26.8 1.00

mise hook-env

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.3.3 hook-env 26.4 ± 0.6 24.7 29.2 1.01 ± 0.03
mise hook-env 26.0 ± 0.5 24.3 27.8 1.00

mise ls

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.3.3 ls 25.4 ± 0.9 23.7 35.3 1.01 ± 0.04
mise ls 25.2 ± 0.6 23.5 27.8 1.00

xtasks/test/perf

Command mise-2026.3.3 mise Variance
install (cached) 159ms 157ms +1%
ls (cached) 87ms 87ms +0%
bin-paths (cached) 91ms 89ms +2%
task-ls (cached) 870ms 852ms +2%

jdx and others added 3 commits March 4, 2026 01:59
Instead of encoding opts inside brackets in the manifest's `full` field
(e.g. `http:hello[url=..., platforms={...}]`), store them as a separate
native TOML `[tool.opts]` table. This avoids round-trip mangling of
nested structures like platform-specific URLs.

Includes backward compat: old manifests with bracketed opts in `full`
are automatically migrated on read.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace 9 duplicated regex patterns for parsing bracketed tool options
(e.g. `http:hello[url=...]`) with two reusable helper functions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@jdx jdx changed the title fix(http): use TOML parsing for tool options to fix platform switching fix(http): store tool opts as native TOML to fix platform switching Mar 4, 2026
@jdx
Copy link
Copy Markdown
Owner Author

jdx commented Mar 4, 2026

bugbot run

@jdx
Copy link
Copy Markdown
Owner Author

jdx commented Mar 4, 2026

@greptileai review

Use ba.opts (the field) instead of ba.opts() (the method) in
write_backend_meta to avoid persisting registry default options.
This prevents stale stored values from overriding updated registry
defaults.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…n test

- Extract duplicated string-to-toml::Value conversion into
  str_to_toml_value() helper
- Fix e2e test to use darwin-x64 (not darwin-amd64) matching mise's
  arch normalization (x86_64 → x64)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add manifest_opts field to BackendArg to carry native toml::Value opts
from the install manifest directly, avoiding lossy conversion through
ToolVersionOptions string intermediary. Tables no longer degrade to
escaped strings on re-write.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use full_without_opts() instead of full() in write_backend_meta()
to prevent storing opts in both the full field (as brackets) and
the separate opts map.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Start with manifest_opts, override with user opts (matching the read
path in opts()), and always filter EPHEMERAL_OPT_KEYS. This fixes
two issues: manifest_opts bypassing ephemeral key filtering, and
manifest_opts shadowing updated user opts during write.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Manifest opts are user-specified options stored in native TOML format.
Use insert() instead of entry().or_insert_with() so they override
registry defaults, matching the precedence of user_opts parsed from
brackets.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move manifest_opts merge before user_opts merge in opts() so the
precedence is: registry defaults < manifest opts (cached) < user opts
(fresh config). Previously manifest opts were merged last, silently
overriding user-provided values with stale cached values.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Change ToolVersionOptions.opts from IndexMap<String, String> to
IndexMap<String, toml::Value> so nested structures like platform-specific
URLs survive round-trips without lossy string conversion.

This eliminates the manifest_opts field on BackendArg and the
str_to_toml_value helper, since opts are now natively TOML throughout
the entire pipeline: config parsing → BackendArg → manifest storage.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@jdx
Copy link
Copy Markdown
Owner Author

jdx commented Mar 4, 2026

bugbot run

Integer and boolean TOML values (e.g. strip_components = 1) were stored
as native toml::Value::Integer, but opts.get() only returns string values
via as_str(), causing these options to silently return None.

Convert scalar non-string/non-table/non-array values to strings at parse
time. Tables and arrays remain as native TOML to preserve nested structures.

Also removes unused get_value method.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
}
// Fall back to manual parsing for legacy formats with unquoted values
parse_tool_options_manual(s)
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

TOML-first parsing silently changes whitespace and value semantics

Medium Severity

parse_tool_options now tries TOML parsing first via try_parse_as_toml. For legacy bracket-encoded option strings where values happen to be valid TOML literals (e.g. locked=true, strip_components=1), the TOML parser succeeds and strips whitespace from values. Previously the manual parser preserved raw values including surrounding whitespace. For example, " exe = true " would yield value " true " (with spaces) via the manual parser, but now the TOML parser succeeds and yields "true" (trimmed). This also means values like 0x2A (hex literal) become "42" after TOML integer parsing and string conversion, changing semantics from the legacy format.

Fix in Cursor Fix in Web

opts.opts
.iter()
.map(|(k, v)| (k.clone(), v.as_str().unwrap_or_default().to_string()))
.collect(),
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

vfox env_keys receives changed opts type silently

Low Severity

For non-backend vfox plugins, vfox.env_keys is called with &opts.opts which is now IndexMap<String, toml::Value> instead of the previous IndexMap<String, String>. While the generic T: Serialize signature compiles, the Lua serialization of toml::Value::Table or toml::Value::Array produces nested structures rather than the TOML string representation the plugins may expect. The backend-plugin path at lines 303-306 explicitly converts to IndexMap<String, String>, but this non-backend path was not updated.

Fix in Cursor Fix in Web

jdx and others added 3 commits March 5, 2026 02:11
Tool stubs were serializing TOML tables to strings then wrapping them
back as toml::Value::String, causing lookup_platform_key to fail since
it expects toml::Value::Table for nested platform structures.

Keep tables/arrays as native toml::Value throughout the tool stub
pipeline, matching the approach in mise_toml.rs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@jdx
Copy link
Copy Markdown
Owner Author

jdx commented Mar 5, 2026

bugbot run

@jdx
Copy link
Copy Markdown
Owner Author

jdx commented Mar 5, 2026

@greptileai

- Fix Hash/Eq contract violation: recursively sort Table entries before
  hashing so structurally equal Tables with different insertion orders
  produce identical hashes
- Skip Table/Array values in full_with_opts bracket serialization since
  they can't round-trip through bracket notation
- Fix non-string TOML values silently becoming empty strings in asdf,
  external_plugin_cache, and vfox backends
- Add comment explaining why install_env is in EPHEMERAL_OPT_KEYS

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Copy link
Copy Markdown

@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.

… conversion

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@jdx
Copy link
Copy Markdown
Owner Author

jdx commented Mar 7, 2026

@greptileai

@jdx jdx merged commit 0e42414 into main Mar 7, 2026
36 checks passed
@jdx jdx deleted the fix/http-backend-stale-platforms-cache branch March 7, 2026 01:33
mise-en-dev added a commit that referenced this pull request Mar 7, 2026
### 🚀 Features

- **(github)** keep exe extensions on Windows by @iki in
[#8424](#8424)
- **(task)** add `interactive` field for exclusive terminal access by
@jdx in [#8491](#8491)
- add header comment to generated lockfiles by @ivy in
[#8481](#8481)
- runtime musl/glibc detection for correct libc variant selection by
@jdx in [#8490](#8490)

### 🐛 Bug Fixes

- **(github)** use registry platform options during install by @jdx in
[#8492](#8492)
- **(http)** store tool opts as native TOML to fix platform switching by
@jdx in [#8448](#8448)
- **(installer)** error if MISE_INSTALL_PATH is a directory by @jdx in
[#8468](#8468)
- **(prepare)** resolve sources/outputs relative to `dir` when set by
@jdx in [#8472](#8472)
- **(ruby)** fetch precompiled binary by release tag instead of listing
all releases by @jdx in [#8488](#8488)
- **(schema)** support structured objects in task depends by @risu729 in
[#8463](#8463)
- **(task)** replace println!/eprintln! with calm_io in task output
macros by @vmaleze in [#8485](#8485)
- handle scoped npm package names without backend prefix by @jdx in
[#8477](#8477)

### 📦️ Dependency Updates

- update ghcr.io/jdx/mise:copr docker digest to c485c4c by
@renovate[bot] in [#8484](#8484)
- update ghcr.io/jdx/mise:alpine docker digest to 8118bc7 by
@renovate[bot] in [#8483](#8483)

### 📦 Registry

- disable sd version test by @jdx in
[#8489](#8489)

### New Contributors

- @ivy made their first contribution in
[#8481](#8481)
- @iki made their first contribution in
[#8424](#8424)

## 📦 Aqua Registry Updates

#### New Packages (5)

- [`datadog-labs/pup`](https://github.com/datadog-labs/pup)
- [`k1LoW/mo`](https://github.com/k1LoW/mo)
- [`rtk-ai/rtk`](https://github.com/rtk-ai/rtk)
-
[`suzuki-shunsuke/docfresh`](https://github.com/suzuki-shunsuke/docfresh)
- [`yashikota/exiftool-go`](https://github.com/yashikota/exiftool-go)

#### Updated Packages (6)

- [`cloudflare/cloudflared`](https://github.com/cloudflare/cloudflared)
- [`mozilla/sccache`](https://github.com/mozilla/sccache)
- [`owenlamont/ryl`](https://github.com/owenlamont/ryl)
- [`spinel-coop/rv`](https://github.com/spinel-coop/rv)
-
[`technicalpickles/envsense`](https://github.com/technicalpickles/envsense)
- [`weaviate/weaviate`](https://github.com/weaviate/weaviate)
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.

1 participant