diff --git a/.codespellignore b/.codespellignore
index 27853f2..2ed90d9 100644
--- a/.codespellignore
+++ b/.codespellignore
@@ -21,3 +21,4 @@ arent
helo
hda
fpr
+iterm
diff --git a/.lychee.toml b/.lychee.toml
index 42aa18d..6bce9f7 100644
--- a/.lychee.toml
+++ b/.lychee.toml
@@ -38,7 +38,7 @@ exclude = [
# Be patient with rate-limited domains.
exclude_link_local = true
exclude_loopback = true
-exclude_mail = true
+include_mail = false
exclude_path = [
"site/",
"target/",
diff --git a/.vale.ini b/.vale.ini
index ea0d179..0c49607 100644
--- a/.vale.ini
+++ b/.vale.ini
@@ -9,17 +9,10 @@ MinAlertLevel = suggestion
md = md
[*.md]
-BasedOnStyles = Vale, write-good
+BasedOnStyles = Vale
# Tone these down — they're noisy in technical docs.
Vale.Spelling = NO
-write-good.E-Prime = NO
-write-good.TooWordy = NO
-write-good.So = NO
-write-good.Weasel = warning
-write-good.Passive = NO
-write-good.Illusions = warning
-write-good.ThereIs = warning
# Skip auto-generated and template content.
[docs/cli-reference.md]
diff --git a/docs/release-quirks-jarvy.md b/docs/release-quirks-jarvy.md
index 7db8316..bcd4bdb 100644
--- a/docs/release-quirks-jarvy.md
+++ b/docs/release-quirks-jarvy.md
@@ -215,7 +215,7 @@ Consequences:
`VERSION_PLACEHOLDER` / `SHA256_PLACEHOLDER_*` strings from initial
setup on 2026-01-18.
3. `brew install jarvy` (or `brew install bearbinary/tap/jarvy`)
- currently fails — the formula is unparseable and references
+ currently fails — the formula is unparsable and references
non-existent URLs.
Until the pipeline is rebuilt, Homebrew is **not a viable distribution
diff --git a/docs/tools-registry.md b/docs/tools-registry.md
index 07f0bef..1fe69e3 100644
--- a/docs/tools-registry.md
+++ b/docs/tools-registry.md
@@ -1,6 +1,6 @@
---
title: "Tool registry (auto-generated) — Jarvy"
-description: "Every tool Jarvy knows how to install — 204 entries spanning runtimes, build tools, cloud SDKs, container tools, security scanners, and editors."
+description: "Every tool Jarvy knows how to install — 205 entries spanning runtimes, build tools, cloud SDKs, container tools, security scanners, and editors."
tags:
- reference
- tools
@@ -12,7 +12,7 @@ tags:
This page is generated from `jarvy tools --index` by `scripts/gen-docs.sh`.
Run that script after registering new tools.
-Jarvy currently ships **204 tools**. Reference one in your `jarvy.toml` by its **name**.
+Jarvy currently ships **205 tools**. Reference one in your `jarvy.toml` by its **name**.
| Name | Command | macOS | Linux | Windows | Default hook | Depends on |
|---|---|---|---|---|---|---|
@@ -204,6 +204,7 @@ Jarvy currently ships **204 tools**. Reference one in your `jarvy.toml` by its *
| `trufflehog` | `trufflehog` | `brew: trufflehog` | — | — | | — |
| `up` | `up` | `brew: upbound/tap/up` | — | — | | — |
| `usql` | `usql` | `brew: usql` | — | `choco: usql` | | — |
+| `uv` | `uv` | `brew: uv` | apk: `uv` | `winget: astral-sh.uv` | | — |
| `vagrant` | `vagrant` | `cask: vagrant` | apt: `vagrant`
dnf: `vagrant`
pacman: `vagrant`
apk: `vagrant` | `winget: Hashicorp.Vagrant`
`choco: vagrant` | | — |
| `vault` | `vault` | `brew: vault` | apt: `vault`
dnf: `vault`
pacman: `vault`
apk: `vault` | `winget: HashiCorp.Vault` | | — |
| `vfox` | `vfox` | `brew: vfox` | — | `winget: vfox` | | — |
diff --git a/src/tools/mod.rs b/src/tools/mod.rs
index 3b8db6e..ed4ebcc 100644
--- a/src/tools/mod.rs
+++ b/src/tools/mod.rs
@@ -193,6 +193,7 @@ pub mod trufflehog;
pub mod unsupported;
pub mod up;
pub mod usql;
+pub mod uv;
pub mod vagrant;
pub mod vault;
pub mod version;
diff --git a/src/tools/uv/definition.rs b/src/tools/uv/definition.rs
new file mode 100644
index 0000000..d9b17e4
--- /dev/null
+++ b/src/tools/uv/definition.rs
@@ -0,0 +1,27 @@
+//! uv - extremely fast Python package and project manager
+//!
+//! Astral's all-in-one Python toolchain: a drop-in replacement for `pip`,
+//! `pip-tools`, `pipx`, `poetry`, `pyenv`, and `virtualenv`.
+//!
+//! This tool uses the ToolSpec pattern for declarative installation.
+
+use crate::define_tool;
+
+define_tool!(UV, {
+ command: "uv",
+ macos: { brew: "uv" },
+ linux: { brew: "uv", apk: "uv" },
+ windows: { winget: "astral-sh.uv" },
+ bsd: { pkg: "uv" },
+});
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn ensure_uv_no_panic() {
+ let res = ensure("");
+ assert!(res.is_ok() || res.is_err());
+ }
+}
diff --git a/src/tools/uv/mod.rs b/src/tools/uv/mod.rs
new file mode 100644
index 0000000..8e84c12
--- /dev/null
+++ b/src/tools/uv/mod.rs
@@ -0,0 +1,3 @@
+mod definition;
+#[allow(unused_imports)]
+pub use definition::*;