Skip to content

docs: implement landing page design#9266

Merged
jdx merged 1 commit intomainfrom
codex/landing-page-design
Apr 20, 2026
Merged

docs: implement landing page design#9266
jdx merged 1 commit intomainfrom
codex/landing-page-design

Conversation

@jdx
Copy link
Copy Markdown
Owner

@jdx jdx commented Apr 20, 2026

Summary

  • implement the exported landing-page design on the VitePress homepage
  • replace the default home feature cards with the hero, metaphor, feature menu, pantry ticker, comparison, quickstart, and CTA sections
  • keep every pantry ticker item in the same serif font

Validation

  • npm run docs:build
  • pre-commit hook via git commit, including prettier, cargo-fmt, cargo-check, shellcheck, shfmt, pkl, taplo, lua-check, stylua, actionlint, markdownlint, and schema

This PR was generated by an AI coding assistant.


Note

Medium Risk
Large homepage markup/CSS overhaul that could introduce layout/regression issues across breakpoints and dark mode, but it’s confined to docs presentation (no runtime/business logic).

Overview
Replaces the VitePress homepage’s default hero/actions/features with a custom, design-driven landing experience (new hero copy, terminal-style workflow preview, metaphor/menu sections, scrolling “pantry” ticker, quickstart recipe tabs, and CTA) in docs/index.md and theme overrides.

Updates Layout.vue to render the new hero structure, remove the old logo-centric and promo banner UI, and improve the install command copy behavior with a clipboard API fallback. Adds substantial new landing-page CSS (grid/typography/components/responsive rules) and tweaks existing styles (e.g., feature card radius, hero actions spacing) to match the new layout.

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

@jdx jdx force-pushed the codex/landing-page-design branch 3 times, most recently from 1ad3e40 to 8542aaf Compare April 20, 2026 03:57
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 implements a comprehensive redesign of the landing page, replacing the default VitePress hero and feature components with a custom layout that includes a terminal simulation, a tool pantry, and detailed sections explaining the "mise en place" concept. Key technical changes include a large addition of CSS for the new design and an update to the clipboard copy functionality. Feedback focuses on adhering to VitePress clean URL conventions by removing .html extensions from links, improving the robustness of the copy-to-clipboard UI feedback by handling the underlying promise, and using literal newlines in markdown code blocks for better maintainability.

Comment thread docs/.vitepress/theme/Layout.vue Outdated
Comment on lines +35 to +36
<a class="action-btn action-btn-brand" href="/getting-started.html">Getting Started</a>
<a class="action-btn action-btn-alt" href="/demo.html">Demo</a>
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.

medium

Hardcoding the .html extension in links is generally discouraged in VitePress, which typically uses clean URLs (e.g., /getting-started instead of /getting-started.html). This also introduces inconsistency with the previous implementation and other parts of the documentation.

          <a class="action-btn action-btn-brand" href="/getting-started">Getting Started</a>
          <a class="action-btn action-btn-alt" href="/demo">Demo</a>

Comment thread docs/.vitepress/theme/Layout.vue Outdated
<code>curl https://mise.run | sh</code>
<span class="install-copy" :class="{ copied }">{{ copied ? "copied" : "copy" }}</span>
</button>
<a class="install-alt" href="/installing-mise.html">More install methods</a>
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.

medium

For consistency with VitePress's clean URL structure, consider removing the .html extension from this link.

          <a class="install-alt" href="/installing-mise">More install methods</a>

Comment thread docs/.vitepress/theme/Layout.vue Outdated
Comment on lines 82 to 86
function copyInstall() {
navigator.clipboard.writeText("curl https://mise.run | sh");
navigator.clipboard?.writeText("curl https://mise.run | sh");
copied.value = true;
setTimeout(() => (copied.value = false), 2000);
}
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.

medium

The copyInstall function currently provides optimistic feedback by setting copied.value = true even if the clipboard operation fails or is not supported (e.g., in a non-secure context). It is better to wait for the promise to resolve before updating the UI state to ensure the feedback is accurate.

function copyInstall() {
  navigator.clipboard?.writeText("curl https://mise.run | sh")?.then(() => {
    copied.value = true;
    setTimeout(() => (copied.value = false), 2000);
  });
}

Comment thread docs/index.md Outdated
<div class="landing-section-heading">
<p class="landing-kicker">The Menu</p>
<h2>Three dishes, one kitchen.</h2>
<a href="/getting-started.html" class="landing-small-button">All docs</a>
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.

medium

This link uses an explicit .html extension, which is inconsistent with the clean URL style used elsewhere in the project and the previous version of this file.

Suggested change
<a href="/getting-started.html" class="landing-small-button">All docs</a>
<a href="/getting-started" class="landing-small-button">All docs</a>

Comment thread docs/index.md Outdated
</p>
<div class="landing-mini-install"><code>curl https://mise.run | sh</code></div>
</div>
</div>
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.

medium

Using HTML entities like &#10; for newlines inside a <pre><code> block makes the content difficult to read and maintain in the source file. Literal newlines are preserved within these tags and are much clearer.

Suggested change
</div>
<pre><code>$ curl https://mise.run | sh
$ mise use node@24 [email protected] terraform@1
✓ wrote mise.toml
✓ installed 3 tools
$ mise run test
→ lint · typecheck · unit · e2e
✓ 4 tasks complete</code></pre>

Comment thread docs/index.md Outdated
Comment on lines +125 to +126
<div class="recipe-step"><span>01</span> Install mise</div>
<div class="recipe-step"><span>02</span> Add and install tools</div>
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.

medium

Consider removing the .html extensions from these links to maintain consistency with VitePress's clean URL structure.

Suggested change
<div class="recipe-step"><span>01</span> Install mise</div>
<div class="recipe-step"><span>02</span> Add and install tools</div>
<a href="/getting-started">Getting started</a>
<a href="/demo">Run the demo</a>

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented Apr 20, 2026

Greptile Summary

Replaces the VitePress homepage with a full designed landing experience: hero with terminal preview and copy-install button, metaphor section, feature menu, full-bleed pantry ticker, aube promo, tabbed quickstart recipe, and CTA. All three prior review concerns are resolved — the ticker now correctly duplicates all 14 items (28 total), the clipboard copy only shows "copied" when the write actually succeeds, and the deprecated execCommand path is kept only as a fallback.

Confidence Score: 5/5

Safe to merge; only P2 suggestions remain, neither affects functionality or correctness.

All changes are docs/theme styling with no impact on the Rust codebase. Prior P1 findings (ticker loop jump, false clipboard feedback) have been addressed in this PR. The two remaining comments are a missing prefers-reduced-motion guard and a deprecated-but-functional execCommand fallback — both P2.

No files require special attention.

Important Files Changed

Filename Overview
docs/.vitepress/theme/Layout.vue Adds hero copy, terminal preview, and copy-install button. The clipboard logic correctly gates copied.value = true on the return value of copyText, so the false-positive feedback issue from a prior review is resolved. Minor: textarea fallback uses deprecated execCommand.
docs/.vitepress/theme/custom.css Adds all landing-page styles (hero, ticker, aube promo, recipe grid, CTA). CSS is well-structured with responsive breakpoints. The continuously-running ticker and glow animations lack a prefers-reduced-motion guard.
docs/index.md New long-form homepage content with metaphor, feature menu, ticker, aube promo, tabbed quickstart, and CTA. Ticker now duplicates all 14 items correctly (28 total), fixing the loop-boundary jump noted in a prior review.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[User clicks Install button] --> B{copyText called}
    B --> C{navigator.clipboard available?}
    C -- Yes --> D[await clipboard.writeText]
    D -- Resolves --> E[return true]
    D -- Rejects --> F[catch → fall through]
    C -- No → optional chain returns undefined --> F
    F --> G[Create hidden textarea]
    G --> H[document.execCommand copy]
    H --> I[return boolean result]
    E --> J{copyInstall checks return}
    I --> J
    J -- truthy --> K[copied = true, reset after 2s]
    J -- falsy --> L[no UI feedback]
Loading

Fix All in Claude Code

Reviews (4): Last reviewed commit: "docs: implement landing page design" | Re-trigger Greptile

Comment thread docs/index.md Outdated
Comment thread docs/index.md Outdated
Comment thread docs/.vitepress/theme/Layout.vue Outdated
Comment thread docs/.vitepress/theme/Layout.vue Outdated
@jdx jdx force-pushed the codex/landing-page-design branch 2 times, most recently from 24c8d79 to 65c9763 Compare April 20, 2026 04:09
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 20, 2026

Hyperfine Performance

mise x -- echo

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.4.18 x -- echo 21.1 ± 0.3 20.6 24.4 1.00
mise x -- echo 21.7 ± 0.4 21.1 25.6 1.03 ± 0.03

mise env

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.4.18 env 20.7 ± 0.5 20.1 25.8 1.00
mise env 21.1 ± 0.2 20.6 22.5 1.02 ± 0.03

mise hook-env

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.4.18 hook-env 21.3 ± 0.2 20.7 24.2 1.00
mise hook-env 21.8 ± 0.4 21.2 26.3 1.02 ± 0.02

mise ls

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.4.18 ls 19.0 ± 0.4 18.5 22.5 1.00
mise ls 19.6 ± 0.2 18.9 21.0 1.03 ± 0.02

xtasks/test/perf

Command mise-2026.4.18 mise Variance
install (cached) 141ms 153ms -7%
ls (cached) 74ms 77ms -3%
bin-paths (cached) 78ms 80ms -2%
task-ls (cached) 818ms 784ms +4%

@jdx jdx force-pushed the codex/landing-page-design branch 2 times, most recently from 183ad31 to f452b1b Compare April 20, 2026 04:16
Comment thread docs/.vitepress/theme/Layout.vue Outdated
flex-direction: column;
gap: 18px;
min-width: 0;
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Hero layout breaks at tablet viewport widths

Medium Severity

The new .hero-right rule at line 1123 doesn't override grid-column: 2 and grid-row: 1 / 3 from the old .hero-right rule at line 452. The new @media (max-width: 960px) breakpoint collapses .VPHero .main to a single column, but .hero-right is still forced into column 2 by the old base rule. The old @media (max-width: 768px) resets it to grid-column: 1, but between 768px and 960px the terminal and install section will overflow into an implicit second column.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit f452b1b. Configure here.

Comment thread docs/index.md
<p class="landing-kicker">The Menu</p>
<h2>Three dishes, one kitchen.</h2>
<a href="/getting-started.html" class="landing-small-button">All docs</a>
</div>
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Section heading kicker appears beside heading instead of above

Medium Severity

The .landing-section-heading is display: flex with justify-content: space-between, causing its three children — p.landing-kicker, h2, and a.landing-small-button — to appear in a single horizontal row. Every other section on the page places the kicker above the heading in a block-flow container. Without a wrapper div around the kicker and heading, the small "The Menu" label sits beside the heading rather than above it, breaking the page's visual pattern.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit f452b1b. Configure here.

@jdx jdx force-pushed the codex/landing-page-design branch 3 times, most recently from ae7cd57 to 818c9d2 Compare April 20, 2026 04:27
@jdx jdx force-pushed the codex/landing-page-design branch from 818c9d2 to cda8d16 Compare April 20, 2026 04:27
@jdx jdx merged commit 090dcfc into main Apr 20, 2026
22 of 23 checks passed
@jdx jdx deleted the codex/landing-page-design branch April 20, 2026 04:28
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.

There are 3 total unresolved issues (including 2 from previous reviews).

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 cda8d16. Configure here.

grid-template-columns: minmax(0, 0.95fr) minmax(360px, 1.05fr);
gap: 56px;
align-items: center;
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Duplicated CSS rules with conflicting values

Medium Severity

The new "Claude Design handoff" CSS block re-declares several selectors already defined earlier in the same file with different values, creating dead code and maintenance confusion. .VPHero .main is defined at line 415 (1fr 1fr, gap: 0 60px) and again at line 1017 (minmax(...), gap: 56px). .VPHero .container is defined at line 410 (max-width: 1040px) and line 1013 (1120px). .VPHero .name/.actions hiding is declared at lines 423–429 and again at lines 1002–1006. The earlier rules are silently overridden by cascade, making the effective values non-obvious and the stale rules a source of bugs (as with the .hero-right grid placement issue).

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit cda8d16. Configure here.

jdx pushed a commit that referenced this pull request Apr 22, 2026
### 🚀 Features

- **(backend)** support aqua vars templates by @risu729 in
[#9110](#9110)
- add gsudo (Sudo for Windows) to registry by @matracey in
[#9281](#9281)

### 🐛 Bug Fixes

- **(cli)** retrieve token from github helper for `self-update` command
by @sushichan044 in [#9259](#9259)
- **(github)** scope auth headers to API URLs by @risu729 in
[#9271](#9271)
- **(vfox)** use github token for lua http requests by @jdx in
[#9257](#9257)

### 📚 Documentation

- add aube hero banner by @jdx in
[#9265](#9265)
- add en.dev footer by @jdx in
[#9267](#9267)
- implement landing page design by @jdx in
[#9266](#9266)

### 📦️ Dependency Updates

- lock file maintenance by @renovate[bot] in
[#9268](#9268)

### 📦 Registry

- add llama.cpp
([github:ggml-org/llama.cpp](https://github.com/ggml-org/llama.cpp)) by
@igor-makarov in [#9282](#9282)
- add kiro-cli by @shalk in
[#9274](#9274)
- add flux-operator & flux-operator-mcp by @monotek in
[#8852](#8852)

### Chore

- **(release)** add en.dev sponsor blurb to release notes by @jdx in
[#9272](#9272)
- bump communique to 1.0.1 by @jdx in
[#9264](#9264)

### New Contributors

- @monotek made their first contribution in
[#8852](#8852)
- @igor-makarov made their first contribution in
[#9282](#9282)

## 📦 Aqua Registry Updates

#### New Packages (2)

-
[`controlplaneio-fluxcd/flux-operator/flux-operator-mcp`](https://github.com/controlplaneio-fluxcd/flux-operator/flux-operator-mcp)
- [`endevco/aube`](https://github.com/endevco/aube)

#### Updated Packages (1)

- [`graelo/pumas`](https://github.com/graelo/pumas)
richardthe3rd added a commit to richardthe3rd/mise that referenced this pull request Apr 24, 2026
* fix(progress): disable animated clx output in ci (jdx#9249)

## Summary

- Compute the clx progress UI decision once from settings, stderr,
force-progress, and CI state.
- Keep text output as the default in CI even when stderr looks
interactive because a CI runner allocated a PTY.
- Store the resulting `use_progress_ui` decision on
`MultiProgressReport` so later call sites reuse the same mode decision.

## Why

Some CI systems expose stderr as a TTY so tools keep colors enabled, but
their log capture strips cursor-control sequences. Animated progress
frames can then become thousands of near-duplicate log rows. This keeps
local interactive progress intact while making CI output quieter.

## Validation

- `cargo fmt --check`
- `cargo check -p mise`
- pre-commit hook suite during commit, including `cargo check
--all-features`, `cargo fmt --all -- --check`, `taplo`, `actionlint`,
`markdownlint`, and schema validation

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Low risk: changes only adjust progress UI enablement logic to prefer
plain text in CI, with minimal behavioral impact outside CI unless CI
detection is incorrect.
> 
> **Overview**
> Disables clx’s animated progress UI when `settings.ci` is true, even
if stderr appears interactive, to avoid CI logs being flooded by spinner
frames.
> 
> Refactors `MultiProgressReport` to compute and store a single
`use_progress_ui` flag during initialization (including logging `ci`)
and uses that flag when selecting `ProgressReport` vs text-based reports
and when creating the header job.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
13548a6. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

* fix(lockfile): use unique temp file for atomic save to avoid concurrent rename race (jdx#9250)

## Problem

`Lockfile::save` writes to a fixed `mise.lock.tmp` path, then renames it
over the real lockfile. When two mise processes update the same lockfile
concurrently, the second rename finds no source file and fails with `No
such file or directory (os error 2)`, surfaced as `failed to update
lockfiles`.

This reproduces reliably via [`hk`](https://github.com/jdx/hk): its
linter runner spawns multiple linters in parallel. If more than one
linter's bin is missing, each invocation triggers `install_missing_bin`
→ `rebuild_shims_and_runtime_symlinks` → `update_lockfiles` → `save`.
Two mise processes then race on the same `mise.lock.tmp`:

1. Both write `mise.lock.tmp` (second clobbers first — harmless,
contents are the same).
2. Process A renames `mise.lock.tmp` → `mise.lock`.
3. Process B renames `mise.lock.tmp` → `mise.lock` → **ENOENT** (source
already moved).

Caught in the wild during parallel `cargo-machete` + `cargo-msrv`
auto-install in CI:

```
cargo-machete – mise [email protected] ✓ installed
cargo-machete – mise ERROR failed to update lockfiles
cargo-machete – mise ERROR No such file or directory (os error 2)
cargo-machete – mise ERROR cargo-binstall failed
cargo-machete – mise ERROR Failed to install cargo:[email protected]: cargo-binstall exited with non-zero status: exit code 1
```

The fixed-path temp pattern was introduced in jdx#8589 (`fix(lockfile):
Resolve symlink when updating lockfiles`).

## Fix

Switch to `tempfile::NamedTempFile::with_prefix_in(parent)` +
`persist(target)`, matching the pattern already used in `src/http.rs`.
Each save gets a random temp name, so concurrent writers never collide
on the temp path. Persist remains atomic and same-filesystem.

Precedent in the codebase: `src/backend/conda.rs` already uses
`dest.with_extension(format!("tmp.{}", std::process::id()))` for the
same reason. `src/backend/s3.rs` still has a similar fixed-`.tmp`
pattern — worth a follow-up but out of scope here.

## Test

Added `test_concurrent_save_no_enoent` which spawns 8 threads × 20 saves
against the same lockfile and asserts none of them return ENOENT. The
test fails on `main` and passes with the fix.

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

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Changes the lockfile persistence path and retry behavior during atomic
writes, which could affect correctness/permissions of `mise.lock`
updates across platforms. Scope is localized to `Lockfile::save` and is
covered by new concurrency and permission regression tests.
> 
> **Overview**
> Prevents concurrent `Lockfile::save` calls from failing with `ENOENT`
by replacing the fixed `mise.lock.tmp` rename flow with a uniquely named
`tempfile::NamedTempFile` written alongside the target and atomically
`persist`ed.
> 
> Adds helpers to *preserve existing file permissions* on Unix and to
*retry persist on Windows* for transient `PermissionDenied`, plus
regression tests for concurrent saves and Unix permission preservation.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
49120aa. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>

* feat(latest): add --before flag to mise latest (jdx#9168)

## Summary

Adds `--before <BEFORE>` to `mise latest` so one-off latest-version
lookups can be constrained by release date.

- Parses `--before` with the existing duration/date parser, supporting
absolute dates such as `2024-06-01` and relative durations such as `90d`
or `1y`.
- Passes the parsed CLI cutoff into the current
`Backend::latest_version(config, query, before_date)` API, keeping
fallback precedence centralized in the backend: CLI flag > backend/tool
options > config tool options > global `install_before`.
- Conflicts `--before` with `--installed`, because installed-version
lookup does not use release metadata.
- Regenerates CLI usage docs, manpage output, and Fig completion
metadata.
- Extends the npm `install_before` e2e coverage for CLI filtering, CLI
override of global `MISE_INSTALL_BEFORE`, CLI override of per-tool
`install_before`, and relative duration parsing.
- Removes the stale e2e prerequisite that required `npm` on the runner
`PATH` before `mise use node`; the test now exercises the same mise
dependency environment the npm backend uses.

## Test plan

- [x] `cargo fmt --check`
- [x] `git diff --check`
- [x] `cargo test --bin mise latest_version_tests`
- [x] `mise run render:usage`
- [x] `mise run test:e2e e2e/backend/test_npm_install_before`
- [x] `mise run lint-fix`

* fix(use): honor --quiet and --silent flags (jdx#9251)

## Summary
- `mise use` was printing `mise <path> tools: ...` via `miseprintln!`
(unconditional stdout), so `--quiet` and `--silent` had no effect on it.
- Switch the "tools:", "removed:", and "would update" messages to
`info!` so they route through the logger and get suppressed when those
flags raise the log level to `error`.

Fixes jdx#9152

## Test plan
- [x] `mise use [email protected]` — still prints `mise <path> tools:
[email protected]`
- [x] `mise use -q [email protected]` — silent
- [x] `mise use --silent [email protected]` — silent
- [x] `mise use -n [email protected]` — still prints `would update ...`
- [x] `mise use -qn [email protected]` — silent
- [x] `mise use --remove tiny` — still prints `removed: ...`
- [x] `mise use -q --remove tiny` — silent

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

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Low risk: only gates `mise use` success/dry-run status messages behind
the existing `Settings::quiet` flag, without changing install/remove
behavior or config writes.
> 
> **Overview**
> `mise use` now respects the global `--quiet` setting by suppressing
its post-action status output (the “would update…”, “tools: …”, and
“removed: …” messages) when quiet mode is enabled.
> 
> Behavior for installs/removals, dry-run exit codes, and config saving
is unchanged; only user-facing messaging is conditionally skipped.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
9a8fcc0. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>

* fix(vfox): opt backend plugins out of --locked URL check (jdx#9252)

## Summary

- Custom Lua backend plugins (those using `BackendInstall` instead of a
`PreInstall` hook) have no way to surface a download URL to mise. As a
result, `mise lock` writes a version-only entry and `mise install
--locked` then fails with `No lockfile URL found`.
- Override `supports_lockfile_url` on `VfoxBackend` to return `false`
when the plugin is a backend plugin. Same semantics as asdf / cargo /
npm / pipx: when the backend can't provide a URL, the pinned version is
the lock.

Reported by @bishopmatthew in
[jdx#7308](jdx#7308 (comment)).

## Test plan

- [ ] Added `--locked --dry-run` assertion with a version-only lockfile
entry to `e2e/backend/test_vfox_backend_npm`.
- [ ] `mise run lint-fix` passes.

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

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Low risk: narrows the `--locked` URL validation for vfox *backend*
plugins only, plus adds an e2e regression test. Main risk is allowing
locked installs to proceed without per-platform URLs for these plugins,
matching their current lockfile capabilities.
> 
> **Overview**
> Fixes `mise install --locked` for vfox custom backend plugins by
making `VfoxBackend::supports_lockfile_url()` return `false` when the
plugin is a backend plugin, so version-only lockfile entries no longer
fail with "No lockfile URL found".
> 
> Adds an e2e assertion in `test_vfox_backend_npm` that `--locked
--dry-run` succeeds with a version-only `mise.lock` entry for
`vfox-npm:prettier`.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
63ba299. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>

* feat(spm): add filter_bins option to restrict built executables (jdx#9253)

## Summary

- Adds a `filter_bins` tool option to the `spm` backend so users can
restrict which executable products are built and linked
- Filters before `swift build` runs, so unwanted products are never
compiled (not just hidden from `PATH`)
- Accepts either a TOML array (`filter_bins = ["swiftly"]`) or a
comma-separated string (`filter_bins = "swiftly"`) — the naming matches
the existing `filter_bins` option on the github backend
- Returns a clear error if any listed name does not match an executable
product in the package

Closes jdx#9148

The motivating example is
[`swiftlang/swiftly`](https://github.com/swiftlang/swiftly), which ships
both `swiftly` and `test-swiftly` products. Without this option, mise
builds and links both.

```toml
[tools]
"spm:swiftlang/swiftly" = { version = "latest", filter_bins = ["swiftly"] }
```

When unset, the existing behavior (build and link every executable
product) is preserved.

## Test plan

- [x] Added unit tests for `parse_filter_bins` (string, array, empty,
whitespace-only) and `filter_executables` (passthrough,
restrict+preserve-order, error on missing name)
- [x] `cargo test backend::spm` — all 8 tests pass
- [x] `mise run test:unit` — all 712 unit tests pass
- [x] `mise run lint-fix` — clean
- [ ] Manual verification with an actual Swift package that has multiple
executable products

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

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Changes SPM install behavior to optionally filter and error on unknown
executable names, which could impact tool installation when configured.
Default behavior is preserved when `filter_bins` is unset.
> 
> **Overview**
> Adds a new SPM tool option, `filter_bins`, to restrict which Swift
executable products are built and symlinked into `bin/` during
installation.
> 
> The backend now parses `filter_bins` from either a TOML array or
comma-separated string, validates the requested executables exist,
preserves the package-declared order when filtering, and fails fast with
a clear error on unknown names. Documentation and unit tests were added
to cover parsing, passthrough, ordering, and error cases.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
fa0a09a. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>

* fix(github): route artifact attestation verification to custom api_url (jdx#9254)

## Summary

- When a github backend tool is configured with a custom `api_url` (e.g.
a GitHub Enterprise Server instance like
`https://github.enterprise.com/api/v3`), artifact downloads correctly
hit the GHES API, but attestation verification was still dispatched to
`api.github.com` — causing `401 Unauthorized` because the GHES token
isn't valid there.
- Bumps `sigstore-verification` to 0.2.6 (which adds
[`verify_github_attestation_with_base_url`](jdx/sigstore-verification#45)
and `GitHubSource::with_base_url`) and switches all three call sites in
`src/backend/github.rs` to the new variants so the attestations API is
queried against the same host that served the release.

## Motivation

Reported in jdx#9176 — user
configured `api_url = \"https://github.enterprise.com/api/v3\"` and
`MISE_GITHUB_ENTERPRISE_TOKEN`, saw the download succeed, then the
`[2/3] verify GitHub artifact attestations` step failed against
`api.github.com` with a dotcom-only 401.

## Test plan

- [x] `cargo build` clean.
- [x] `mise run test:unit` — 708 passed.
- [x] `mise run lint` clean.
- [ ] Manual verification against a GHES instance with artifact
attestations (no instance available in CI).

Closes jdx#9176

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Changes the GitHub attestation verification path and underlying
`sigstore-verification` dependency, which affects supply-chain
verification behavior and could cause new verification failures if the
base URL is misconfigured.
> 
> **Overview**
> Ensures GitHub artifact attestation detection/verification uses the
configured `api_url` (e.g., GitHub Enterprise) instead of implicitly
querying `api.github.com`, by switching to `GitHubSource::with_base_url`
and `verify_github_attestation_with_base_url` at all GitHub backend call
sites.
> 
> Bumps `sigstore-verification` from `0.2.5` to `0.2.6` to pick up the
new base-URL-aware APIs.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
09ff8c3. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

* registry: add aqua backend for bitwarden-secrets-manager (jdx#9255)

# Summary
This PR adds/updates the _bitwarden-secrets-manager_ shorthand to point
to the _aqua:bitwarden/sdk-sm_ backend.

## Context
Currently, mise registry points bitwarden-secrets-manager to a legacy
asdf plugin. However, the bitwarden/sdk-sm repository now has a
verified, stable aqua definition that provides the bws (Bitwarden
Secrets) CLI across all major platforms (Darwin/Linux/Windows).

### Changes
- Added `full = "aqua:bitwarden/sdk-sm"` to
`registry/bitwarden-secrets-manager.toml`.
- Verified that the bws binary is correctly mapped and executable via
the aqua backend.

### Verification
I have tested this locally using:
1. `aqua exec -- argd test bitwarden/sdk-sm` (Success)
2. `mise use aqua:bitwarden/sdk-sm` (Success)
3. `./target/debug/mise registry | grep bitwarden-secrets-manager`
(Success)
4. `./target/debug/mise install bitwarden-secrets-manager@latest`
(Success)
5. `./target/debug/mise exec bitwarden-secrets-manager -- bws --version`
(Success)

### Impact
This move aligns with mise’s preference for the aqua backend over asdf
plugins for better security (checksum/SLSA verification) and a faster
installation experience.

* feat(vfox): support plugin-declared dependencies via metadata.lua (jdx#9051)

## Summary

Allow vfox/Lua plugins to declare tool dependencies directly in
`metadata.lua` via a new `depends` field:

```lua
PLUGIN.depends = {"node", "python"}
```

This surfaces dependencies through the `Backend` trait's
`get_dependencies()` method so mise resolves installation order
automatically — removing the need for users to manually add `depends =
[...]` on every tool entry in their config.

### Motivation

Currently, users of vfox backend plugins must repeat dependency
declarations in their `mise.toml` for every tool that needs another tool
installed first. For example, a plugin ecosystem where 10+ tools all
depend on `node` requires `depends = ["node"]` on each entry. With this
change, the plugin author declares it once and all users benefit.

Closes jdx#8774

### Changes

- **`crates/vfox/src/metadata.rs`**: Added `depends: Vec<String>` field
to `Metadata` struct, parsed from the Lua table (defaults to empty when
omitted — fully backward compatible)
- **`src/backend/vfox.rs`**: `VfoxBackend` now overrides
`get_dependencies()` to read from plugin metadata. Dependencies are
cached via `OnceLock` and loaded synchronously from the plugin
directory. Gracefully returns empty deps if the plugin isn't installed
yet.
- Updated snapshot for the new field in `Metadata`'s `Debug` output

### Plugin author usage

```lua
-- metadata.lua
PLUGIN = {}
PLUGIN.name = "my-tool"
PLUGIN.version = "1.0.0"
PLUGIN.depends = {"node", "python"}
```

User-specified `depends` in `mise.toml` still works and is additive —
this just provides a plugin-level default.

## Test plan

- [x] Unit tests for metadata parsing with and without `depends` field
- [x] Existing vfox test suite passes (66 tests)
- [x] `cargo check` passes for the full workspace
- [x] `cargo clippy -p vfox` clean
- [ ] CI validation

---------

Co-authored-by: Arthur Hemon <[email protected]>
Co-authored-by: Claude Opus 4.6 <[email protected]>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: jdx <[email protected]>

* feat: rename `mise prepare` to `mise deps` and add package management (jdx#9056)

## Summary

- Renames the experimental `mise prepare` command to `mise deps`,
positioning it as a proper dependency management command
- Adds `mise deps add npm:react` and `mise deps remove npm:lodash`
subcommands for managing individual packages
- Implements add/remove for all 4 JS package managers (npm, yarn, pnpm,
bun)
- `mise deps` (bare) defaults to `mise deps install` which is the
previous `mise prepare` behavior
- Renames all config (`[prepare]` -> `[deps]`), settings
(`show_prepare_stale` -> `show_deps_stale`), flags (`--no-prepare` ->
`--no-deps`), and state files (`prepare-state.toml` ->
`deps-state.toml`)
- No backwards compatibility needed since prepare was experimental

## Test plan

- [ ] `cargo build` compiles cleanly
- [ ] `mise run lint` passes
- [ ] `mise deps --help` shows subcommands (add, install, remove)
- [ ] `mise dep --help` alias works
- [ ] `mise deps add npm:react` installs react via npm
- [ ] `mise deps add -D npm:vitest` installs as devDependency
- [ ] `mise deps remove npm:lodash` uninstalls via npm
- [ ] `mise deps` (bare) runs all configured providers
- [ ] `mise deps install --dry-run` shows what would run
- [ ] `mise run --no-deps` skips auto deps
- [ ] e2e tests: `mise run test:e2e test_deps test_deps_depends
test_deps_tool_install`

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

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Medium risk because this renames an end-to-end command/config surface
(`prepare`→`deps`) and threads the new flag/state/schema through
exec/run flows, which can break existing experimental users and monorepo
provider discovery. Behavior is largely a rename plus new JS package
add/remove execution, but touches multiple CLI entrypoints and config
parsing.
> 
> **Overview**
> **Renames the experimental dependency workflow from `mise prepare` to
`mise deps`.** This updates CLI wiring, help/manpages, usage spec,
interactive config editor UI, and all documentation references,
including the skip flag rename from `--no-prepare` to `--no-deps` in
`mise exec`/`mise run`.
> 
> **Promotes deps into a first-class config surface.**
Config/schema/settings are renamed from `[prepare]` to `[deps]`,
`status.show_prepare_stale` to `status.show_deps_stale`, and the
persisted freshness state file from `.mise/prepare-state.toml` to
`.mise/deps-state.toml`, with corresponding engine/provider renames.
> 
> **Adds package management subcommands.** Introduces `mise deps add`
and `mise deps remove`, parsing `ecosystem:package` specs, installing
required tools first, and executing provider-specific commands
(implemented for `npm`, `yarn`, `pnpm`, `bun`), while bare `mise deps`
defaults to `deps install`. E2E tests are updated/added to cover
listing/dry-run/explain, dependency ordering, tool-install-before-deps,
and aliasing (`dep` and hidden `prepare`).
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
9cb375e. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>

* feat(npm): add aube package manager support (jdx#9256)

## Summary

- Add `npm.package_manager = "auto"` as the default, with `auto`
preferring installed `aube` and falling back to `npm`.
- Add explicit `npm.package_manager = "aube"` support for npm backend
installs using `aube add --global` into mise-managed install/bin
directories.
- Make auto-selection consider the active install/exec toolset, so `mise
x node aube npm:<pkg>` uses the requested `aube` instead of falling back
to npm.
- Resolve Windows bin paths from the created install layout, so
aube-installed packages keep using `install_path/bin` even when aube is
not discoverable later.
- Normalize `.npmrc` path values to forward slashes and unit-test aube's
minute-based `minimumReleaseAge` conversion.
- Regenerate the settings schema and document the new npm backend
behavior.
- Add an e2e test that starts with `mise x node aube npm:cowsay`,
verifies aube-specific install artifacts (`global-aube` and
`aube-lock.yaml`), and executes `cowsay`.

## Validation

- `cargo test -q backend::npm::tests`
- `mise run test:e2e e2e/backend/test_npm_aube`
- `cargo check -q --all-features`
- `mise run render:schema`
- `mise run lint-fix`

*This PR was generated by an AI coding assistant.*

* chore: release 2026.4.18 (jdx#9246)

### 🚀 Features

- **(latest)** add --before flag to mise latest by @risu729 in
[jdx#9168](jdx#9168)
- **(npm)** add aube package manager support by @jdx in
[jdx#9256](jdx#9256)
- **(spm)** add filter_bins option to restrict built executables by @jdx
in [jdx#9253](jdx#9253)
- **(vfox)** support plugin-declared dependencies via metadata.lua by
@ahemon in [jdx#9051](jdx#9051)
- rename `mise prepare` to `mise deps` and add package management by
@jdx in [jdx#9056](jdx#9056)

### 🐛 Bug Fixes

- **(backend)** skip versions host for direct-source backends by @jdx in
[jdx#9245](jdx#9245)
- **(github)** route artifact attestation verification to custom api_url
by @jdx in [jdx#9254](jdx#9254)
- **(lockfile)** use unique temp file for atomic save to avoid
concurrent rename race by @jdx in
[jdx#9250](jdx#9250)
- **(log)** drop noisy third-party debug/trace logs by @jdx in
[jdx#9248](jdx#9248)
- **(progress)** disable animated clx output in ci by @jdx in
[jdx#9249](jdx#9249)
- **(use)** honor --quiet and --silent flags by @jdx in
[jdx#9251](jdx#9251)
- **(vfox)** opt backend plugins out of --locked URL check by @jdx in
[jdx#9252](jdx#9252)

### 📦 Registry

- add aqua backend for bitwarden-secrets-manager by @msuzoagu in
[jdx#9255](jdx#9255)

### New Contributors

- @ahemon made their first contribution in
[jdx#9051](jdx#9051)
- @msuzoagu made their first contribution in
[jdx#9255](jdx#9255)

* fix(vfox): use github token for lua http requests (jdx#9257)

## Summary
- pass mise's resolved GitHub token into vfox plugin runtimes
- add default GitHub auth headers in the vfox Lua HTTP bridge for GitHub
API requests
- preserve explicit plugin-provided Authorization headers and avoid auth
on GitHub release asset hosts

## Root Cause
Embedded vfox plugins such as `vfox-neovim` call `api.github.com`
through the Lua HTTP module. Those requests did not receive mise's
configured GitHub token, so rate-limited users could hit `HTTP 403`
while installing Neovim even when mise itself knew how to resolve a
GitHub token.

## Validation
- `cargo fmt --check`
- `cargo test -p vfox lua_mod::http`
- `cargo check -p mise`
- `MISE_LOG_HTTP=1 cargo run -q -p mise -- ls-remote neovim | sed -n
'1,20p'`

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Touches outbound HTTP behavior by automatically adding `Authorization`
headers for certain GitHub hosts, which could affect plugin networking
and token exposure if host matching is wrong. Scope is limited and
includes tests plus explicit opt-out when plugins already set
`Authorization` and for GitHub release asset hosts.
> 
> **Overview**
> Ensures embedded vfox plugins can authenticate GitHub API calls by
threading mise’s resolved GitHub token into the vfox Lua runtime and
having the Lua `http` bridge auto-attach GitHub auth headers.
> 
> The Lua HTTP module now conditionally adds `Authorization: Bearer …`
(and `x-github-api-version` for `api.github.com`) when a token is
available, while **preserving explicit plugin-provided `Authorization`**
and **skipping GitHub release asset hosts**; behavior is covered by new
unit tests.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
f4d9320. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

* fix(cli): retrieve token from github helper for `self-update` command (jdx#9259)

The `mise self-update` command now retrieves the GitHub API token via an
internal helper rather than directly from environment variables.
This ensures the token is fetched from the supported sources listed at
https://mise.jdx.dev/dev-tools/github-tokens.html.

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>

* chore: bump communique to 1.0.1 (jdx#9264)

## Summary
- Bump communique from 0.1.9 to 1.0.1

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

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Low risk: this only updates the pinned `communique` devtool
binary/version and its platform checksums/URLs in `mise.lock`, with no
application/runtime code changes.
> 
> **Overview**
> Bumps the pinned `communique` tool in `mise.lock` from `0.1.9` to
`1.0.1`, updating the associated per-platform download URLs, asset IDs,
and checksums so `mise` installs the new release.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
3ff3610. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>

* docs: add aube hero banner (jdx#9265)

## Summary

Adds a compact homepage hero banner that promotes aube as a new en.dev
tool by @jdx. The banner links to https://aube.en.dev/ and notes that
aube is currently in beta.

## Validation

- `mise run docs:build`
- commit hook suite via `hk`

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Low risk since changes are limited to docs theme markup/CSS and add no
backend or data-handling logic.
> 
> **Overview**
> Adds a new homepage hero banner in `docs/.vitepress/theme/Layout.vue`
promoting `aube` (linking to `https://aube.en.dev/`) with kicker/message
text.
> 
> Includes new styling for the banner (hover + dark-mode variants) and
small responsive tweaks to center the banner and adjust message font
size on mobile.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
e1eb309. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

* docs: add en.dev footer (jdx#9267)

## Summary

- Add a custom VitePress footer matching the aube.en.dev footer style.
- Keep the visible brand mention to a single `en.dev` by using `MIT
License · Copyright © YEAR · en.dev`.
- Disable the built-in VitePress footer so only the custom footer
renders.

## Validation

- `mise run docs:build`
- commit hook: `hk` lint suite

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Low risk: documentation theme-only changes that affect site
layout/styling but not runtime logic beyond the docs build.
> 
> **Overview**
> Replaces the built-in VitePress footer with a custom `EndevFooter`
component that renders `MIT License · Copyright © YEAR · en.dev` (with
logo/link) at the bottom of the docs layout.
> 
> Updates the docs theme layout to inject the new footer via
`#layout-bottom`, and adds accompanying CSS styles for the new footer
elements in `custom.css`.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
4678b11. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

* docs: implement landing page design (jdx#9266)

## Summary

- implement the exported landing-page design on the VitePress homepage
- replace the default home feature cards with the hero, metaphor,
feature menu, pantry ticker, comparison, quickstart, and CTA sections
- keep every pantry ticker item in the same serif font

## Validation

- npm run docs:build
- pre-commit hook via git commit, including prettier, cargo-fmt,
cargo-check, shellcheck, shfmt, pkl, taplo, lua-check, stylua,
actionlint, markdownlint, and schema

This PR was generated by an AI coding assistant.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Low risk since changes are limited to VitePress homepage
markup/styling plus a small clipboard-copy UX tweak; main risk is
visual/layout regressions across breakpoints or browsers.
> 
> **Overview**
> Replaces the VitePress homepage hero + default feature cards with a
new designed landing experience: updated hero copy/CTA, a terminal-style
workflow preview, and a new long-form homepage (`docs/index.md`) with
metaphor, feature menu, scrolling “pantry” ticker, aube promo, tabbed
quickstart recipe, and final CTA.
> 
> Updates theme styling to support the new layout (new `landing-*` and
terminal styles, revised hero grid/breakpoints, and smaller feature-card
rounding), and improves the install command copy interaction by
switching to a button with a `navigator.clipboard` path plus a textarea
fallback and clearer “copy/copied” state.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
818c9d2. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

* chore(deps): lock file maintenance (jdx#9268)

This PR contains the following updates:

| Update | Change |
|---|---|
| lockFileMaintenance | All locks refreshed |

🔧 This Pull Request updates lock files to use the latest dependency
versions.

---

### Configuration

📅 **Schedule**: (in timezone America/Chicago)

- Branch creation
  - "before 4am on monday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/jdx/mise).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMjMuOCIsInVwZGF0ZWRJblZlciI6IjQzLjEyMy44IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

---------

Co-authored-by: jdx <[email protected]>
Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
Co-authored-by: Taku Kodama <[email protected]>
Co-authored-by: MUA <[email protected]>
Co-authored-by: ahemon <[email protected]>
Co-authored-by: Arthur Hemon <[email protected]>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: mise-en-dev <[email protected]>
Co-authored-by: Kentaro Suzuki <[email protected]>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <[email protected]>
Co-authored-by: richardthe3rd <[email protected]>
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