Skip to content

feat(system): support custom brew taps#10375

Merged
jdx merged 1 commit into
mainfrom
codex/custom-brew-taps
Jun 13, 2026
Merged

feat(system): support custom brew taps#10375
jdx merged 1 commit into
mainfrom
codex/custom-brew-taps

Conversation

@jdx

@jdx jdx commented Jun 13, 2026

Copy link
Copy Markdown
Owner

Summary

  • add [system.brew.taps] for declaring Homebrew tap remotes, similar to [plugins]
  • add imperative mise system brew tap / mise system brew untap commands that shell out to Homebrew without modifying mise.toml
  • route fully-qualified third-party brew formulae through a real brew command
  • run brew tap and brew update-if-needed before installing or upgrading tapped formulae
  • keep homebrew/core formulae on mise’s direct bottle/source installer path
  • address review feedback by sharing tap parsing, applying configured tap URLs to explicit package specs, bounding brew subprocesses with timeouts, and parsing brew list --versions safely

Validation

  • cargo fmt --all
  • mise run lint
  • cargo test test_brew_tap_name
  • cargo test test_tapped_formula_detection
  • cargo test test_system_packages
  • cargo check --all-features
  • cargo build
  • mise run render:usage
  • MISE_EXPERIMENTAL=1 target/debug/mise system install brew:acme/tools/widget --dry-run --yes
  • MISE_EXPERIMENTAL=1 target/debug/mise system brew tap acme/tools https://git.example.com/acme/homebrew-tools.git --dry-run
  • MISE_EXPERIMENTAL=1 target/debug/mise system brew untap acme/tools --dry-run
  • git diff --check

Note

Medium Risk
Changes brew system-package install/upgrade paths and runs timed brew subprocesses; scope is experimental system packages, not auth, but mis-tapped installs could affect the host Homebrew environment.

Overview
Adds third-party Homebrew tap support for experimental [system.packages] brew entries while keeping homebrew/core on mise’s direct bottle/source installer.

Declarative config gains [system.brew.taps] (owner/tap → git URL, like [plugins]). Tapped formulae use names like brew:owner/tap/formula; install/upgrade/status attach tap_url from config, run brew tap (with URL when needed) and brew update-if-needed, then delegate brew install / brew upgrade for tapped packages only. Core formulae still use the existing pour path and do not shell out to brew.

New Unix-only commands mise system brew tap and untap (with --dry-run) call Homebrew directly and do not edit mise.toml. mise system install / upgrade / use load config when resolving explicit package specs so tap URLs apply there too.

Docs, usage spec, man page, and Fig metadata are updated; limitations now note tapped formulae require a real Homebrew install.

Reviewed by Cursor Bugbot for commit 5eb0471. Bugbot is set up for automated code reviews on this repo. Configure here.

Summary by CodeRabbit

  • New Features

    • Configure third‑party Homebrew taps via [system.brew.taps]; new CLI: mise system brew tap / untap (with --dry-run). Tapped formulae use the Homebrew CLI; homebrew/core stays handled directly.
  • Documentation

    • Expanded docs, CLI help, and man page explaining core vs tapped behavior, tap configuration (including custom/non‑GitHub URLs), imperative tap/untap commands, and updated limitations.
  • Bug Fixes

    • Improved detection of tapped vs core formulae and more accurate installed‑version/status resolution for tapped packages.

@coderabbitai

coderabbitai Bot commented Jun 13, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds [system.brew.taps] TOML support and attaches tap URLs to package requests; routes homebrew/core formulae through pour while delegating third‑party tapped formulae to the system brew (ensuring taps and running brew update), plus CLI tap/untap commands, docs, and tests.

Changes

Homebrew Taps Configuration and Installation

Layer / File(s) Summary
Package Request Contract with Tap URL
src/system/packages/mod.rs
PackageRequest now includes an optional tap_url field to carry tap Git URLs for brew tapped formulae.
System Brew Configuration Schema
src/system/mod.rs, src/config/config_file/mise_toml.rs
New SystemBrewTomlConfig and SystemTomlConfig.brew expose [system.brew.taps]; test TOML fixture and assertions updated to include a pinned tap URL.
Configuration parsing and request population
src/system/mod.rs, src/system/packages/*
Merges [system.brew.taps] across config hierarchy, adds brew_tap_name to extract/validate owner/tap from formula strings, and threads resolved tap_url into PackageRequests; CLI/spec parsing keeps CLI-derived tap_url: None unless a config is provided. Unit-test helpers updated.
Brew manager: core vs tapped routing
src/system/packages/brew/mod.rs
Splits requested formulae into core and tapped sets; core formulae use existing pour-based install/status paths; tapped formulae are installed/upgraded by invoking the system brew binary after ensuring taps and running brew update-if-needed. Adds brew discovery, subprocess/run helpers, tap/untap wrappers, brew list --versions parsing, and tests.
CLI, docs, usage, and tests
src/cli/system/..., docs/*, mise.usage.kdl, xtasks/*
Adds Unix-gated mise system brew command with tap and untap subcommands, documents behavior and [system.brew.taps], updates CLI index and usage KDL, extends Fig completions, and adjusts CLI install/upgrade/use code paths to load config when resolving specs.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

Possibly related PRs

  • jdx/mise#10326: Initial Homebrew manager work extended here with tap-aware handling and brew delegation.
  • jdx/mise#10346: Related changes to spec parsing and system package flows that this PR builds upon.

Poem

🐰 I hopped through TOML, maps in paw,

core pours steady, taps knock at the door,
brew tap then brew update sings,
third‑party bottles find their wings,
a rabbit cheers and hops once more!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 66.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title 'feat(system): support custom brew taps' is concise, specific, and directly describes the main feature addition—custom Homebrew tap support—which is the core objective of this PR.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

@jdx jdx marked this pull request as ready for review June 13, 2026 03:21
Comment thread src/system/mod.rs Outdated
@greptile-apps

greptile-apps Bot commented Jun 13, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds third-party Homebrew tap support to mise's system package manager: a declarative [system.brew.taps] config section, new mise system brew tap/untap CLI commands, and routing of fully-qualified tapped formulae (owner/tap/formula) through the real brew binary while keeping homebrew/core on mise's direct bottle path.

  • Adds SystemBrewTomlConfig.taps (IndexMap of tap name \u2192 git URL), brew_tap_name and brew_taps_from_config helpers, and attach_brew_tap_urls for wiring tap URLs into PackageRequest.tap_url across all CLI paths (install, upgrade, use).
  • Splits the BrewManager install/upgrade dispatch between tapped and core formulae, running brew tap + brew update-if-needed + brew install/upgrade (with 30-minute timeouts) for tapped packages and mise's own bottle pouring for core ones.
  • Introduces brew_list_version (safer two-token parsing) for status checks on tapped formulae and gates all new CLI subcommands behind #[cfg(unix)] and the experimental flag.

Confidence Score: 4/5

Safe to merge after addressing the core-formula install ordering fix; tapped-formula path is well-contained and does not regress existing homebrew/core behaviour.

The install and upgrade methods perform an early brew-binary check before installing core formulae. When a user mixes core and tapped packages and the brew binary is absent, the check fails and core formulae — which never need brew — are silently skipped. The check inside install_via_brew / upgrade_via_brew already covers this, so the early guards are redundant and can be dropped without any other changes.

src/system/packages/brew/mod.rs — the install and upgrade method ordering

Important Files Changed

Filename Overview
src/system/packages/brew/mod.rs Core brew functionality for tapped formulae; early brew-binary check in install/upgrade blocks core-formula installation when brew is absent
src/system/mod.rs Adds brew tap config structs, brew_tap_name helper, brew_taps_from_config, attach_brew_tap_urls, and packages_from_specs_with_config — logic is correct and well-tested
src/system/packages/mod.rs Adds tap_url field to PackageRequest; tap_url participates in derived PartialEq/Hash (noted in previous review)
src/cli/system/brew/mod.rs New unix-gated brew subcommand module routing to tap/untap; correctly gates behind experimental flag
src/cli/system/install.rs Switched from packages_from_specs to packages_from_specs_with_config to attach tap URLs from config
src/cli/system/upgrade.rs Same packages_from_specs_with_config switch as install.rs
src/cli/system/use.rs Loads config and calls attach_brew_tap_urls before resolving managers
src/config/config_file/mise_toml.rs Adds test for [system.brew.taps] deserialization — correct

Reviews (5): Last reviewed commit: "feat(system): support custom brew taps" | Re-trigger Greptile

Comment thread src/system/packages/brew/mod.rs Outdated
Comment thread src/system/packages/brew/mod.rs
Comment thread src/system/packages/brew/mod.rs

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
docs/system-packages/brew.md (1)

3-3: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Make the opening statement conditional.

Line 3 says Homebrew is not required, but tapped flows later in this page require a real brew. Tighten this sentence to explicitly scope the “no Homebrew required” claim to homebrew/core formulae.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/system-packages/brew.md` at line 3, The opening claim "Homebrew formulae
— **without requiring Homebrew to be installed**." is too broad; limit the scope
to only homebrew/core formulae. Edit that header/text to read something like
"Homebrew formulae from homebrew/core — without requiring Homebrew to be
installed." and add a short qualifier sentence noting that tapped formulae and
flows that reference third‑party taps still require a real brew installation (so
readers know why later "tapped flows" need brew). Ensure you update the exact
string "Homebrew formulae — **without requiring Homebrew to be installed**." and
any nearby sentences referencing "tapped flows" to reflect this narrower scope.
🧹 Nitpick comments (1)
src/system/mod.rs (1)

237-250: ⚡ Quick win

Unify tap-name parsing in one shared helper.

brew_tap_name is implemented here and again in src/system/packages/brew/mod.rs. If they drift, config-time tap_url attachment and runtime tapped/core routing will disagree. Please centralize this parser and reuse it in both places.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/system/mod.rs` around lines 237 - 250, The brew_tap_name parsing logic is
duplicated (one implementation in brew_tap_name and another in the Brew package
module); extract a single shared helper (e.g., pub(crate) fn parse_brew_tap_name
or make brew_tap_name pub(crate)) and replace the duplicate implementation in
the packages/brew module to call that centralized function, adjusting visibility
and imports as needed so both callers use the same logic and behavior (retain
the exact current semantics: split on '/', require exactly three parts, treat
"homebrew/core" as None, and return the tap via rsplit_once).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/system/packages/brew/mod.rs`:
- Around line 391-396: The subprocess awaits in run_brew and brew_list_version
can hang indefinitely; wrap the .status().await calls in tokio::time::timeout
with a sensible Duration (e.g. from a constant or config) and map timeout errors
to a clear error message; update the code around the calls in run_brew and
brew_list_version (identify the Command::new(brew) ... .status().await
sequences) to use timeout(...).await, convert Err(elapsed) into a descriptive
wrap_err_with like "brew timed out after <duration> running <display_cmd(...)>"
and preserve existing error wrapping for non-timeout failures.

---

Outside diff comments:
In `@docs/system-packages/brew.md`:
- Line 3: The opening claim "Homebrew formulae — **without requiring Homebrew to
be installed**." is too broad; limit the scope to only homebrew/core formulae.
Edit that header/text to read something like "Homebrew formulae from
homebrew/core — without requiring Homebrew to be installed." and add a short
qualifier sentence noting that tapped formulae and flows that reference
third‑party taps still require a real brew installation (so readers know why
later "tapped flows" need brew). Ensure you update the exact string "Homebrew
formulae — **without requiring Homebrew to be installed**." and any nearby
sentences referencing "tapped flows" to reflect this narrower scope.

---

Nitpick comments:
In `@src/system/mod.rs`:
- Around line 237-250: The brew_tap_name parsing logic is duplicated (one
implementation in brew_tap_name and another in the Brew package module); extract
a single shared helper (e.g., pub(crate) fn parse_brew_tap_name or make
brew_tap_name pub(crate)) and replace the duplicate implementation in the
packages/brew module to call that centralized function, adjusting visibility and
imports as needed so both callers use the same logic and behavior (retain the
exact current semantics: split on '/', require exactly three parts, treat
"homebrew/core" as None, and return the tap via rsplit_once).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 29e8ba4d-c2f1-4a3f-b027-e90dd1b2d075

📥 Commits

Reviewing files that changed from the base of the PR and between 797611e and 4d24fde.

📒 Files selected for processing (8)
  • docs/system-packages/brew.md
  • src/config/config_file/mise_toml.rs
  • src/system/mod.rs
  • src/system/packages/apt.rs
  • src/system/packages/brew/mod.rs
  • src/system/packages/dnf.rs
  • src/system/packages/mod.rs
  • src/system/packages/pacman.rs

Comment thread src/system/packages/brew/mod.rs Outdated
@jdx jdx force-pushed the codex/custom-brew-taps branch from 4d24fde to d45c692 Compare June 13, 2026 03:27
@jdx jdx marked this pull request as draft June 13, 2026 03:27
@jdx jdx marked this pull request as ready for review June 13, 2026 03:27
@jdx jdx force-pushed the codex/custom-brew-taps branch from d45c692 to 010d2aa Compare June 13, 2026 03:33
Comment thread src/system/packages/brew/mod.rs

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick comments (3)
src/cli/system/use.rs (1)

56-56: ⚡ Quick win

Import Config for consistency.

install.rs and upgrade.rs both import Config from crate::config, but this file uses the fully qualified path. For consistency and brevity, consider adding Config to the existing import at line 9.

♻️ Proposed fix
-use crate::config::{ConfigPathOptions, Settings, resolve_target_config_path};
+use crate::config::{Config, ConfigPathOptions, Settings, resolve_target_config_path};

Then update line 56:

-        let config = crate::config::Config::get().await?;
+        let config = Config::get().await?;
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/cli/system/use.rs` at line 56, The code uses the fully-qualified call
crate::config::Config::get() in use.rs; add Config to the existing imports (so
Config is brought into scope) and then replace the fully-qualified call with
Config::get(). In other words, update the imports to include the Config type
(matching install.rs/upgrade.rs) and change the call site (the expression using
crate::config::Config::get()) to Config::get() to keep style consistent and
concise.
src/system/mod.rs (2)

137-145: ⚡ Quick win

Make attach_brew_tap_urls additive.

This helper currently overwrites any pre-set request.tap_url with the config lookup result. If a caller ever passes already-resolved brew requests through it, an unmatched config entry will clear that metadata back to None. Only fill missing values here so the helper behaves like “attach”, not “replace”.

♻️ Suggested change
 pub fn attach_brew_tap_urls(config: &Config, by_mgr: &mut IndexMap<String, Vec<PackageRequest>>) {
     let brew_taps = brew_taps_from_config(config);
     let Some(requests) = by_mgr.get_mut("brew") else {
         return;
     };
     for request in requests {
-        request.tap_url = brew_tap_name(&request.name).and_then(|tap| brew_taps.get(tap).cloned());
+        if request.tap_url.is_none() {
+            request.tap_url =
+                brew_tap_name(&request.name).and_then(|tap| brew_taps.get(tap).cloned());
+        }
     }
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/system/mod.rs` around lines 137 - 145, The function attach_brew_tap_urls
currently unconditionally sets request.tap_url from the config which can
overwrite an already-resolved tap_url; change the logic so it only fills missing
values: inside attach_brew_tap_urls (operating on requests from
by_mgr.get_mut("brew")), check request.tap_url.is_none() before calling
brew_tap_name(&request.name) and assigning from brew_taps.get(tap).cloned(),
leaving existing tap_url values intact; keep using brew_taps_from_config and
brew_tap_name as the lookup helpers.

359-368: ⚡ Quick win

Add one regression test for tap-url attachment, not just tap parsing.

The new behavior here is the URL attachment path used by mise system use and explicit mise system install, but the added test only exercises brew_tap_name() in isolation. A focused test that proves owner/tap/formula picks up the configured URL while homebrew/core/* stays unset would lock down the cross-file contract more effectively. Based on the install/use call paths in the provided snippets and the PR objective for config-driven tap resolution.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/system/mod.rs` around lines 359 - 368, Add a regression test that not
only asserts brew_tap_name() parsing but also exercises the higher-level tap URL
attachment path used by the CLI commands ("mise system use" / "mise system
install") to ensure owner/tap/formula picks up a configured tap URL while
homebrew/core/* remains unset; in practice add a test which calls the same
install/use code path (the function invoked by those commands) with a configured
tap URL for "railwaycat/emacsmacport/emacs-mac" and assert the resolved
attachment URL is present, then call the same path for "homebrew/core/jq" and
"jq" and assert their attachment URL is None, keeping brew_tap_name() assertions
as part of the test to lock the cross-file contract.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@src/cli/system/use.rs`:
- Line 56: The code uses the fully-qualified call crate::config::Config::get()
in use.rs; add Config to the existing imports (so Config is brought into scope)
and then replace the fully-qualified call with Config::get(). In other words,
update the imports to include the Config type (matching install.rs/upgrade.rs)
and change the call site (the expression using crate::config::Config::get()) to
Config::get() to keep style consistent and concise.

In `@src/system/mod.rs`:
- Around line 137-145: The function attach_brew_tap_urls currently
unconditionally sets request.tap_url from the config which can overwrite an
already-resolved tap_url; change the logic so it only fills missing values:
inside attach_brew_tap_urls (operating on requests from by_mgr.get_mut("brew")),
check request.tap_url.is_none() before calling brew_tap_name(&request.name) and
assigning from brew_taps.get(tap).cloned(), leaving existing tap_url values
intact; keep using brew_taps_from_config and brew_tap_name as the lookup
helpers.
- Around line 359-368: Add a regression test that not only asserts
brew_tap_name() parsing but also exercises the higher-level tap URL attachment
path used by the CLI commands ("mise system use" / "mise system install") to
ensure owner/tap/formula picks up a configured tap URL while homebrew/core/*
remains unset; in practice add a test which calls the same install/use code path
(the function invoked by those commands) with a configured tap URL for
"railwaycat/emacsmacport/emacs-mac" and assert the resolved attachment URL is
present, then call the same path for "homebrew/core/jq" and "jq" and assert
their attachment URL is None, keeping brew_tap_name() assertions as part of the
test to lock the cross-file contract.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 1f899d94-4703-43af-a97a-3872747944b7

📥 Commits

Reviewing files that changed from the base of the PR and between d45c692 and 010d2aa.

📒 Files selected for processing (21)
  • docs/cli/index.md
  • docs/cli/system.md
  • docs/cli/system/brew.md
  • docs/cli/system/brew/tap.md
  • docs/cli/system/brew/untap.md
  • docs/system-packages/brew.md
  • mise.usage.kdl
  • src/cli/system/brew/mod.rs
  • src/cli/system/brew/tap.rs
  • src/cli/system/brew/untap.rs
  • src/cli/system/install.rs
  • src/cli/system/mod.rs
  • src/cli/system/upgrade.rs
  • src/cli/system/use.rs
  • src/config/config_file/mise_toml.rs
  • src/system/mod.rs
  • src/system/packages/apt.rs
  • src/system/packages/brew/mod.rs
  • src/system/packages/dnf.rs
  • src/system/packages/mod.rs
  • src/system/packages/pacman.rs
✅ Files skipped from review due to trivial changes (5)
  • src/system/packages/dnf.rs
  • docs/cli/system/brew/tap.md
  • docs/cli/system.md
  • docs/cli/index.md
  • docs/cli/system/brew/untap.md
🚧 Files skipped from review as they are similar to previous changes (11)
  • src/system/packages/pacman.rs
  • src/system/packages/apt.rs
  • src/system/packages/mod.rs
  • docs/cli/system/brew.md
  • docs/system-packages/brew.md
  • src/config/config_file/mise_toml.rs
  • src/cli/system/brew/tap.rs
  • src/cli/system/brew/untap.rs
  • src/cli/system/brew/mod.rs
  • mise.usage.kdl
  • src/system/packages/brew/mod.rs

@jdx jdx force-pushed the codex/custom-brew-taps branch from 010d2aa to aa5e948 Compare June 13, 2026 03:39

@cursor cursor Bot left a comment

Copy link
Copy Markdown

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.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit aa5e948. Configure here.

Comment thread src/system/packages/brew/mod.rs
@jdx jdx force-pushed the codex/custom-brew-taps branch from aa5e948 to 1c0d937 Compare June 13, 2026 03:47
@jdx jdx force-pushed the codex/custom-brew-taps branch from 1c0d937 to 5eb0471 Compare June 13, 2026 03:57
@github-actions

Copy link
Copy Markdown

Hyperfine Performance

mise x -- echo

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.6.5 x -- echo 17.9 ± 0.8 16.4 21.1 1.00
mise x -- echo 18.7 ± 1.6 17.2 44.0 1.05 ± 0.10

mise env

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.6.5 env 17.8 ± 0.8 16.2 22.9 1.00
mise env 18.5 ± 0.9 16.9 22.6 1.04 ± 0.07

mise hook-env

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.6.5 hook-env 18.3 ± 0.8 16.9 24.4 1.00
mise hook-env 19.1 ± 0.8 17.5 23.1 1.04 ± 0.06

mise ls

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.6.5 ls 14.9 ± 0.7 13.6 18.6 1.00
mise ls 15.6 ± 0.7 14.1 21.2 1.04 ± 0.07

xtasks/test/perf

Command mise-2026.6.5 mise Variance
install (cached) 132ms 132ms +0%
ls (cached) 57ms 59ms -3%
bin-paths (cached) 62ms 65ms -4%
task-ls (cached) 123ms 124ms +0%

@jdx jdx merged commit 2c32943 into main Jun 13, 2026
35 checks passed
@jdx jdx deleted the codex/custom-brew-taps branch June 13, 2026 04:11
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