From 844d2f5ed7665025368ce0882ae888a5ed118a69 Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Thu, 18 Sep 2025 21:05:40 +0000 Subject: [PATCH 01/18] feat(docs): customize VitePress theme with unique branding MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add custom theme styling to make the mise documentation more visually distinctive: - Create custom color palette with cyan/green/orange gradient branding - Add simplified terminal-based logo representing mise as a CLI tool - Implement hover animations for logo and navigation title - Enhance typography with Inter and JetBrains Mono fonts - Style code blocks with improved syntax highlighting - Reduce sidebar padding for more compact navigation - Add glass-morphism effects to navigation and sidebars - Create custom home page hero component with animated gradients - Improve dark/light mode contrast and readability 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- docs/.vitepress/config.ts | 28 ++ docs/.vitepress/theme/HomeHero.vue | 357 ++++++++++++++++++ docs/.vitepress/theme/MiseLogo.vue | 239 ++++++++++++ docs/.vitepress/theme/custom.css | 500 +++++++++++++++++++++++++ docs/.vitepress/theme/index.ts | 1 + docs/architecture.md | 3 +- docs/asdf-legacy-plugins.md | 10 +- docs/backend-plugin-development.md | 57 +-- docs/cli/lock.md | 12 +- docs/cli/mcp.md | 2 + docs/cli/plugins/ls-remote.md | 2 +- docs/cli/search.md | 2 +- docs/cli/settings.md | 1 + docs/cli/tasks/ls.md | 2 +- docs/cli/trust.md | 1 + docs/cli/unuse.md | 1 + docs/cli/use.md | 2 + docs/cli/watch.md | 72 ++-- docs/components/settings.vue | 3 +- docs/configuration.md | 2 +- docs/contributing.md | 16 +- docs/dev-tools/backend_architecture.md | 14 +- docs/dev-tools/backends/github.md | 4 +- docs/dev-tools/backends/gitlab.md | 4 +- docs/dev-tools/backends/http.md | 4 +- docs/dev-tools/index.md | 10 +- docs/dev-tools/mise-lock.md | 2 +- docs/dev-tools/tool-stubs.md | 3 + docs/environments/index.md | 2 +- docs/installing-mise.md | 1 + docs/mcp.md | 11 + docs/plugin-lua-modules.md | 74 ++-- docs/plugin-publishing.md | 11 +- docs/plugin-usage.md | 2 +- docs/public/logo.svg | 53 +++ docs/public/site.webmanifest | 20 +- docs/tasks/architecture.md | 8 +- docs/tool-plugin-development.md | 114 +++--- docs/troubleshooting.md | 1 + docs/url-replacements.md | 36 +- 40 files changed, 1472 insertions(+), 215 deletions(-) create mode 100644 docs/.vitepress/theme/HomeHero.vue create mode 100644 docs/.vitepress/theme/MiseLogo.vue create mode 100644 docs/.vitepress/theme/custom.css create mode 100644 docs/public/logo.svg diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index a9485fadad..4c5ba8f49a 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -21,6 +21,7 @@ export default withMermaid( }, themeConfig: { // https://vitepress.dev/reference/default-theme-config + logo: "/logo.svg", outline: "deep", nav: [ { text: "Dev Tools", link: "/dev-tools/" }, @@ -245,6 +246,33 @@ export default withMermaid( ], }, head: [ + // Favicon + ["link", { rel: "icon", href: "/logo.svg", type: "image/svg+xml" }], + ["link", { rel: "apple-touch-icon", href: "/logo.svg" }], + // Google Fonts + [ + "link", + { + rel: "preconnect", + href: "https://fonts.googleapis.com", + }, + ], + [ + "link", + { + rel: "preconnect", + href: "https://fonts.gstatic.com", + crossorigin: "", + }, + ], + [ + "link", + { + href: "https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;900&family=JetBrains+Mono:wght@400;500;600;700&display=swap", + rel: "stylesheet", + }, + ], + // Analytics [ "script", { diff --git a/docs/.vitepress/theme/HomeHero.vue b/docs/.vitepress/theme/HomeHero.vue new file mode 100644 index 0000000000..0e5fd55735 --- /dev/null +++ b/docs/.vitepress/theme/HomeHero.vue @@ -0,0 +1,357 @@ + + + diff --git a/docs/.vitepress/theme/MiseLogo.vue b/docs/.vitepress/theme/MiseLogo.vue new file mode 100644 index 0000000000..2eb8794d61 --- /dev/null +++ b/docs/.vitepress/theme/MiseLogo.vue @@ -0,0 +1,239 @@ + + + + + diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css new file mode 100644 index 0000000000..29129b6bd1 --- /dev/null +++ b/docs/.vitepress/theme/custom.css @@ -0,0 +1,500 @@ +/** + * Customize default theme styling by overriding CSS variables + * Color palette inspired by developer tools and modern CLI aesthetics + */ + +:root { + /* Brand Colors - Modern developer aesthetic */ + --vp-c-brand-1: #00d9ff; /* Bright cyan - primary brand */ + --vp-c-brand-2: #00b8d9; /* Darker cyan - hover states */ + --vp-c-brand-3: #0097a7; /* Even darker - active states */ + --vp-c-brand-soft: rgba(0, 217, 255, 0.14); + + /* Accent Colors - Terminal-inspired green */ + --vp-c-success-1: #52e892; + --vp-c-success-2: #3dd979; + --vp-c-success-3: #2bc760; + --vp-c-success-soft: rgba(82, 232, 146, 0.14); + + /* Warning Colors - Warm orange */ + --vp-c-warning-1: #ff9100; + --vp-c-warning-2: #e68200; + --vp-c-warning-3: #cc7300; + --vp-c-warning-soft: rgba(255, 145, 0, 0.14); + + /* Danger Colors - Vibrant red */ + --vp-c-danger-1: #ff5252; + --vp-c-danger-2: #f44336; + --vp-c-danger-3: #d32f2f; + --vp-c-danger-soft: rgba(255, 82, 82, 0.14); + + /* Typography - Modern monospace-first approach */ + --vp-font-family-base: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", + Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", + "Helvetica Neue", sans-serif; + --vp-font-family-mono: "JetBrains Mono", "Fira Code", "SF Mono", Monaco, + "Cascadia Code", "Roboto Mono", Consolas, "Courier New", monospace; + + /* Custom spacing for better readability */ + --vp-layout-max-width: 1440px; +} + +/* Dark mode specific customizations */ +.dark { + /* Enhanced dark mode colors */ + --vp-c-bg: #0a0a0b; + --vp-c-bg-soft: #121214; + --vp-c-bg-mute: #1a1a1d; + --vp-c-bg-alt: #161618; + + /* Better contrast for dark mode */ + --vp-c-divider: #2a2a2d; + --vp-c-divider-light: #363639; + + /* Text colors with better readability */ + --vp-c-text-1: #e7e7e8; + --vp-c-text-2: #c9c9ca; + --vp-c-text-3: #9e9e9f; + --vp-c-text-4: #71717a; + + /* Code block enhancements */ + --vp-code-block-bg: #161618; + --vp-code-block-divider-color: #2a2a2d; + --vp-code-copy-code-hover-bg: #2a2a2d; + + /* Inline code styling */ + --vp-c-code-bg: #1a1a1d; + --vp-c-code-color: #00d9ff; +} + +/* Light mode customizations */ +:root:not(.dark) { + --vp-c-bg: #ffffff; + --vp-c-bg-soft: #f9f9fb; + --vp-c-bg-mute: #f3f4f6; + + --vp-c-text-1: #213547; + --vp-c-text-2: #476573; + --vp-c-text-3: #6b7280; + + /* Light mode code styling */ + --vp-c-code-bg: #f3f4f6; + --vp-c-code-color: #0097a7; +} + +/* Navigation Bar Customization */ +.VPNav { + backdrop-filter: blur(12px); + background-color: var(--vp-c-bg-soft-up); + border-bottom: 1px solid var(--vp-c-divider); +} + +.VPNavBar { + transition: all 0.3s ease; +} + +.VPNavBar.has-sidebar .content { + backdrop-filter: blur(8px); +} + +/* Logo Enhancement */ +.VPNavBarTitle .VPImage.logo { + height: 48px !important; + width: 48px !important; + transition: all 0.3s ease; +} + +.VPNavBarTitle:hover .VPImage.logo { + transform: scale(1.1); + filter: drop-shadow(0 0 12px rgba(0, 217, 255, 0.6)); +} + +/* Site Title Enhancement */ +.VPNavBarTitle .title { + font-weight: 900; + font-size: 1.05rem; + background: linear-gradient(120deg, #00d9ff 0%, #52e892 50%, #ff9100 100%); + background-size: 200% 100%; + -webkit-background-clip: text; + background-clip: text; + -webkit-text-fill-color: transparent; + letter-spacing: -0.02em; + margin-left: 0.25rem; + transition: all 0.3s ease; +} + +/* Animate and glow on hover */ +.VPNavBarTitle:hover .title { + filter: drop-shadow(0 0 8px rgba(0, 217, 255, 0.5)); + animation: shimmer 2s ease-in-out infinite; +} + +@keyframes shimmer { + 0% { + background-position: 100% 0; + } + 100% { + background-position: -100% 0; + } +} + +/* Mobile adjustments */ +@media (max-width: 768px) { + .VPNavBarTitle .title::before { + display: none; + } +} + +/* Hero section enhancement */ +.VPHero { + padding-bottom: 56px !important; +} + +.VPHero .name { + background: linear-gradient(135deg, #00d9ff 0%, #52e892 50%, #ff9100 100%); + -webkit-background-clip: text; + background-clip: text; + -webkit-text-fill-color: transparent; + font-weight: 900; + letter-spacing: -0.02em; +} + +.VPHero .tagline { + font-size: 1.35rem !important; + opacity: 0.9; + font-weight: 500; +} + +/* Button customization */ +.VPButton { + font-weight: 600; + transition: all 0.25s ease; + border-radius: 8px; + text-transform: uppercase; + letter-spacing: 0.025em; + font-size: 0.875rem; +} + +.VPButton.medium { + padding: 0 24px; +} + +.VPButton:hover { + transform: translateY(-1px); + box-shadow: 0 4px 12px rgba(0, 217, 255, 0.15); +} + +/* Sidebar enhancements */ +.VPSidebar { + backdrop-filter: blur(8px); +} + +.VPSidebarItem { + margin: 0; +} + +.VPSidebarItem.level-0 > .item { + padding-top: 2px; + padding-bottom: 2px; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.025em; + font-size: 0.75rem; + color: var(--vp-c-text-3); +} + +.VPSidebarItem .link { + transition: all 0.2s ease; + border-radius: 4px; + padding: 2px 6px !important; + margin: 0; + font-size: 0.875rem; + line-height: 1.5; +} + +.VPSidebarItem .link:hover { + background-color: var(--vp-c-bg-mute); + color: var(--vp-c-brand-1); + padding-left: 10px !important; +} + +.VPSidebarItem .link.active { + background-color: var(--vp-c-brand-soft); + color: var(--vp-c-brand-1); + font-weight: 600; + border-left: 3px solid var(--vp-c-brand-1); +} + +/* Code blocks with better syntax highlighting */ +.vp-code-group { + border-radius: 12px; + overflow: hidden; + box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1); +} + +div[class*="language-"] { + border-radius: 8px; + border: 1px solid var(--vp-code-block-divider-color); + transition: + box-shadow 0.3s ease, + border-color 0.3s ease; +} + +div[class*="language-"]:hover { + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1); + /* Removed transform to prevent jumping */ +} + +div[class*="language-"] .lang { + color: var(--vp-c-brand-1); + font-weight: 600; + font-size: 0.75rem; + text-transform: uppercase; + letter-spacing: 0.025em; +} + +/* Copy code button enhancement */ +div[class*="language-"] .copy { + background-color: var(--vp-c-bg-soft); + border: 1px solid var(--vp-c-divider); + border-radius: 6px; + transition: all 0.2s ease; +} + +div[class*="language-"] .copy:hover { + background-color: var(--vp-c-brand-1); + border-color: var(--vp-c-brand-1); + color: white; +} + +/* Custom scrollbar */ +::-webkit-scrollbar { + width: 10px; + height: 10px; +} + +::-webkit-scrollbar-track { + background: var(--vp-c-bg-soft); +} + +::-webkit-scrollbar-thumb { + background: var(--vp-c-divider); + border-radius: 5px; + border: 2px solid var(--vp-c-bg-soft); +} + +::-webkit-scrollbar-thumb:hover { + background: var(--vp-c-text-3); +} + +/* Feature cards on home page */ +.VPFeature { + border: 1px solid var(--vp-c-divider); + border-radius: 12px; + transition: all 0.3s ease; + background: linear-gradient( + 135deg, + var(--vp-c-bg-soft) 0%, + var(--vp-c-bg) 100% + ); +} + +.VPFeature:hover { + border-color: var(--vp-c-brand-1); + transform: translateY(-4px); + box-shadow: 0 12px 24px rgba(0, 217, 255, 0.1); +} + +.VPFeature .icon { + font-size: 2rem; + margin-bottom: 1rem; + filter: drop-shadow(0 2px 4px rgba(0, 217, 255, 0.2)); +} + +/* Table styling */ +.vp-doc table { + border-collapse: collapse; + margin: 1.5rem 0; + border-radius: 8px; + overflow: hidden; + box-shadow: 0 0 0 1px var(--vp-c-divider); +} + +.vp-doc th { + background: var(--vp-c-bg-soft); + font-weight: 600; + text-transform: uppercase; + font-size: 0.8rem; + letter-spacing: 0.025em; + color: var(--vp-c-text-2); +} + +.vp-doc tr { + transition: background-color 0.2s ease; +} + +.vp-doc tbody tr:hover { + background-color: var(--vp-c-bg-soft); +} + +/* Links with underline animation */ +.vp-doc a { + position: relative; + color: var(--vp-c-brand-1); + text-decoration: none; + transition: color 0.2s ease; +} + +.vp-doc a:hover { + color: var(--vp-c-brand-2); +} + +.vp-doc a:not(.header-anchor):not(.VPButton)::after { + content: ""; + position: absolute; + width: 100%; + height: 2px; + bottom: -2px; + left: 0; + background-color: var(--vp-c-brand-1); + transform: scaleX(0); + transform-origin: bottom right; + transition: transform 0.25s ease-out; +} + +.vp-doc a:not(.header-anchor):not(.VPButton):hover::after { + transform: scaleX(1); + transform-origin: bottom left; +} + +/* Tip/Warning/Danger blocks customization */ +.custom-block { + border-radius: 8px; + border-width: 1px; + margin: 1.5rem 0; +} + +.custom-block.tip { + border-color: var(--vp-c-success-2); + background-color: var(--vp-c-success-soft); +} + +.custom-block.warning { + border-color: var(--vp-c-warning-2); + background-color: var(--vp-c-warning-soft); +} + +.custom-block.danger { + border-color: var(--vp-c-danger-2); + background-color: var(--vp-c-danger-soft); +} + +.custom-block-title { + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.025em; + font-size: 0.85rem; +} + +/* Search modal enhancement */ +.VPLocalSearchBox { + --vp-local-search-highlight-bg: var(--vp-c-brand-soft); + --vp-local-search-highlight-text: var(--vp-c-brand-1); +} + +.DocSearch { + --docsearch-primary-color: var(--vp-c-brand-1) !important; + --docsearch-highlight-color: var(--vp-c-brand-1) !important; +} + +/* Page transitions */ +.VPContent { + animation: fadeInUp 0.3s ease-out; +} + +@keyframes fadeInUp { + from { + opacity: 0; + transform: translateY(10px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +/* Terminal-style elements */ +.terminal { + background: #0a0a0b; + color: #52e892; + padding: 1rem; + border-radius: 8px; + font-family: var(--vp-font-family-mono); + position: relative; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); +} + +.terminal::before { + content: "● ● ●"; + position: absolute; + top: 0.75rem; + left: 1rem; + color: #ff5252; + font-size: 0.75rem; + letter-spacing: 0.25rem; +} + +/* Responsive improvements */ +@media (max-width: 768px) { + .VPHero .name { + font-size: 3rem !important; + } + + .VPHero .tagline { + font-size: 1.125rem !important; + } +} + +/* Loading animation for async content */ +@keyframes pulse { + 0%, + 100% { + opacity: 1; + } + 50% { + opacity: 0.5; + } +} + +.loading { + animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; +} + +/* Custom badge styles */ +.badge { + display: inline-block; + padding: 0.25rem 0.5rem; + font-size: 0.75rem; + font-weight: 600; + border-radius: 4px; + text-transform: uppercase; + letter-spacing: 0.025em; +} + +.badge-new { + background-color: var(--vp-c-success-soft); + color: var(--vp-c-success-1); + border: 1px solid var(--vp-c-success-2); +} + +.badge-beta { + background-color: var(--vp-c-warning-soft); + color: var(--vp-c-warning-1); + border: 1px solid var(--vp-c-warning-2); +} + +.badge-deprecated { + background-color: var(--vp-c-danger-soft); + color: var(--vp-c-danger-1); + border: 1px solid var(--vp-c-danger-2); +} diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts index 0258e4c7f4..c2a8c1b66d 100644 --- a/docs/.vitepress/theme/index.ts +++ b/docs/.vitepress/theme/index.ts @@ -2,6 +2,7 @@ import type { Theme } from "vitepress"; import DefaultTheme from "vitepress/theme"; import { enhanceAppWithTabs } from "vitepress-plugin-tabs/client"; import "virtual:group-icons.css"; +import "./custom.css"; export default { extends: DefaultTheme, diff --git a/docs/architecture.md b/docs/architecture.md index e1419cdb67..2c96f75737 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -1,6 +1,7 @@ --- outline: [1, 3] --- + # mise Architecture This document provides a comprehensive overview of mise's architecture, designed primarily for contributors and those interested in understanding how mise works internally. @@ -12,7 +13,7 @@ For practical development guidance, see the [Contributing Guide](contributing.md mise is a Rust-based tool with a modular architecture centered around three core concepts: 1. **Tool Version Management** - Installing and managing different versions of [development tools](dev-tools/) -2. **Environment Management** - Setting up [environment variables](environments/) and project contexts +2. **Environment Management** - Setting up [environment variables](environments/) and project contexts 3. **Task Running** - Executing [project tasks](tasks/) with dependency management These three pillars work together to provide a unified development environment management experience. diff --git a/docs/asdf-legacy-plugins.md b/docs/asdf-legacy-plugins.md index 2801a0152a..75055de81b 100644 --- a/docs/asdf-legacy-plugins.md +++ b/docs/asdf-legacy-plugins.md @@ -103,9 +103,9 @@ Lists all available versions of the tool: ```bash #!/usr/bin/env bash # List all available versions -curl -s https://api.github.com/repos/owner/repo/releases | - grep '"tag_name":' | - sed -E 's/.*"([^"]+)".*/\1/' | +curl -s https://api.github.com/repos/owner/repo/releases | + grep '"tag_name":' | + sed -E 's/.*"([^"]+)".*/\1/' | sort -V ``` @@ -174,8 +174,8 @@ Get the latest stable version: ```bash #!/usr/bin/env bash -curl -s https://api.github.com/repos/owner/repo/releases/latest | - grep '"tag_name":' | +curl -s https://api.github.com/repos/owner/repo/releases/latest | + grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/' ``` diff --git a/docs/backend-plugin-development.md b/docs/backend-plugin-development.md index 1b593c8a23..de31d63f2c 100644 --- a/docs/backend-plugin-development.md +++ b/docs/backend-plugin-development.md @@ -15,7 +15,7 @@ Backend plugins extend the standard vfox plugin system with enhanced backend met Backend plugins are generally a git repository but can also be a directory (via `mise link`). They use three main backend methods implemented as individual files: - `hooks/backend_list_versions.lua` - Lists available versions for a tool -- `hooks/backend_install.lua` - Installs a specific version of a tool +- `hooks/backend_install.lua` - Installs a specific version of a tool - `hooks/backend_exec_env.lua` - Sets up environment variables for a tool ## Backend Methods @@ -28,10 +28,10 @@ Lists available versions for a tool: function PLUGIN:BackendListVersions(ctx) local tool = ctx.tool local versions = {} - + -- Your logic to fetch versions for the tool -- Example: query an API, parse a registry, etc. - + return {versions = versions} end ``` @@ -45,10 +45,10 @@ function PLUGIN:BackendInstall(ctx) local tool = ctx.tool local version = ctx.version local install_path = ctx.install_path - + -- Your logic to install the tool -- Example: download files, extract archives, etc. - + return {} end ``` @@ -60,10 +60,10 @@ Sets up environment variables for a tool: ```lua function PLUGIN:BackendExecEnv(ctx) local install_path = ctx.install_path - + -- Your logic to set up environment variables -- Example: add bin directories to PATH - + return { env_vars = { {key = "PATH", value = install_path .. "/bin"} @@ -91,8 +91,9 @@ git init ``` The template includes: + - Complete backend plugin structure with all required hooks -- Modern development tooling (hk, stylua, luacheck, actionlint) +- Modern development tooling (hk, stylua, luacheck, actionlint) - Comprehensive documentation and examples - CI/CD setup with GitHub Actions - Multiple implementation patterns for different backend types @@ -131,7 +132,7 @@ Here's the complete implementation of the vfox-npm plugin that manages npm packa ```lua PLUGIN = { name = "vfox-npm", - version = "1.0.0", + version = "1.0.0", description = "Backend plugin for npm packages", author = "jdx" } @@ -146,7 +147,7 @@ function PLUGIN:BackendListVersions(ctx) local result = cmd.exec("npm view " .. ctx.tool .. " versions --json") local versions = json.decode(result) - + return {versions = versions} end ``` @@ -158,12 +159,12 @@ function PLUGIN:BackendInstall(ctx) local tool = ctx.tool local version = ctx.version local install_path = ctx.install_path - + -- Install the package directly using npm install local cmd = require("cmd") local npm_cmd = "npm install " .. tool .. "@" .. version .. " --no-package-lock --no-save --silent" local result = cmd.exec(npm_cmd, {cwd = install_path}) - + -- If we get here, the command succeeded return {} end @@ -211,16 +212,16 @@ Backend plugins receive context through the `ctx` parameter passed to each hook ### BackendListVersions Context -| Variable | Description | Example | -|----------|-------------|---------| +| Variable | Description | Example | +| ---------- | ------------- | ------------ | | `ctx.tool` | The tool name | `"prettier"` | ### BackendInstall and BackendExecEnv Context -| Variable | Description | Example | -|----------|-------------|---------| -| `ctx.tool` | The tool name | `"prettier"` | -| `ctx.version` | The requested version | `"3.0.0"` | +| Variable | Description | Example | +| ------------------ | ---------------------- | ----------------------------------------------------------------- | +| `ctx.tool` | The tool name | `"prettier"` | +| `ctx.version` | The requested version | `"3.0.0"` | | `ctx.install_path` | Installation directory | `"/home/user/.local/share/mise/installs/vfox-npm/prettier/3.0.0"` | ## Testing Your Plugin @@ -258,26 +259,26 @@ Provide more meaningful error messages: ```lua function PLUGIN:BackendListVersions(ctx) local tool = ctx.tool - + -- Validate tool name if not tool or tool == "" then error("Tool name cannot be empty") end - + -- Execute command with error checking local cmd = require("cmd") local result = cmd.exec("npm view " .. tool .. " versions --json 2>/dev/null") if not result or result:match("npm ERR!") then error("Failed to fetch versions for " .. tool .. ": " .. (result or "no output")) end - + -- Parse JSON response local json = require("json") local success, npm_versions = pcall(json.decode, result) if not success or not npm_versions then error("Failed to parse versions for " .. tool) end - + -- Return versions or error if none found local versions = {} if type(npm_versions) == "table" then @@ -285,11 +286,11 @@ function PLUGIN:BackendListVersions(ctx) table.insert(versions, npm_versions[i]) end end - + if #versions == 0 then error("No versions found for " .. tool) end - + return {versions = versions} end ``` @@ -340,10 +341,10 @@ function PLUGIN:BackendInstall(ctx) local tool = ctx.tool local version = ctx.version local install_path = ctx.install_path - + -- Create install directory os.execute("mkdir -p " .. install_path) - + if tool == "special-tool" then -- Special installation logic local cmd = require("cmd") @@ -361,7 +362,7 @@ function PLUGIN:BackendInstall(ctx) error("Failed to install " .. tool .. "@" .. version) end end - + return {} end ``` @@ -380,7 +381,7 @@ function PLUGIN:BackendInstall(ctx) elseif RUNTIME.osType == "Windows" then -- Windows installation logic end - + return {} end ``` diff --git a/docs/cli/lock.md b/docs/cli/lock.md index d6b85fb524..a2eb82e5b7 100644 --- a/docs/cli/lock.md +++ b/docs/cli/lock.md @@ -40,9 +40,9 @@ Number of jobs to run in parallel [default: 4] Examples: - - $ mise lock Update lockfile in current directory for all platforms - $ mise lock node python Update only node and python - $ mise lock --platform linux-x64 Update only linux-x64 platform - $ mise lock --dry-run Show what would be updated or created - $ mise lock --force Re-download and update even if data exists + +$ mise lock Update lockfile in current directory for all platforms +$ mise lock node python Update only node and python +$ mise lock --platform linux-x64 Update only linux-x64 platform +$ mise lock --dry-run Show what would be updated or created +$ mise lock --force Re-download and update even if data exists diff --git a/docs/cli/mcp.md b/docs/cli/mcp.md index 42ad71c9c0..0fe1471804 100644 --- a/docs/cli/mcp.md +++ b/docs/cli/mcp.md @@ -9,12 +9,14 @@ This command starts an MCP server that exposes mise functionality to AI assistants over stdin/stdout using JSON-RPC protocol. The MCP server provides access to: + - Installed and available tools - Task definitions and execution - Environment variables - Configuration information Resources available: + - mise://tools - List all tools (use ?include_inactive=true to include inactive tools) - mise://tasks - List all tasks with their configurations - mise://env - List all environment variables diff --git a/docs/cli/plugins/ls-remote.md b/docs/cli/plugins/ls-remote.md index 44bb27a18d..dbffbb0888 100644 --- a/docs/cli/plugins/ls-remote.md +++ b/docs/cli/plugins/ls-remote.md @@ -22,4 +22,4 @@ Show the git url for each plugin e.g.: `](/cli/settings/unset.md) Examples: + ``` # list all settings $ mise settings diff --git a/docs/cli/tasks/ls.md b/docs/cli/tasks/ls.md index 183ffdf099..f284e1640b 100644 --- a/docs/cli/tasks/ls.md +++ b/docs/cli/tasks/ls.md @@ -8,7 +8,7 @@ These may be included from the config file or from the project's .mise/tasks dir mise will merge all tasks from all parent directories into this list. So if you have global tasks in `~/.config/mise/tasks/*` and project-specific tasks in -~/myproject/.mise/tasks/*, then they'll both be available but the project-specific +~/myproject/.mise/tasks/\*, then they'll both be available but the project-specific tasks will override the global ones if they have the same name. ## Flags diff --git a/docs/cli/trust.md b/docs/cli/trust.md index f34b9095a6..5b86955881 100644 --- a/docs/cli/trust.md +++ b/docs/cli/trust.md @@ -9,6 +9,7 @@ This means mise will parse the file with potentially dangerous features enabled. This includes: + - environment variables - templates - `path:` plugin versions diff --git a/docs/cli/unuse.md b/docs/cli/unuse.md index 0ba405c4f0..2351a6376c 100644 --- a/docs/cli/unuse.md +++ b/docs/cli/unuse.md @@ -9,6 +9,7 @@ Removes installed tool versions from mise.toml By default, this will use the `mise.toml` file that has the tool defined. In the following order: + - If `--global` is set, it will use the global config file. - If `--path` is set, it will use the config file at the given path. - If `--env` is set, it will use `mise..toml`. diff --git a/docs/cli/use.md b/docs/cli/use.md index 4b2e2380c6..49ff3ed052 100644 --- a/docs/cli/use.md +++ b/docs/cli/use.md @@ -10,6 +10,7 @@ This will install the tool version if it is not already installed. By default, this will use a `mise.toml` file in the current directory. In the following order: + - If `--global` is set, it will use the global config file. - If `--path` is set, it will use the config file at the given path. - If `--env` is set, it will use `mise..toml`. @@ -88,6 +89,7 @@ Consider using mise.lock as a better alternative to pinning in mise.toml: Examples: + ``` # run with no arguments to use the interactive selector diff --git a/docs/cli/watch.md b/docs/cli/watch.md index 37c4ebf077..df7e805559 100644 --- a/docs/cli/watch.md +++ b/docs/cli/watch.md @@ -170,12 +170,12 @@ or user ignore files, like '~/.gitignore' or '~/.config/watchexec/ignore'. Supported project ignore files: - - Git: .gitignore at project root and child directories, .git/info/exclude, and the file pointed to by `core.excludesFile` in .git/config. - - Mercurial: .hgignore at project root and child directories. - - Bazaar: .bzrignore at project root. - - Darcs: _darcs/prefs/boring - - Fossil: .fossil-settings/ignore-glob - - Ripgrep/Watchexec/generic: .ignore at project root and child directories. +- Git: .gitignore at project root and child directories, .git/info/exclude, and the file pointed to by `core.excludesFile` in .git/config. +- Mercurial: .hgignore at project root and child directories. +- Bazaar: .bzrignore at project root. +- Darcs: \_darcs/prefs/boring +- Fossil: .fossil-settings/ignore-glob +- Ripgrep/Watchexec/generic: .ignore at project root and child directories. VCS ignore files (Git, Mercurial, Bazaar, Darcs, Fossil) are only used if the corresponding VCS is discovered to be in use for the project/origin. For example, a .bzrignore in a Git @@ -191,10 +191,10 @@ This disables loading of global or user ignore files, like '~/.gitignore', Supported global ignore files - - Git (if core.excludesFile is set): the file at that path - - Git (otherwise): the first found of $XDG_CONFIG_HOME/git/ignore, %APPDATA%/.gitignore, %USERPROFILE%/.gitignore, $HOME/.config/git/ignore, $HOME/.gitignore. - - Bazaar: the first found of %APPDATA%/Bazzar/2.0/ignore, $HOME/.bazaar/ignore. - - Watchexec: the first found of $XDG_CONFIG_HOME/watchexec/ignore, %APPDATA%/watchexec/ignore, %USERPROFILE%/.watchexec/ignore, $HOME/.watchexec/ignore. +- Git (if core.excludesFile is set): the file at that path +- Git (otherwise): the first found of $XDG_CONFIG_HOME/git/ignore, %APPDATA%/.gitignore, %USERPROFILE%/.gitignore, $HOME/.config/git/ignore, $HOME/.gitignore. +- Bazaar: the first found of %APPDATA%/Bazzar/2.0/ignore, $HOME/.bazaar/ignore. +- Watchexec: the first found of $XDG_CONFIG_HOME/watchexec/ignore, %APPDATA%/watchexec/ignore, %USERPROFILE%/.watchexec/ignore, $HOME/.watchexec/ignore. Like for project files, Git and Bazaar global files will only be used for the corresponding VCS as used in the project. @@ -318,33 +318,36 @@ set of events Watchexec handles. Here's an example of a folder being created on ```json { ``` + "tags": [ - { - "kind": "path", - "absolute": "/home/user/your/new-folder", - "filetype": "dir" - }, - { - "kind": "fs", - "simple": "create", - "full": "Create(Folder)" - }, - { - "kind": "source", - "source": "filesystem", - } +{ +"kind": "path", +"absolute": "/home/user/your/new-folder", +"filetype": "dir" +}, +{ +"kind": "fs", +"simple": "create", +"full": "Create(Folder)" +}, +{ +"kind": "source", +"source": "filesystem", +} ], "metadata": { - "notify-backend": "inotify" +"notify-backend": "inotify" } + ``` } ``` The fields are as follows: - - `tags`, structured event data. - - `tags[].kind`, which can be: +- `tags`, structured event data. +- `tags[].kind`, which can be: + ``` * 'path', along with: + `absolute`, an absolute path. @@ -364,7 +367,8 @@ The fields are as follows: + `disposition`, the exit disposition ('success', 'error', 'signal', 'stop', 'exception', 'continued'). + `code`, the exit, signal, stop, or exception code. ``` - - `metadata`, additional information about the event. + +- `metadata`, additional information about the event. The 'json-stdio' mode will emit JSON events to the standard input of the command, one per line, then close stdin. The 'json-file' mode will create a temporary file, write the @@ -377,12 +381,12 @@ with the paths of the affected files, for filesystem events: $WATCHEXEC_COMMON_PATH is set to the longest common path of all of the below variables, and so should be prepended to each path to obtain the full/real path. Then: - - $WATCHEXEC_CREATED_PATH is set when files/folders were created - - $WATCHEXEC_REMOVED_PATH is set when files/folders were removed - - $WATCHEXEC_RENAMED_PATH is set when files/folders were renamed - - $WATCHEXEC_WRITTEN_PATH is set when files/folders were modified - - $WATCHEXEC_META_CHANGED_PATH is set when files/folders' metadata were modified - - $WATCHEXEC_OTHERWISE_CHANGED_PATH is set for every other kind of pathed event +- $WATCHEXEC_CREATED_PATH is set when files/folders were created +- $WATCHEXEC_REMOVED_PATH is set when files/folders were removed +- $WATCHEXEC_RENAMED_PATH is set when files/folders were renamed +- $WATCHEXEC_WRITTEN_PATH is set when files/folders were modified +- $WATCHEXEC_META_CHANGED_PATH is set when files/folders' metadata were modified +- $WATCHEXEC_OTHERWISE_CHANGED_PATH is set for every other kind of pathed event Multiple paths are separated by the system path separator, ';' on Windows and ':' on unix. Within each variable, paths are deduplicated and sorted in binary order (i.e. neither diff --git a/docs/components/settings.vue b/docs/components/settings.vue index 6c5f116c26..72ce8faa1b 100644 --- a/docs/components/settings.vue +++ b/docs/components/settings.vue @@ -8,7 +8,8 @@ const settings = child : data; // Check if there are any settings to display -const hasSettings = settings.some((f) => f.type) || settings.some((f) => !f.type); +const hasSettings = + settings.some((f) => f.type) || settings.some((f) => !f.type); diff --git a/docs/configuration.md b/docs/configuration.md index 9947e8b04c..cb71041760 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -81,7 +81,7 @@ Different configuration sections merge in different ways: ```toml # Global: [tasks.test] = "npm test" -# Project: [tasks.test] = "yarn test" +# Project: [tasks.test] = "yarn test" # Result: "yarn test" (completely replaces global) ``` diff --git a/docs/contributing.md b/docs/contributing.md index 82a912fe15..0e7396a0cd 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -630,6 +630,7 @@ of the full backend specification. ### Quick Start 1. **Choose the right backend** for your tool: + - **[aqua](dev-tools/backends/aqua.md)** - Preferred for GitHub releases with security features - **[ubi](dev-tools/backends/ubi.md)** - Simple GitHub/GitLab releases following @@ -768,33 +769,34 @@ across different installation systems. ```rust use crate::backend::{Backend, BackendType}; use crate::install_context::InstallContext; - + #[derive(Debug)] pub struct MyBackend { // backend-specific fields } - + impl Backend for MyBackend { fn get_type(&self) -> BackendType { BackendType::MyBackend } - + async fn list_remote_versions(&self) -> Result> { // Implementation for listing available versions } - - async fn install_version(&self, ctx: &InstallContext, + + async fn install_version(&self, ctx: &InstallContext, tv: &ToolVersion) -> Result<()> { // Implementation for installing a specific version } - + async fn uninstall_version(&self, tv: &ToolVersion) -> Result<()> { // Implementation for uninstalling a version } - + // ... other required methods } ``` 3. **Register the backend** in `src/backend/mod.rs`: + - Add your backend to the imports - Add it to the backend registry/factory function - Add the `BackendType` enum variant diff --git a/docs/dev-tools/backend_architecture.md b/docs/dev-tools/backend_architecture.md index de2bf53f5f..1f2dae9721 100644 --- a/docs/dev-tools/backend_architecture.md +++ b/docs/dev-tools/backend_architecture.md @@ -104,13 +104,13 @@ terraform = "aqua:hashicorp/terraform" # Use aqua backend ## Backend Capabilities Comparison -| Feature | Core | npm/pipx/cargo | aqua | ubi | Backend Plugins | Tool Plugins (vfox) | asdf Plugins (legacy) | -|---------|------|----------------|------|-----|-----------------|---------------------|-----------------------| -| **Speed** | ✅ | ⚠️ | ✅ | ✅ | ⚠️ | ⚠️ | ⚠️ | -| **Security** | ✅ | ⚠️ | ✅ | ⚠️ | ⚠️ | ⚠️ | ⚠️ | -| **Windows Support** | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | -| **Env Var Support** | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | -| **Custom Scripts** | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | +| Feature | Core | npm/pipx/cargo | aqua | ubi | Backend Plugins | Tool Plugins (vfox) | asdf Plugins (legacy) | +| ------------------- | ---- | -------------- | ---- | --- | --------------- | ------------------- | --------------------- | +| **Speed** | ✅ | ⚠️ | ✅ | ✅ | ⚠️ | ⚠️ | ⚠️ | +| **Security** | ✅ | ⚠️ | ✅ | ⚠️ | ⚠️ | ⚠️ | ⚠️ | +| **Windows Support** | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | +| **Env Var Support** | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | +| **Custom Scripts** | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ## When to Use Each Backend diff --git a/docs/dev-tools/backends/github.md b/docs/dev-tools/backends/github.md index 4bb0a4a974..82f5625a29 100644 --- a/docs/dev-tools/backends/github.md +++ b/docs/dev-tools/backends/github.md @@ -61,6 +61,7 @@ Specifies the pattern to match against release asset names. This is useful when Specifies a custom version prefix for release tags. By default, mise handles the common `v` prefix (e.g., `v1.0.0`), but some repositories use different prefixes like `release-`, `version-`, or no prefix at all. When `version_prefix` is configured, mise will: + - Strip the prefix when listing available versions - Add the prefix when searching for releases - Try both prefixed and non-prefixed versions during installation @@ -71,6 +72,7 @@ When `version_prefix` is configured, mise will: ``` **Examples:** + - With `version_prefix = "release-"`: - User specifies `1.0.0` → mise searches for `release-1.0.0` tag - Available versions show as `1.0.0` (prefix stripped) @@ -102,7 +104,7 @@ asset_pattern = "tool-1.0.0-x64.tar.gz" checksum = "sha256:a1b2c3d4e5f6789..." ``` -*Instead of specifying the checksum here, you can use [mise.lock](/dev-tools/mise-lock) to manage checksums.* +_Instead of specifying the checksum here, you can use [mise.lock](/dev-tools/mise-lock) to manage checksums._ ### Platform-specific Checksums diff --git a/docs/dev-tools/backends/gitlab.md b/docs/dev-tools/backends/gitlab.md index e8e620592e..aba8cdff03 100644 --- a/docs/dev-tools/backends/gitlab.md +++ b/docs/dev-tools/backends/gitlab.md @@ -62,6 +62,7 @@ asset_pattern = "gitlab-runner-linux-x64" Specifies a custom version prefix for release tags. By default, mise handles the common `v` prefix (e.g., `v1.0.0`), but some repositories use different prefixes like `release-`, `version-`, or no prefix at all. When `version_prefix` is configured, mise will: + - Strip the prefix when listing available versions - Add the prefix when searching for releases - Try both prefixed and non-prefixed versions during installation @@ -72,6 +73,7 @@ When `version_prefix` is configured, mise will: ``` **Examples:** + - With `version_prefix = "release-"`: - User specifies `1.0.0` → mise searches for `release-1.0.0` tag - Available versions show as `1.0.0` (prefix stripped) @@ -103,7 +105,7 @@ asset_pattern = "tool-1.0.0-x64.tar.gz" checksum = "sha256:a1b2c3d4e5f6789..." ``` -*Instead of specifying the checksum here, you can use [mise.lock](/dev-tools/mise-lock) to manage checksums.* +_Instead of specifying the checksum here, you can use [mise.lock](/dev-tools/mise-lock) to manage checksums._ ### Platform-specific Checksums diff --git a/docs/dev-tools/backends/http.md b/docs/dev-tools/backends/http.md index 67284e2fab..1291e83d09 100644 --- a/docs/dev-tools/backends/http.md +++ b/docs/dev-tools/backends/http.md @@ -78,7 +78,7 @@ url = "https://example.com/releases/my-tool-v1.0.0.tar.gz" checksum = "sha256:a1b2c3d4e5f6789..." ``` -*Instead of specifying the checksum here, you can use [mise.lock](/dev-tools/mise-lock) to manage checksums.* +_Instead of specifying the checksum here, you can use [mise.lock](/dev-tools/mise-lock) to manage checksums._ ### Platform-specific Checksums @@ -172,6 +172,7 @@ The HTTP backend implements an intelligent caching system to optimize disk usage ### Cache Location Downloaded and extracted files are cached in `$MISE_CACHE_DIR/http-tarballs/` instead of being stored separately for each tool installation. By default: + - **Linux**: `~/.cache/mise/http-tarballs/` - **macOS**: `~/Library/Caches/mise/http-tarballs/` @@ -183,6 +184,7 @@ Cache keys are generated based on the file content to ensure identical downloads 2. **Extraction options**: `strip_components` is included in the cache key since it affects the extracted structure Example cache directory structure: + ``` ~/.cache/mise/http-tarballs/ ├── 71f774faa03daf1a58cc3339f8c73e6557348c8e0a2f3fb8148cc26e26bad83f/ diff --git a/docs/dev-tools/index.md b/docs/dev-tools/index.md index 7769d56e8f..007b91b6bb 100644 --- a/docs/dev-tools/index.md +++ b/docs/dev-tools/index.md @@ -152,6 +152,7 @@ node = { version = "22", postinstall = "corepack enable" } ``` Behavior: + - The command runs once the install completes successfully for that tool/version. - The tool's bin path is on PATH during the command, so you can invoke the installed tool directly. - Environment variables include `MISE_TOOL_INSTALL_PATH` pointing to the tool's install directory. @@ -170,14 +171,15 @@ ripgrep = { version = "latest", os = ["linux", "macos"] } "npm:windows-terminal" = { version = "latest", os = ["windows"] } # Works with other options -"cargo:usage-cli" = { - version = "latest", +"cargo:usage-cli" = { + version = "latest", os = ["linux", "macos"], install_env = { RUST_BACKTRACE = "1" } } ``` The `os` field accepts an array of operating system identifiers: + - `"linux"` - All Linux distributions - `"macos"` - macOS (Darwin) - `"windows"` - Windows @@ -304,14 +306,18 @@ environment with all of your tools. mise provides several mechanisms to automatically install missing tools or versions as needed. Below, these are grouped by how and when they are triggered, with relevant settings for each. All mechanisms require the global [auto_install](/configuration/settings.html#auto_install) setting to be enabled (**all auto_install settings are enabled by default**). ### On-Demand Execution ([`mise x`](/cli/exec), [`mise r`](/cli/run)) + When you run a command like [`mise x`](/cli/exec) or [`mise r`](/cli/run), mise will automatically install any missing tool versions required to execute the command. + - **When it triggers:** Whenever you use [`mise x`](/cli/exec) or [`mise r`](/cli/run) with a tool/version that is not yet installed. - **How to control:** - Setting: [`exec_auto_install`](/configuration/settings.html#exec_auto_install) (default: true) - Setting: [`task_auto_install`](/configuration/settings.html#task_auto_install) (default: true) ### Command Not Found Handler (Shell Integration) + If you type a command in your shell (e.g., `node`) and it is not found, mise can attempt to auto-install the missing tool version if it knows which tool provides that binary. + - **When it triggers:** When a command is not found in the shell and the handler is enabled. - **How to control:** - Setting: [`not_found_auto_install`](/configuration/settings.html#not_found_auto_install) (default: true) diff --git a/docs/dev-tools/mise-lock.md b/docs/dev-tools/mise-lock.md index 0b857b33e8..4f9996523d 100644 --- a/docs/dev-tools/mise-lock.md +++ b/docs/dev-tools/mise-lock.md @@ -149,7 +149,7 @@ git commit -m "Update tool versions" - name: Install tools run: | mise install # Uses exact versions from mise.lock - + - name: Cache lockfile uses: actions/cache@v3 with: diff --git a/docs/dev-tools/tool-stubs.md b/docs/dev-tools/tool-stubs.md index 8ac114a298..b5ace66553 100644 --- a/docs/dev-tools/tool-stubs.md +++ b/docs/dev-tools/tool-stubs.md @@ -101,6 +101,7 @@ mise generate tool-stub ./bin/gh --url "https://github.com/cli/cli/releases/down ``` This will: + - Download the archive to detect checksums (for security) - Extract it to auto-detect the binary path - Generate an executable stub with complete TOML configuration @@ -157,6 +158,7 @@ The generator will preserve existing configuration and merge new platforms into ### Supported Archive Formats The generator automatically detects and extracts various archive formats: + - `.tar.gz` / `.tgz` (gzip compressed tarballs) - `.tar.xz` / `.txz` (xz compressed tarballs) - `.tar.bz2` / `.tbz2` (bzip2 compressed tarballs) @@ -179,6 +181,7 @@ size = 12345678 ``` The generator automatically: + - Calculates BLAKE3 checksums for integrity verification - Detects file sizes - Identifies the correct binary path within archives diff --git a/docs/environments/index.md b/docs/environments/index.md index d599165ea3..4cb18b801f 100644 --- a/docs/environments/index.md +++ b/docs/environments/index.md @@ -169,7 +169,7 @@ Note: If you're using [mise-action](https://github.com/jdx/mise-action), it will Here's some example config files and their `config_root`: | Config File | `config_root` | -|---------------------------------------------|---------------| +| ------------------------------------------- | ------------- | | `~/src/foo/.config/mise/conf.d/config.toml` | `~/src/foo` | | `~/src/foo/.config/mise/config.toml` | `~/src/foo` | | `~/src/foo/.mise/config.toml` | `~/src/foo` | diff --git a/docs/installing-mise.md b/docs/installing-mise.md index 4d0ce248ef..f7b2b78383 100644 --- a/docs/installing-mise.md +++ b/docs/installing-mise.md @@ -46,6 +46,7 @@ curl https://mise.run/fish | sh ::: These shell-specific installers will: + - Install mise using the same logic as the main installer - Automatically detect your shell's configuration file - Add the activation line if it's not already present diff --git a/docs/mcp.md b/docs/mcp.md index e6a25760da..c975de331e 100644 --- a/docs/mcp.md +++ b/docs/mcp.md @@ -27,24 +27,32 @@ mise mcp The MCP server exposes the following read-only resources that AI assistants can query: ### `mise://tools` + Lists all tools managed by mise in your project, including: + - Tool names and versions - Installation status - Configuration source ### `mise://tasks` + Shows all available mise tasks with: + - Task names and descriptions - Task dependencies - Command definitions ### `mise://env` + Displays environment variables defined in your mise configuration: + - Variable names and values - Environment-specific overrides ### `mise://config` + Provides information about mise configuration: + - Active configuration files - Project root directory - Settings and preferences @@ -54,9 +62,11 @@ Provides information about mise configuration: The following tools are available for AI assistants to call (currently stubbed for future implementation): ### `install_tool` + Install a specific tool version (not yet implemented) ### `run_task` + Execute a mise task (not yet implemented) ## Integration with AI Assistants @@ -84,6 +94,7 @@ To use mise with Claude Desktop, add the following to your Claude configuration ``` After adding this configuration and restarting Claude Desktop, the assistant will be able to: + - Query your installed tools and versions - List available tasks in your project - Access environment variables from your mise configuration diff --git a/docs/plugin-lua-modules.md b/docs/plugin-lua-modules.md index 09bb81be38..7f5995922d 100644 --- a/docs/plugin-lua-modules.md +++ b/docs/plugin-lua-modules.md @@ -185,7 +185,7 @@ local strings = require("strings") local function normalize_version(version) -- Remove 'v' prefix if present version = strings.trim_prefix(version, "v") - + -- Remove pre-release suffixes local parts = strings.split(version, "-") return parts[1] @@ -258,14 +258,14 @@ function get_github_releases(owner, repo) local resp, err = http.get({ url = "https://github.com/" .. owner .. "/" .. repo .. "/releases" }) - + if err ~= nil then error("Failed to fetch releases: " .. err) end - + local doc = html.parse(resp.body) local releases = {} - + -- Find all release tags local release_elements = doc:find("a[href*='/releases/tag/']") for _, element in ipairs(release_elements) do @@ -278,7 +278,7 @@ function get_github_releases(owner, repo) }) end end - + return releases end ``` @@ -324,17 +324,17 @@ function install_from_archive(download_url, install_path) local err = http.download_file({ url = download_url }, archive_path) - + if err ~= nil then error("Download failed: " .. err) end - + -- Extract to installation directory local err = archiver.decompress(archive_path, install_path) if err ~= nil then error("Extraction failed: " .. err) end - + -- Clean up archive os.remove(archive_path) end @@ -482,21 +482,21 @@ function fetch_npm_versions(package_name) ['User-Agent'] = "mise-plugin" } }) - + if err ~= nil then error("Failed to fetch package info: " .. err) end - + local package_info = json.decode(resp.body) local versions = {} - + for version, _ in pairs(package_info.versions) do table.insert(versions, version) end - + -- Sort versions (simple string sort) table.sort(versions) - + return versions end ``` @@ -515,16 +515,16 @@ function download_with_verification(url, dest_path, expected_sha256) ['User-Agent'] = "mise-plugin" } }, dest_path) - + if err ~= nil then error("Download failed: " .. err) end - + -- Verify file exists if not file.exists(dest_path) then error("Downloaded file not found") end - + -- Note: SHA256 verification would need additional implementation -- This is a simplified example print("Downloaded successfully to: " .. dest_path) @@ -542,21 +542,21 @@ function parse_config_file(config_path) if not file.exists(config_path) then return {} -- Return empty config end - + local content = file.read(config_path) if not content then error("Failed to read config file: " .. config_path) end - + -- Trim whitespace content = strings.trim_space(content) - + -- Parse JSON local success, config = pcall(json.decode, content) if not success then error("Invalid JSON in config file: " .. config_path) end - + return config end ``` @@ -572,23 +572,23 @@ function scrape_versions_from_releases(base_url) local resp, err = http.get({ url = base_url .. "/releases" }) - + if err ~= nil then error("Failed to fetch releases page: " .. err) end - + local doc = html.parse(resp.body) local versions = {} - + -- Find version tags local version_elements = doc:find("h2 a[href*='/releases/tag/']") for _, element in ipairs(version_elements) do local version_text = element:text() local version = strings.trim_space(version_text) - + -- Remove 'v' prefix if present version = strings.trim_prefix(version, "v") - + if version and version ~= "" then table.insert(versions, { version = version, @@ -596,7 +596,7 @@ function scrape_versions_from_releases(base_url) }) end end - + return versions end ``` @@ -613,20 +613,20 @@ local json = require("json") function safe_api_call(url) local resp, err = http.get({url = url}) - + if err ~= nil then error("HTTP request failed: " .. err) end - + if resp.status_code ~= 200 then error("API returned error: " .. resp.status_code .. " " .. resp.body) end - + local success, data = pcall(json.decode, resp.body) if not success then error("Failed to parse JSON response: " .. data) end - + return data end ``` @@ -642,26 +642,26 @@ local cache_ttl = 3600 -- 1 hour function cached_http_get(url) local now = os.time() local cache_key = url - + -- Check cache if cache[cache_key] and (now - cache[cache_key].timestamp) < cache_ttl then return cache[cache_key].data end - + -- Fetch fresh data local http = require("http") local resp, err = http.get({url = url}) - + if err ~= nil then error("HTTP request failed: " .. err) end - + -- Cache the result cache[cache_key] = { data = resp, timestamp = now } - + return resp end ``` @@ -674,7 +674,7 @@ Handle cross-platform differences: local function get_platform_info() local is_windows = package.config:sub(1,1) == '\\' local cmd = require("cmd") - + if is_windows then return { os = "windows", @@ -685,7 +685,7 @@ local function get_platform_info() else local uname = cmd.exec("uname -s"):lower() local arch = cmd.exec("uname -m") - + return { os = uname, arch = arch, diff --git a/docs/plugin-publishing.md b/docs/plugin-publishing.md index 124292fecd..a50e690c6f 100644 --- a/docs/plugin-publishing.md +++ b/docs/plugin-publishing.md @@ -252,27 +252,32 @@ Create a GitHub release for better discoverability: ### 4. Release Notes Template -```markdown +````markdown ## Changes in v1.2.3 ### Added + - New feature X - Support for Y ### Changed + - Improved performance of Z - Updated dependencies ### Fixed + - Fixed issue with A - Resolved bug in B ### Installation + ```bash mise plugin install my-plugin https://github.com/username/my-plugin ``` +```` -``` +```` ## Distribution Methods @@ -289,7 +294,7 @@ mise plugin install my-plugin https://github.com/username/my-plugin@v1.2.3 # Install from other Git providers mise plugin install my-plugin https://gitlab.com/username/my-plugin -``` +```` ### 2. Private Repository Access diff --git a/docs/plugin-usage.md b/docs/plugin-usage.md index 1bb4c50a12..86e127b112 100644 --- a/docs/plugin-usage.md +++ b/docs/plugin-usage.md @@ -195,7 +195,7 @@ When using plugins, be aware that: - **Only install plugins from trusted sources** - **Review plugin code** before installation when possible - **Use version pinning** to avoid unexpected updates like [`mise.lock`](/dev-tools/mise-lock.md) -::: + ::: ## Troubleshooting diff --git a/docs/public/logo.svg b/docs/public/logo.svg new file mode 100644 index 0000000000..71b5cd97bd --- /dev/null +++ b/docs/public/logo.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + > + + + + + + + + + + + \ No newline at end of file diff --git a/docs/public/site.webmanifest b/docs/public/site.webmanifest index 1dd911238a..fa99de77db 100755 --- a/docs/public/site.webmanifest +++ b/docs/public/site.webmanifest @@ -1 +1,19 @@ -{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/docs/tasks/architecture.md b/docs/tasks/architecture.md index 0d94f61396..118335ae87 100644 --- a/docs/tasks/architecture.md +++ b/docs/tasks/architecture.md @@ -41,7 +41,7 @@ depends = ["lint", "build"] run = "npm test" ``` -#### `depends_post` - Cleanup Tasks +#### `depends_post` - Cleanup Tasks Tasks that run after this task completes (whether successful or failed): @@ -94,7 +94,7 @@ depends = ["lint"] run = "npm run test:unit" [tasks.test-integration] -depends = ["lint"] +depends = ["lint"] run = "npm run test:integration" [tasks.build] @@ -118,7 +118,7 @@ Time → mise discovers tasks from multiple sources in this order: 1. **File tasks**: Executable files in task directories -2. **TOML tasks**: Defined in `mise.toml` files +2. **TOML tasks**: Defined in `mise.toml` files 3. **Inherited tasks**: From parent directories ### Task Resolution Process @@ -185,7 +185,7 @@ Reference tasks from other directories: [tasks.deploy-all] depends = [ "../api:build", - "../frontend:build", + "../frontend:build", "deploy-infrastructure" ] run = "echo 'All services deployed'" diff --git a/docs/tool-plugin-development.md b/docs/tool-plugin-development.md index 0c21335af6..22d04e5e92 100644 --- a/docs/tool-plugin-development.md +++ b/docs/tool-plugin-development.md @@ -20,12 +20,12 @@ Tool plugins use a hook-based architecture with specific functions for different graph TD A[User Request] --> B[mise CLI] B --> C[Tool Plugin] - + C --> D[Available Hook
List Versions] C --> E[PreInstall Hook
Download] C --> F[PostInstall Hook
Setup] C --> G[EnvKeys Hook
Configure] - + subgraph "Plugin Files" H[metadata.lua] I[hooks/available.lua] @@ -33,7 +33,7 @@ graph TD K[hooks/env_keys.lua] L[hooks/post_install.lua] end - + style C fill:#e1f5fe style D fill:#e8f5e8 style E fill:#e8f5e8 @@ -55,7 +55,7 @@ Lists all available versions of the tool: -- hooks/available.lua function PLUGIN:Available(ctx) local args = ctx.args -- User arguments - + -- Return array of available versions return { { @@ -85,10 +85,10 @@ Handles pre-installation logic and returns download information: function PLUGIN:PreInstall(ctx) local version = ctx.version local runtimeVersion = ctx.runtimeVersion - + -- Determine download URL and checksums local url = "https://nodejs.org/dist/v" .. version .. "/node-v" .. version .. "-linux-x64.tar.gz" - + return { version = version, url = url, @@ -118,7 +118,7 @@ function PLUGIN:EnvKeys(ctx) local path = sdkInfo.path local version = sdkInfo.version local name = sdkInfo.name - + return { { key = "NODE_HOME", @@ -130,7 +130,7 @@ function PLUGIN:EnvKeys(ctx) }, -- Multiple PATH entries are automatically merged { - key = "PATH", + key = "PATH", value = mainPath .. "/lib/node_modules/.bin" } } @@ -153,13 +153,13 @@ function PLUGIN:PostInstall(ctx) local sdkInfo = ctx.sdkInfo['nodejs'] local path = sdkInfo.path local version = sdkInfo.version - + -- Compile native modules, set permissions, etc. local result = os.execute("chmod +x " .. path .. "/bin/*") if result ~= 0 then error("Failed to set permissions") end - + -- No return value needed end ``` @@ -176,12 +176,12 @@ function PLUGIN:PreUse(ctx) local installedSdks = ctx.installedSdks local cwd = ctx.cwd local scope = ctx.scope -- global/project/session - + -- Optionally modify the version if version == "latest" then version = "20.0.0" -- Resolve to specific version end - + return { version = version } @@ -198,12 +198,12 @@ function PLUGIN:ParseLegacyFile(ctx) local filename = ctx.filename local filepath = ctx.filepath local versions = ctx:getInstalledVersions() - + -- Read and parse the file local file = require("file") local content = file.read(filepath) local version = content:match("v?([%d%.]+)") - + return { version = version } @@ -230,6 +230,7 @@ git init ``` The template includes: + - Pre-configured plugin structure with all required hooks - Example implementations with comments - Linting configuration (`.luacheckrc`, `stylua.toml`) @@ -267,7 +268,7 @@ PLUGIN = { version = "1.0.0", description = "Node.js runtime environment", author = "Plugin Author", - + -- Legacy version files this plugin can parse legacyFilenames = { '.nvmrc', @@ -328,27 +329,27 @@ Here's a complete example based on the vfox-nodejs plugin that demonstrates all function PLUGIN:Available(ctx) local http = require("http") local json = require("json") - + -- Fetch versions from Node.js API local resp, err = http.get({ url = "https://nodejs.org/dist/index.json" }) - + if err ~= nil then error("Failed to fetch versions: " .. err) end - + local versions = json.decode(resp.body) local result = {} - + for i, v in ipairs(versions) do local version = v.version:gsub("^v", "") -- Remove 'v' prefix local note = nil - + if v.lts then note = "LTS" end - + table.insert(result, { version = version, note = note, @@ -360,7 +361,7 @@ function PLUGIN:Available(ctx) } }) end - + return result end ``` @@ -393,16 +394,16 @@ function PLUGIN:PreInstall(ctx) end local platform = os_token .. "-" .. arch_token local extension = (RUNTIME.osType == "Windows") and "zip" or "tar.gz" - + -- Build download URL local filename = "node-v" .. version .. "-" .. platform .. "." .. extension local url = "https://nodejs.org/dist/v" .. version .. "/" .. filename - + -- Fetch checksum local http = require("http") local shasums_url = "https://nodejs.org/dist/v" .. version .. "/SHASUMS256.txt" local resp, err = http.get({ url = shasums_url }) - + local sha256 = nil if err == nil then -- Extract SHA256 for our file @@ -413,7 +414,7 @@ function PLUGIN:PreInstall(ctx) end end end - + return { version = version, url = url, @@ -430,7 +431,7 @@ end function PLUGIN:EnvKeys(ctx) local mainPath = ctx.path local os_type = RUNTIME.osType - + local env_vars = { { key = "NODE_HOME", @@ -441,18 +442,18 @@ function PLUGIN:EnvKeys(ctx) value = mainPath .. "/bin" } } - + -- Add npm global modules to PATH local npm_global_path = mainPath .. "/lib/node_modules/.bin" if os_type == "Windows" then npm_global_path = mainPath .. "/node_modules/.bin" end - + table.insert(env_vars, { key = "PATH", value = npm_global_path }) - + return env_vars end ``` @@ -468,17 +469,17 @@ function PLUGIN:PostInstall(ctx) if RUNTIME.osType ~= "Windows" then os.execute("chmod +x " .. path .. "/bin/*") end - + -- Create npm cache directory local npm_cache_dir = path .. "/.npm" os.execute("mkdir -p " .. npm_cache_dir) - + -- Configure npm to use local cache local npm_cmd = path .. "/bin/npm" if RUNTIME.osType == "Windows" then npm_cmd = path .. "/npm.cmd" end - + os.execute(npm_cmd .. " config set cache " .. npm_cache_dir) os.execute(npm_cmd .. " config set prefix " .. path) end @@ -492,16 +493,16 @@ function PLUGIN:ParseLegacyFile(ctx) local filename = ctx.filename local filepath = ctx.filepath local file = require("file") - + -- Read file content local content = file.read(filepath) if not content then error("Failed to read " .. filepath) end - + -- Parse version from different file formats local version = nil - + if filename == ".nvmrc" then -- .nvmrc can contain version with or without 'v' prefix version = content:match("v?([%d%.]+)") @@ -509,12 +510,12 @@ function PLUGIN:ParseLegacyFile(ctx) -- .node-version typically contains just the version number version = content:match("([%d%.]+)") end - + -- Remove any whitespace if version then version = version:gsub("%s+", "") end - + return { version = version } @@ -608,15 +609,15 @@ function PLUGIN:Available(ctx) local resp, err = http.get({ url = "https://api.example.com/versions" }) - + if err ~= nil then error("Failed to fetch versions from API: " .. err) end - + if resp.status_code ~= 200 then error("API returned status " .. resp.status_code .. ": " .. resp.body) end - + -- Process response... end ``` @@ -645,6 +646,7 @@ return M ``` **Note:** The `RUNTIME` object is automatically available in all plugin hooks and provides: + - `RUNTIME.osType`: Operating system type ("Windows", "Linux", "Darwin") - `RUNTIME.archType`: Architecture ("amd64", "arm64", "386", etc.) @@ -656,10 +658,10 @@ Normalize versions consistently: local function normalize_version(version) -- Remove 'v' prefix if present version = version:gsub("^v", "") - + -- Remove pre-release suffixes version = version:gsub("%-.*", "") - + return version end ``` @@ -675,19 +677,19 @@ local cache_ttl = 12 * 60 * 60 -- 12 hours in seconds function PLUGIN:Available(ctx) local now = os.time() - + -- Check cache first if cache.versions and cache.timestamp and (now - cache.timestamp) < cache_ttl then return cache.versions end - + -- Fetch fresh data local versions = fetch_versions_from_api() - + -- Update cache cache.versions = versions cache.timestamp = now - + return versions end ``` @@ -726,22 +728,22 @@ function PLUGIN:PostInstall(ctx) local sdkInfo = ctx.sdkInfo['tool-name'] local path = sdkInfo.path local version = sdkInfo.version - + -- Change to source directory local build_dir = path .. "/src" - + -- Configure build local configure_result = os.execute("cd " .. build_dir .. " && ./configure --prefix=" .. path) if configure_result ~= 0 then error("Configure failed") end - + -- Compile local make_result = os.execute("cd " .. build_dir .. " && make -j$(nproc)") if make_result ~= 0 then error("Compilation failed") end - + -- Install local install_result = os.execute("cd " .. build_dir .. " && make install") if install_result ~= 0 then @@ -758,7 +760,7 @@ Complex environment variable setup: function PLUGIN:EnvKeys(ctx) local mainPath = ctx.path local version = ctx.sdkInfo['tool-name'].version - + local env_vars = { -- Standard environment variables { @@ -769,7 +771,7 @@ function PLUGIN:EnvKeys(ctx) key = "TOOL_VERSION", value = version }, - + -- PATH entries { key = "PATH", @@ -779,7 +781,7 @@ function PLUGIN:EnvKeys(ctx) key = "PATH", value = mainPath .. "/scripts" }, - + -- Library paths { key = "LD_LIBRARY_PATH", @@ -790,7 +792,7 @@ function PLUGIN:EnvKeys(ctx) value = mainPath .. "/lib/pkgconfig" } } - + -- Platform-specific additions if RUNTIME.osType == "Darwin" then table.insert(env_vars, { @@ -798,7 +800,7 @@ function PLUGIN:EnvKeys(ctx) value = mainPath .. "/lib" }) end - + return env_vars end ``` diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index 5d65ce7fe7..90cabf6a17 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -179,5 +179,6 @@ If you are expecting mise to automatically install a tool when you run a command This is because mise does not have a way of knowing which binaries a tool provides unless there is already an installed (even inactive) version of that tool. If you have never installed any version of a tool, mise cannot determine which tool is responsible for a given binary name, and so it cannot auto-install it on demand. **Workarounds:** + - Manually install at least one version of the tool you want to be auto-installed in the future. After that, the auto-install feature will work for missing versions of that tool. - Use [`mise x|exec`](/cli/exec) or [`mise r|run`](/cli/run) to trigger auto-install for missing tools, even if no version is currently installed. These commands will attempt to install the required tool versions automatically. diff --git a/docs/url-replacements.md b/docs/url-replacements.md index 5a4c8f3cd0..064fa17c2f 100644 --- a/docs/url-replacements.md +++ b/docs/url-replacements.md @@ -21,7 +21,7 @@ In mise.toml (multiline): ```toml [settings.url_replacements] "github.com" = "nexus.mycompany.net" -"releases.hashicorp.com" = "artifactory.xmpl.com" +"releases.hashicorp.com" = "artifactory.xmpl.com" ``` RegEx example: @@ -39,6 +39,7 @@ and the value is the replacement string. The replacement happens by searching an the pattern anywhere in the full URL string (including protocol, hostname, path, and query parameters). Examples: + - `github.com` -> `nexus.mycompany.net` replaces GitHub hostnames - `https://github.com` -> `https://nexus.mycompany.net` with protocol excludes e.g. 'api.github.com' - `https://github.com` -> `https://proxy.corp.com/github-mirror` replaces GitHub with corporate proxy @@ -53,46 +54,54 @@ The value can use capture groups from the regex pattern. ### Regex Examples #### 1. Protocol Conversion (HTTP to HTTPS) + ```toml [settings] -url_replacements = { - "regex:^http://(.+)" = "https://$1" +url_replacements = { + "regex:^http://(.+)" = "https://$1" } ``` + This converts any HTTP URL to HTTPS by capturing everything after "http://" and replacing it with "https://". #### 2. GitHub Release Mirroring with Path Restructuring + ```toml [settings] -url_replacements = { - "regex:https://github\\.com/([^/]+)/([^/]+)/releases/download/(.+)" = - "https://hub.corp.com/artifactory/github/$1/$2/$3" +url_replacements = { + "regex:https://github\\.com/([^/]+)/([^/]+)/releases/download/(.+)" = + "https://hub.corp.com/artifactory/github/$1/$2/$3" } ``` + Transforms `https://github.com/owner/repo/releases/download/v1.0.0/file.tar.gz` to `https://hub.corp.com/artifactory/github/owner/repo/v1.0.0/file.tar.gz` #### 3. Subdomain to Path Conversion + ```toml [settings] -url_replacements = { - "regex:https://([^.]+)\\.cdn\\.example\\.com/(.+)" = - "https://unified-cdn.com/$1/$2" +url_replacements = { + "regex:https://([^.]+)\\.cdn\\.example\\.com/(.+)" = + "https://unified-cdn.com/$1/$2" } ``` + Converts subdomain-based URLs to path-based URLs on a unified CDN. #### 4. Multiple Replacement Patterns (processed in order) + ```toml [settings] -url_replacements = { - "regex:https://github\\.com/microsoft/(.+)" = +url_replacements = { + "regex:https://github\\.com/microsoft/(.+)" = "https://internal-mirror.com/microsoft/$1", - "regex:https://github\\.com/(.+)" = + "regex:https://github\\.com/(.+)" = "https://public-mirror.com/github/$1", "releases.hashicorp.com" = "hashicorp-mirror.internal.com" } ``` + First regex catches Microsoft repositories specifically, second catches all other GitHub URLs, and the simple replacement handles HashiCorp. @@ -100,12 +109,13 @@ and the simple replacement handles HashiCorp. 1. **Corporate Mirrors**: Replace public download URLs with internal corporate mirrors 2. **Custom Registries**: Redirect package downloads to custom or private registries -3. **Geographic Optimization**: Route downloads to geographically closer mirrors +3. **Geographic Optimization**: Route downloads to geographically closer mirrors 4. **Protocol Changes**: Convert HTTP URLs to HTTPS or vice versa ## Regex Syntax mise uses Rust regex engine which supports: + - `^` and `$` for anchors (start/end of string) - `(.+)` for capture groups (use `$1`, `$2`, etc. in replacement) - `[^/]+` for character classes (matches any character except `/`) From e84e5b48f862cf87bf6868db07342ce577417f0c Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Thu, 18 Sep 2025 21:09:15 +0000 Subject: [PATCH 02/18] fix(docs): improve light mode theme contrast and readability - Use more muted colors in light mode for better readability - Adjust brand colors to be less saturated in light mode - Improve contrast for text and backgrounds - Fix gradient text to use darker colors in light mode - Update logo terminal background for better visibility - Add separate hover effects for light/dark modes - Ensure sidebar has proper background in light mode --- docs/.vitepress/theme/custom.css | 66 +++++++++++++++++++++++++++----- docs/public/logo.svg | 2 +- 2 files changed, 58 insertions(+), 10 deletions(-) diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css index 29129b6bd1..b0c6aea04f 100644 --- a/docs/.vitepress/theme/custom.css +++ b/docs/.vitepress/theme/custom.css @@ -69,17 +69,45 @@ /* Light mode customizations */ :root:not(.dark) { + /* Light mode brand colors - more muted for better readability */ + --vp-c-brand-1: #0097a7; /* Darker cyan for light mode */ + --vp-c-brand-2: #00838f; /* Even darker on hover */ + --vp-c-brand-3: #006064; /* Active state */ + --vp-c-brand-soft: rgba(0, 151, 167, 0.08); + + /* Adjusted success colors for light mode */ + --vp-c-success-1: #2e7d32; + --vp-c-success-2: #1b5e20; + --vp-c-success-soft: rgba(46, 125, 50, 0.08); + + /* Adjusted warning colors */ + --vp-c-warning-1: #ef6c00; + --vp-c-warning-2: #e65100; + --vp-c-warning-soft: rgba(239, 108, 0, 0.08); + + /* Background colors with better contrast */ --vp-c-bg: #ffffff; - --vp-c-bg-soft: #f9f9fb; - --vp-c-bg-mute: #f3f4f6; + --vp-c-bg-soft: #f8f9fa; + --vp-c-bg-mute: #e9ecef; + --vp-c-bg-alt: #f1f3f5; - --vp-c-text-1: #213547; - --vp-c-text-2: #476573; - --vp-c-text-3: #6b7280; + /* Text colors with better readability */ + --vp-c-text-1: #1a1a1a; + --vp-c-text-2: #4a5568; + --vp-c-text-3: #718096; + --vp-c-text-4: #a0aec0; + + /* Dividers with more contrast */ + --vp-c-divider: #e2e8f0; + --vp-c-divider-light: #cbd5e0; /* Light mode code styling */ - --vp-c-code-bg: #f3f4f6; - --vp-c-code-color: #0097a7; + --vp-c-code-bg: #f1f3f5; + --vp-c-code-color: #006064; + + /* Code blocks in light mode */ + --vp-code-block-bg: #f8f9fa; + --vp-code-block-divider-color: #e2e8f0; } /* Navigation Bar Customization */ @@ -113,7 +141,6 @@ .VPNavBarTitle .title { font-weight: 900; font-size: 1.05rem; - background: linear-gradient(120deg, #00d9ff 0%, #52e892 50%, #ff9100 100%); background-size: 200% 100%; -webkit-background-clip: text; background-clip: text; @@ -123,12 +150,28 @@ transition: all 0.3s ease; } +/* Dark mode gradient */ +.dark .VPNavBarTitle .title { + background: linear-gradient(120deg, #00d9ff 0%, #52e892 50%, #ff9100 100%); +} + +/* Light mode gradient - more muted colors */ +:root:not(.dark) .VPNavBarTitle .title { + background: linear-gradient(120deg, #0097a7 0%, #2e7d32 50%, #ef6c00 100%); +} + /* Animate and glow on hover */ -.VPNavBarTitle:hover .title { +.dark .VPNavBarTitle:hover .title { filter: drop-shadow(0 0 8px rgba(0, 217, 255, 0.5)); animation: shimmer 2s ease-in-out infinite; } +/* Light mode hover effect */ +:root:not(.dark) .VPNavBarTitle:hover .title { + filter: drop-shadow(0 0 6px rgba(0, 151, 167, 0.3)); + animation: shimmer 2s ease-in-out infinite; +} + @keyframes shimmer { 0% { background-position: 100% 0; @@ -189,6 +232,11 @@ backdrop-filter: blur(8px); } +/* Light mode sidebar background */ +:root:not(.dark) .VPSidebar { + background-color: rgba(255, 255, 255, 0.8); +} + .VPSidebarItem { margin: 0; } diff --git a/docs/public/logo.svg b/docs/public/logo.svg index 71b5cd97bd..580ff9e28d 100644 --- a/docs/public/logo.svg +++ b/docs/public/logo.svg @@ -18,7 +18,7 @@ From b34ccbe29095da870e1df6eeb5a030c829eaa671 Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Thu, 18 Sep 2025 21:10:57 +0000 Subject: [PATCH 03/18] fix(docs): simplify logo SVG to fix rendering issues - Remove gradients from terminal header to prevent rendering problems - Use solid colors for terminal header bar - Simplify gradient usage to only the border - Fix command prompt positioning - Use simpler rectangle fills instead of complex gradients - Ensure logo displays correctly in both light and dark modes --- docs/public/logo.svg | 54 +++++++++++++++++--------------------------- 1 file changed, 21 insertions(+), 33 deletions(-) diff --git a/docs/public/logo.svg b/docs/public/logo.svg index 580ff9e28d..a77ca38e21 100644 --- a/docs/public/logo.svg +++ b/docs/public/logo.svg @@ -1,53 +1,41 @@ - + - - - - - - - - - - + + stroke="url(#borderGradient)" + stroke-width="3"/> - - + + + - - - + + + - - > + >_ - - - - - - - - + + + + + \ No newline at end of file From 1e68691a1b3ef7c2365f8ce90d608a589f766f00 Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Thu, 18 Sep 2025 21:12:09 +0000 Subject: [PATCH 04/18] fix(docs): fix invisible title text by removing gradient from default state - Title text now uses normal text color by default - Gradient effect only applied on hover - This fixes the issue where text was invisible due to gradient rendering problems - Text is now readable in both light and dark modes - Maintains the animated gradient effect on hover for visual interest --- docs/.vitepress/theme/custom.css | 33 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css index b0c6aea04f..6e0b70987e 100644 --- a/docs/.vitepress/theme/custom.css +++ b/docs/.vitepress/theme/custom.css @@ -141,35 +141,34 @@ .VPNavBarTitle .title { font-weight: 900; font-size: 1.05rem; - background-size: 200% 100%; - -webkit-background-clip: text; - background-clip: text; - -webkit-text-fill-color: transparent; letter-spacing: -0.02em; margin-left: 0.25rem; transition: all 0.3s ease; + color: var(--vp-c-text-1); } -/* Dark mode gradient */ -.dark .VPNavBarTitle .title { +/* Gradient text on hover only */ +.VPNavBarTitle:hover .title { background: linear-gradient(120deg, #00d9ff 0%, #52e892 50%, #ff9100 100%); + background-size: 200% 100%; + -webkit-background-clip: text; + background-clip: text; + -webkit-text-fill-color: transparent; } -/* Light mode gradient - more muted colors */ -:root:not(.dark) .VPNavBarTitle .title { +/* Light mode hover gradient */ +:root:not(.dark) .VPNavBarTitle:hover .title { background: linear-gradient(120deg, #0097a7 0%, #2e7d32 50%, #ef6c00 100%); + background-size: 200% 100%; + -webkit-background-clip: text; + background-clip: text; + -webkit-text-fill-color: transparent; } -/* Animate and glow on hover */ -.dark .VPNavBarTitle:hover .title { - filter: drop-shadow(0 0 8px rgba(0, 217, 255, 0.5)); - animation: shimmer 2s ease-in-out infinite; -} - -/* Light mode hover effect */ -:root:not(.dark) .VPNavBarTitle:hover .title { - filter: drop-shadow(0 0 6px rgba(0, 151, 167, 0.3)); +/* Add animation on hover */ +.VPNavBarTitle:hover .title { animation: shimmer 2s ease-in-out infinite; + filter: drop-shadow(0 0 8px rgba(0, 217, 255, 0.3)); } @keyframes shimmer { From 30b841304d460123a40027cb5e83475415940ae7 Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Thu, 18 Sep 2025 21:14:54 +0000 Subject: [PATCH 05/18] feat(docs): add Bebas Neue font for all headers - Import Bebas Neue from Google Fonts - Apply to all headers (h1-h6) for a bold, distinctive look - Use for navigation title, hero sections, and feature headings - Apply to sidebar section headers with uppercase styling - Adjust font sizes to accommodate Bebas Neue's tall character design - Increase letter spacing for better readability with the condensed font --- docs/.vitepress/config.ts | 2 +- docs/.vitepress/theme/custom.css | 51 ++++++++++++++++++++++++++++++-- 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index 4c5ba8f49a..ad3f77eaa8 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -268,7 +268,7 @@ export default withMermaid( [ "link", { - href: "https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;900&family=JetBrains+Mono:wght@400;500;600;700&display=swap", + href: "https://fonts.googleapis.com/css2?family=Bebas+Neue&family=Inter:wght@300;400;500;600;700;900&family=JetBrains+Mono:wght@400;500;600;700&display=swap", rel: "stylesheet", }, ], diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css index 6e0b70987e..7c51abacfb 100644 --- a/docs/.vitepress/theme/custom.css +++ b/docs/.vitepress/theme/custom.css @@ -34,6 +34,7 @@ "Helvetica Neue", sans-serif; --vp-font-family-mono: "JetBrains Mono", "Fira Code", "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, "Courier New", monospace; + --vp-font-family-heading: "Bebas Neue", "Inter", sans-serif; /* Custom spacing for better readability */ --vp-layout-max-width: 1440px; @@ -187,6 +188,49 @@ } } +/* Apply Bebas Neue to all headers */ +h1, h2, h3, h4, h5, h6, +.vp-doc h1, +.vp-doc h2, +.vp-doc h3, +.vp-doc h4, +.vp-doc h5, +.vp-doc h6, +.VPHero .name, +.VPHome .name, +.VPFeature h3, +.VPNavBarTitle .title { + font-family: "Bebas Neue", var(--vp-font-family-base) !important; + letter-spacing: 0.02em; +} + +/* Adjust header sizes for Bebas Neue's tall characters */ +.vp-doc h1 { + font-size: 3rem; + line-height: 1.2; +} + +.vp-doc h2 { + font-size: 2.2rem; + line-height: 1.3; +} + +.vp-doc h3 { + font-size: 1.8rem; + line-height: 1.4; +} + +.vp-doc h4 { + font-size: 1.5rem; + line-height: 1.4; +} + +/* Site title specific adjustment */ +.VPNavBarTitle .title { + font-size: 1.3rem; + letter-spacing: 0.05em; +} + /* Hero section enhancement */ .VPHero { padding-bottom: 56px !important; @@ -243,10 +287,11 @@ .VPSidebarItem.level-0 > .item { padding-top: 2px; padding-bottom: 2px; - font-weight: 600; + font-family: "Bebas Neue", var(--vp-font-family-base); + font-weight: 400; text-transform: uppercase; - letter-spacing: 0.025em; - font-size: 0.75rem; + letter-spacing: 0.05em; + font-size: 0.9rem; color: var(--vp-c-text-3); } From 366d0f07fc2ac5e579d47ffca14d397fe5c01c0a Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Thu, 18 Sep 2025 21:15:47 +0000 Subject: [PATCH 06/18] refactor(docs): restrict Bebas Neue font to h1 headers and site title only - Apply Bebas Neue only to h1 elements and 'mise-en-place' title - Revert h2-h6 headers back to default Inter font - Revert sidebar section headers to Inter font - Keep hero page name using Bebas Neue for impact - This creates better visual hierarchy with distinctive h1s while maintaining readability for smaller headers --- docs/.vitepress/theme/custom.css | 36 +++++++------------------------- 1 file changed, 7 insertions(+), 29 deletions(-) diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css index 7c51abacfb..77bce09aca 100644 --- a/docs/.vitepress/theme/custom.css +++ b/docs/.vitepress/theme/custom.css @@ -188,43 +188,22 @@ } } -/* Apply Bebas Neue to all headers */ -h1, h2, h3, h4, h5, h6, +/* Apply Bebas Neue to h1 headers and site title only */ +h1, .vp-doc h1, -.vp-doc h2, -.vp-doc h3, -.vp-doc h4, -.vp-doc h5, -.vp-doc h6, .VPHero .name, .VPHome .name, -.VPFeature h3, .VPNavBarTitle .title { font-family: "Bebas Neue", var(--vp-font-family-base) !important; - letter-spacing: 0.02em; + letter-spacing: 0.03em; } -/* Adjust header sizes for Bebas Neue's tall characters */ +/* Adjust h1 size for Bebas Neue's tall characters */ .vp-doc h1 { font-size: 3rem; line-height: 1.2; } -.vp-doc h2 { - font-size: 2.2rem; - line-height: 1.3; -} - -.vp-doc h3 { - font-size: 1.8rem; - line-height: 1.4; -} - -.vp-doc h4 { - font-size: 1.5rem; - line-height: 1.4; -} - /* Site title specific adjustment */ .VPNavBarTitle .title { font-size: 1.3rem; @@ -287,11 +266,10 @@ h1, h2, h3, h4, h5, h6, .VPSidebarItem.level-0 > .item { padding-top: 2px; padding-bottom: 2px; - font-family: "Bebas Neue", var(--vp-font-family-base); - font-weight: 400; + font-weight: 600; text-transform: uppercase; - letter-spacing: 0.05em; - font-size: 0.9rem; + letter-spacing: 0.025em; + font-size: 0.75rem; color: var(--vp-c-text-3); } From e3abca13c14365cf758310ce3c6d805f26996b15 Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Thu, 18 Sep 2025 21:16:32 +0000 Subject: [PATCH 07/18] feat(docs): extend Bebas Neue to navigation elements - Apply Bebas Neue to top navigation items (Dev Tools, Environments, Tasks) - Use for 'On this page' outline header with uppercase styling - Apply to search button placeholder text - Adjust font sizes and letter spacing for each element - Creates cohesive design with consistent use of display font for navigation --- docs/.vitepress/theme/custom.css | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css index 77bce09aca..6fb925de1a 100644 --- a/docs/.vitepress/theme/custom.css +++ b/docs/.vitepress/theme/custom.css @@ -188,16 +188,40 @@ } } -/* Apply Bebas Neue to h1 headers and site title only */ +/* Apply Bebas Neue to h1 headers, navigation, and key UI elements */ h1, .vp-doc h1, .VPHero .name, .VPHome .name, -.VPNavBarTitle .title { +.VPNavBarTitle .title, +.VPNavBarMenu .VPNavBarMenuLink, +.VPNavBarMenuGroup .text, +.VPDocOutlineTitle, +.DocSearch-Button .DocSearch-Button-Placeholder, +.VPLocalSearchBox button .vpi-search-box { font-family: "Bebas Neue", var(--vp-font-family-base) !important; letter-spacing: 0.03em; } +/* Nav bar menu items (Dev Tools, Environments, Tasks) */ +.VPNavBarMenu .VPNavBarMenuLink { + font-size: 1.1rem; + letter-spacing: 0.04em; +} + +/* "On this page" header */ +.VPDocOutlineTitle { + font-size: 1rem; + letter-spacing: 0.05em; + text-transform: uppercase; +} + +/* Search button text */ +.DocSearch-Button .DocSearch-Button-Placeholder { + font-size: 1rem; + letter-spacing: 0.04em; +} + /* Adjust h1 size for Bebas Neue's tall characters */ .vp-doc h1 { font-size: 3rem; From e2ae70a109b4b5b65f9af4ad2694e0c260bd480c Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Thu, 18 Sep 2025 21:17:22 +0000 Subject: [PATCH 08/18] docs: add description to configuration.md h1 header - Add introductory paragraph explaining the configuration page content - Provides better context for users landing on the configuration page - Improves documentation structure and readability --- docs/configuration.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/configuration.md b/docs/configuration.md index cb71041760..f8ae4e7fbf 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -1,5 +1,7 @@ # Configuration +Learn how to configure mise for your project with `mise.toml` files, environment variables, and various configuration options to manage your development environment. + ## `mise.toml` `mise.toml` is the config file for mise. They can be at any of the following file paths (in order of precedence, top overrides configuration of lower paths): From dcafd876bfe2019cea28f3b1004b3d60aab9541d Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Thu, 18 Sep 2025 21:20:10 +0000 Subject: [PATCH 09/18] feat: update README with new logo and themed styling - Replace old logo with new terminal-themed SVG logo - Update badge colors to match theme (cyan, green, orange) - Add quick navigation links to key documentation sections - Improve visual hierarchy with better spacing - Bold tagline for emphasis - Add horizontal rule to separate header from content --- README.md | 45 +++++++++++++++------- docs/cli/lock.md | 12 +++--- docs/cli/mcp.md | 2 - docs/cli/plugins/ls-remote.md | 2 +- docs/cli/search.md | 2 +- docs/cli/settings.md | 1 - docs/cli/tasks/ls.md | 2 +- docs/cli/trust.md | 1 - docs/cli/unuse.md | 1 - docs/cli/use.md | 2 - docs/cli/watch.md | 72 +++++++++++++++++------------------ 11 files changed, 75 insertions(+), 67 deletions(-) diff --git a/README.md b/README.md index 0d810c3a1c..ddf33fc0ef 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,36 @@
-

- mise-logo
- mise-en-place -

- - - - -Crates.io -GitHub -GitHub Workflow Status -Discord -

The front-end to your dev env.

+ +

+ + mise + +

+ +

+ + mise-en-place + +

+ +

+ Crates.io + GitHub + GitHub Workflow Status + Discord +

+ +

The front-end to your dev env

+ +

+ Getting Started • + Documentation • + Dev Tools • + Environments • + Tasks +

+ +
+
## What is it? diff --git a/docs/cli/lock.md b/docs/cli/lock.md index a2eb82e5b7..d6b85fb524 100644 --- a/docs/cli/lock.md +++ b/docs/cli/lock.md @@ -40,9 +40,9 @@ Number of jobs to run in parallel [default: 4] Examples: - -$ mise lock Update lockfile in current directory for all platforms -$ mise lock node python Update only node and python -$ mise lock --platform linux-x64 Update only linux-x64 platform -$ mise lock --dry-run Show what would be updated or created -$ mise lock --force Re-download and update even if data exists + + $ mise lock Update lockfile in current directory for all platforms + $ mise lock node python Update only node and python + $ mise lock --platform linux-x64 Update only linux-x64 platform + $ mise lock --dry-run Show what would be updated or created + $ mise lock --force Re-download and update even if data exists diff --git a/docs/cli/mcp.md b/docs/cli/mcp.md index 0fe1471804..42ad71c9c0 100644 --- a/docs/cli/mcp.md +++ b/docs/cli/mcp.md @@ -9,14 +9,12 @@ This command starts an MCP server that exposes mise functionality to AI assistants over stdin/stdout using JSON-RPC protocol. The MCP server provides access to: - - Installed and available tools - Task definitions and execution - Environment variables - Configuration information Resources available: - - mise://tools - List all tools (use ?include_inactive=true to include inactive tools) - mise://tasks - List all tasks with their configurations - mise://env - List all environment variables diff --git a/docs/cli/plugins/ls-remote.md b/docs/cli/plugins/ls-remote.md index dbffbb0888..44bb27a18d 100644 --- a/docs/cli/plugins/ls-remote.md +++ b/docs/cli/plugins/ls-remote.md @@ -22,4 +22,4 @@ Show the git url for each plugin e.g.: `](/cli/settings/unset.md) Examples: - ``` # list all settings $ mise settings diff --git a/docs/cli/tasks/ls.md b/docs/cli/tasks/ls.md index f284e1640b..183ffdf099 100644 --- a/docs/cli/tasks/ls.md +++ b/docs/cli/tasks/ls.md @@ -8,7 +8,7 @@ These may be included from the config file or from the project's .mise/tasks dir mise will merge all tasks from all parent directories into this list. So if you have global tasks in `~/.config/mise/tasks/*` and project-specific tasks in -~/myproject/.mise/tasks/\*, then they'll both be available but the project-specific +~/myproject/.mise/tasks/*, then they'll both be available but the project-specific tasks will override the global ones if they have the same name. ## Flags diff --git a/docs/cli/trust.md b/docs/cli/trust.md index 5b86955881..f34b9095a6 100644 --- a/docs/cli/trust.md +++ b/docs/cli/trust.md @@ -9,7 +9,6 @@ This means mise will parse the file with potentially dangerous features enabled. This includes: - - environment variables - templates - `path:` plugin versions diff --git a/docs/cli/unuse.md b/docs/cli/unuse.md index 2351a6376c..0ba405c4f0 100644 --- a/docs/cli/unuse.md +++ b/docs/cli/unuse.md @@ -9,7 +9,6 @@ Removes installed tool versions from mise.toml By default, this will use the `mise.toml` file that has the tool defined. In the following order: - - If `--global` is set, it will use the global config file. - If `--path` is set, it will use the config file at the given path. - If `--env` is set, it will use `mise..toml`. diff --git a/docs/cli/use.md b/docs/cli/use.md index 49ff3ed052..4b2e2380c6 100644 --- a/docs/cli/use.md +++ b/docs/cli/use.md @@ -10,7 +10,6 @@ This will install the tool version if it is not already installed. By default, this will use a `mise.toml` file in the current directory. In the following order: - - If `--global` is set, it will use the global config file. - If `--path` is set, it will use the config file at the given path. - If `--env` is set, it will use `mise..toml`. @@ -89,7 +88,6 @@ Consider using mise.lock as a better alternative to pinning in mise.toml: Examples: - ``` # run with no arguments to use the interactive selector diff --git a/docs/cli/watch.md b/docs/cli/watch.md index df7e805559..37c4ebf077 100644 --- a/docs/cli/watch.md +++ b/docs/cli/watch.md @@ -170,12 +170,12 @@ or user ignore files, like '~/.gitignore' or '~/.config/watchexec/ignore'. Supported project ignore files: -- Git: .gitignore at project root and child directories, .git/info/exclude, and the file pointed to by `core.excludesFile` in .git/config. -- Mercurial: .hgignore at project root and child directories. -- Bazaar: .bzrignore at project root. -- Darcs: \_darcs/prefs/boring -- Fossil: .fossil-settings/ignore-glob -- Ripgrep/Watchexec/generic: .ignore at project root and child directories. + - Git: .gitignore at project root and child directories, .git/info/exclude, and the file pointed to by `core.excludesFile` in .git/config. + - Mercurial: .hgignore at project root and child directories. + - Bazaar: .bzrignore at project root. + - Darcs: _darcs/prefs/boring + - Fossil: .fossil-settings/ignore-glob + - Ripgrep/Watchexec/generic: .ignore at project root and child directories. VCS ignore files (Git, Mercurial, Bazaar, Darcs, Fossil) are only used if the corresponding VCS is discovered to be in use for the project/origin. For example, a .bzrignore in a Git @@ -191,10 +191,10 @@ This disables loading of global or user ignore files, like '~/.gitignore', Supported global ignore files -- Git (if core.excludesFile is set): the file at that path -- Git (otherwise): the first found of $XDG_CONFIG_HOME/git/ignore, %APPDATA%/.gitignore, %USERPROFILE%/.gitignore, $HOME/.config/git/ignore, $HOME/.gitignore. -- Bazaar: the first found of %APPDATA%/Bazzar/2.0/ignore, $HOME/.bazaar/ignore. -- Watchexec: the first found of $XDG_CONFIG_HOME/watchexec/ignore, %APPDATA%/watchexec/ignore, %USERPROFILE%/.watchexec/ignore, $HOME/.watchexec/ignore. + - Git (if core.excludesFile is set): the file at that path + - Git (otherwise): the first found of $XDG_CONFIG_HOME/git/ignore, %APPDATA%/.gitignore, %USERPROFILE%/.gitignore, $HOME/.config/git/ignore, $HOME/.gitignore. + - Bazaar: the first found of %APPDATA%/Bazzar/2.0/ignore, $HOME/.bazaar/ignore. + - Watchexec: the first found of $XDG_CONFIG_HOME/watchexec/ignore, %APPDATA%/watchexec/ignore, %USERPROFILE%/.watchexec/ignore, $HOME/.watchexec/ignore. Like for project files, Git and Bazaar global files will only be used for the corresponding VCS as used in the project. @@ -318,36 +318,33 @@ set of events Watchexec handles. Here's an example of a folder being created on ```json { ``` - "tags": [ -{ -"kind": "path", -"absolute": "/home/user/your/new-folder", -"filetype": "dir" -}, -{ -"kind": "fs", -"simple": "create", -"full": "Create(Folder)" -}, -{ -"kind": "source", -"source": "filesystem", -} + { + "kind": "path", + "absolute": "/home/user/your/new-folder", + "filetype": "dir" + }, + { + "kind": "fs", + "simple": "create", + "full": "Create(Folder)" + }, + { + "kind": "source", + "source": "filesystem", + } ], "metadata": { -"notify-backend": "inotify" + "notify-backend": "inotify" } - ``` } ``` The fields are as follows: -- `tags`, structured event data. -- `tags[].kind`, which can be: - + - `tags`, structured event data. + - `tags[].kind`, which can be: ``` * 'path', along with: + `absolute`, an absolute path. @@ -367,8 +364,7 @@ The fields are as follows: + `disposition`, the exit disposition ('success', 'error', 'signal', 'stop', 'exception', 'continued'). + `code`, the exit, signal, stop, or exception code. ``` - -- `metadata`, additional information about the event. + - `metadata`, additional information about the event. The 'json-stdio' mode will emit JSON events to the standard input of the command, one per line, then close stdin. The 'json-file' mode will create a temporary file, write the @@ -381,12 +377,12 @@ with the paths of the affected files, for filesystem events: $WATCHEXEC_COMMON_PATH is set to the longest common path of all of the below variables, and so should be prepended to each path to obtain the full/real path. Then: -- $WATCHEXEC_CREATED_PATH is set when files/folders were created -- $WATCHEXEC_REMOVED_PATH is set when files/folders were removed -- $WATCHEXEC_RENAMED_PATH is set when files/folders were renamed -- $WATCHEXEC_WRITTEN_PATH is set when files/folders were modified -- $WATCHEXEC_META_CHANGED_PATH is set when files/folders' metadata were modified -- $WATCHEXEC_OTHERWISE_CHANGED_PATH is set for every other kind of pathed event + - $WATCHEXEC_CREATED_PATH is set when files/folders were created + - $WATCHEXEC_REMOVED_PATH is set when files/folders were removed + - $WATCHEXEC_RENAMED_PATH is set when files/folders were renamed + - $WATCHEXEC_WRITTEN_PATH is set when files/folders were modified + - $WATCHEXEC_META_CHANGED_PATH is set when files/folders' metadata were modified + - $WATCHEXEC_OTHERWISE_CHANGED_PATH is set for every other kind of pathed event Multiple paths are separated by the system path separator, ';' on Windows and ':' on unix. Within each variable, paths are deduplicated and sorted in binary order (i.e. neither From 4d401c3e3ffaba4d17a16f33d3bb5c4789625a3b Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Thu, 18 Sep 2025 21:21:00 +0000 Subject: [PATCH 10/18] fix(docs): revert search button font to default - Remove Bebas Neue from search button placeholder text - Search button now uses default Inter font for better readability - Keep Bebas Neue for navigation items and other UI elements --- docs/.vitepress/theme/custom.css | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css index 6fb925de1a..e57f2d7c8f 100644 --- a/docs/.vitepress/theme/custom.css +++ b/docs/.vitepress/theme/custom.css @@ -196,9 +196,7 @@ h1, .VPNavBarTitle .title, .VPNavBarMenu .VPNavBarMenuLink, .VPNavBarMenuGroup .text, -.VPDocOutlineTitle, -.DocSearch-Button .DocSearch-Button-Placeholder, -.VPLocalSearchBox button .vpi-search-box { +.VPDocOutlineTitle { font-family: "Bebas Neue", var(--vp-font-family-base) !important; letter-spacing: 0.03em; } @@ -216,12 +214,6 @@ h1, text-transform: uppercase; } -/* Search button text */ -.DocSearch-Button .DocSearch-Button-Placeholder { - font-size: 1rem; - letter-spacing: 0.04em; -} - /* Adjust h1 size for Bebas Neue's tall characters */ .vp-doc h1 { font-size: 3rem; From d3953ef25ee57626f736ae8a9106893e2300cb77 Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Thu, 18 Sep 2025 21:21:10 +0000 Subject: [PATCH 11/18] feat(docs): hide search button text, show icon only - Remove 'Search' placeholder text from search button - Keep magnifying glass icon for cleaner navigation bar - Reduces visual clutter in the header --- docs/.vitepress/theme/custom.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css index e57f2d7c8f..bcf119487b 100644 --- a/docs/.vitepress/theme/custom.css +++ b/docs/.vitepress/theme/custom.css @@ -214,6 +214,11 @@ h1, text-transform: uppercase; } +/* Hide search button text, keep icon only */ +.DocSearch-Button .DocSearch-Button-Placeholder { + display: none; +} + /* Adjust h1 size for Bebas Neue's tall characters */ .vp-doc h1 { font-size: 3rem; From 75ca41882d01239d037a7493a2912c5a9ccc5e51 Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Thu, 18 Sep 2025 21:21:31 +0000 Subject: [PATCH 12/18] fix(docs): restore search button width - Add minimum width of 64px to search button - Prevents button from being too narrow when text is hidden - Maintains clickable area for better UX --- docs/.vitepress/theme/custom.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css index bcf119487b..8ff8bc320a 100644 --- a/docs/.vitepress/theme/custom.css +++ b/docs/.vitepress/theme/custom.css @@ -219,6 +219,11 @@ h1, display: none; } +/* Maintain search button width without text */ +.DocSearch-Button { + min-width: 64px !important; +} + /* Adjust h1 size for Bebas Neue's tall characters */ .vp-doc h1 { font-size: 3rem; From 941266549b01f77a1c15e78007a466af1ab8de3b Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Thu, 18 Sep 2025 21:21:51 +0000 Subject: [PATCH 13/18] fix(docs): increase search button width to 200px - Set minimum width to 200px for better visibility and usability - Add horizontal padding for better spacing - Makes search button more prominent in navigation --- docs/.vitepress/theme/custom.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css index 8ff8bc320a..a85281e2f1 100644 --- a/docs/.vitepress/theme/custom.css +++ b/docs/.vitepress/theme/custom.css @@ -221,7 +221,8 @@ h1, /* Maintain search button width without text */ .DocSearch-Button { - min-width: 64px !important; + min-width: 200px !important; + padding: 0 16px !important; } /* Adjust h1 size for Bebas Neue's tall characters */ From 8f7dc1fba797af1fb5ccf9f799f06d5b57a03077 Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Thu, 18 Sep 2025 21:22:33 +0000 Subject: [PATCH 14/18] fix(docs): use visibility hidden for search text instead of display none - Change from display:none to visibility:hidden for search placeholder - Preserves original button size and layout - Keeps Command+K shortcut indicator in correct position - Maintains all original spacing without custom width overrides --- docs/.vitepress/theme/custom.css | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css index a85281e2f1..9006095174 100644 --- a/docs/.vitepress/theme/custom.css +++ b/docs/.vitepress/theme/custom.css @@ -214,15 +214,9 @@ h1, text-transform: uppercase; } -/* Hide search button text, keep icon only */ +/* Make search button text invisible but maintain layout */ .DocSearch-Button .DocSearch-Button-Placeholder { - display: none; -} - -/* Maintain search button width without text */ -.DocSearch-Button { - min-width: 200px !important; - padding: 0 16px !important; + visibility: hidden; } /* Adjust h1 size for Bebas Neue's tall characters */ From 103811cdc3a8769aba09cc2c8a2be366ce7516ba Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Thu, 18 Sep 2025 21:24:21 +0000 Subject: [PATCH 15/18] fix(docs): correct markdown code block syntax with 3 backticks - Fix incorrect 4-backtick code blocks in plugin-publishing.md - Change all instances to proper 3-backtick syntax - Ensures markdown renders correctly --- docs/plugin-publishing.md | 8 +++----- docs/plugin-usage.md | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/docs/plugin-publishing.md b/docs/plugin-publishing.md index a50e690c6f..a40bfd34d7 100644 --- a/docs/plugin-publishing.md +++ b/docs/plugin-publishing.md @@ -252,7 +252,7 @@ Create a GitHub release for better discoverability: ### 4. Release Notes Template -````markdown +```markdown ## Changes in v1.2.3 ### Added @@ -275,9 +275,7 @@ Create a GitHub release for better discoverability: ```bash mise plugin install my-plugin https://github.com/username/my-plugin ``` -```` - -```` +``` ## Distribution Methods @@ -294,7 +292,7 @@ mise plugin install my-plugin https://github.com/username/my-plugin@v1.2.3 # Install from other Git providers mise plugin install my-plugin https://gitlab.com/username/my-plugin -```` +``` ### 2. Private Repository Access diff --git a/docs/plugin-usage.md b/docs/plugin-usage.md index 86e127b112..1bb4c50a12 100644 --- a/docs/plugin-usage.md +++ b/docs/plugin-usage.md @@ -195,7 +195,7 @@ When using plugins, be aware that: - **Only install plugins from trusted sources** - **Review plugin code** before installation when possible - **Use version pinning** to avoid unexpected updates like [`mise.lock`](/dev-tools/mise-lock.md) - ::: +::: ## Troubleshooting From 1dcde809770dc8476d4985dde43c5c3733a00ec4 Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Thu, 18 Sep 2025 21:26:05 +0000 Subject: [PATCH 16/18] feat(readme): increase logo size and reduce spacing - Increase logo size from 120px to 256px for better visibility - Combine logo and title in single h1 element for tighter spacing - Remove extra spacing between logo and mise-en-place text - Creates more impactful visual header for the README --- README.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index ddf33fc0ef..ef8c06ed30 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,9 @@
-

- - mise - -

- -

+

+ mise +
mise-en-place

From e939a5dbbf126e63838e89edd7f9bc2ee2d1e109 Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Thu, 18 Sep 2025 21:27:53 +0000 Subject: [PATCH 17/18] fix(logo): adjust SVG viewBox to remove excess padding - Change viewBox from '0 0 120 120' to '15 25 90 70' - Crops out empty space around the terminal window - Makes logo appear larger and reduces visual padding - Better alignment with text in README --- docs/public/logo.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/public/logo.svg b/docs/public/logo.svg index a77ca38e21..6e7497d11f 100644 --- a/docs/public/logo.svg +++ b/docs/public/logo.svg @@ -1,4 +1,4 @@ - + From 0aba8fc33002e7b09eb931955acb50514ea0f8c2 Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Thu, 18 Sep 2025 21:30:00 +0000 Subject: [PATCH 18/18] fix(logo): correct terminal header width and improve spacing - Adjust header bar to fit within window stroke boundaries (77px width) - Move prompt up from y=68 to y=64 for better spacing - Increase gap between underscore and command lines below - Move command lines down by 2px for better visual separation - Header bar now properly aligned with terminal window --- docs/public/logo.svg | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/docs/public/logo.svg b/docs/public/logo.svg index 6e7497d11f..0268daf185 100644 --- a/docs/public/logo.svg +++ b/docs/public/logo.svg @@ -13,10 +13,8 @@ stroke="url(#borderGradient)" stroke-width="3"/> - - - + @@ -24,8 +22,8 @@ - - + - - - - - + + + + + \ No newline at end of file