plugins/workflow/skills/mise/SKILL.md
Dev-tool and runtime version management with mise — the modern replacement for nvm, pyenv, goenv, rbenv, and asdf. Use when setting up a new repo, pinning Node/Python/Go/Rust/Bun versions, configuring per-project tool versions via .mise.toml or .tool-versions, wiring direnv-style env loading, debugging "wrong version active" errors, or migrating off legacy version managers. Covers mise.toml schema, env hooks, task definitions, and integration with just and CI.
npx skillsauth add rbergman/dark-matter-marketplace miseInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Mise is a polyglot version manager that replaces nvm, pyenv, rbenv, and most Homebrew CLI tools with a single, fast, declarative system.
Related skills:
| Problem | Old Way | Mise Way |
|---------|---------|----------|
| Node versions | nvm, fnm, volta | mise use node@22 |
| Python versions | pyenv, conda | mise use [email protected] |
| Go versions | goenv, manual | mise use [email protected] |
| CLI tools | Homebrew | mise use jq ripgrep bat |
| Per-project versions | .nvmrc + .python-version + ... | Single .mise.toml |
Benefits:
mise registry | wc -l)curl https://mise.run | sh
Add to your shell rc file. If using both mise and direnv (recommended), load mise first:
# ~/.zshrc - recommended order
eval "$(mise activate zsh)"
eval "$(direnv hook zsh)"
# fish: ~/.config/fish/config.fish
mise activate fish | source
direnv hook fish | source
For faster startup, use shims instead of (or with) activation:
# zsh: add to ~/.zshrc
export PATH="$HOME/.local/share/mise/shims:$PATH"
eval "$(mise activate zsh)"
eval "$(direnv hook zsh)"
# fish: add to ~/.config/fish/config.fish
fish_add_path -p ~/.local/share/mise/shims
mise activate fish | source
direnv hook fish | source
mise use node@22 [email protected] go@latest # Current directory
mise use -g jq ripgrep bat # Global (all directories)
# Pin language versions
mise use node@22 [email protected]
# Creates .mise.toml - commit it
git add .mise.toml
mise trust # Allow repo's .mise.toml
mise install # Install pinned tools
.mise.toml[tools]
node = "22"
go = "1.25"
python = "3.12"
# Project-specific tools
just = "latest"
sqlc = "latest"
Mise merges configs from multiple levels:
~/.config/mise/config.toml # Global defaults
└── ~/projects/.mise.toml # Workspace defaults
└── ~/projects/foo/.mise.toml # Project-specific
More specific configs override less specific ones.
~/.config/mise/config.toml)Your daily-driver tools:
[tools]
# Languages
node = "lts"
python = "3.12"
go = "latest"
# CLI tools (replaces Homebrew)
jq = "latest"
yq = "latest"
ripgrep = "latest"
fd = "latest"
bat = "latest"
eza = "latest"
delta = "latest"
fzf = "latest"
gh = "latest"
lazygit = "latest"
just = "latest"
direnv = "latest"
starship = "latest"
[settings]
auto_install = true
Direnv handles per-directory environment variables. Combined with mise:
Best Practice: Keep a single source of truth:
.mise.toml→ tool versions only (node, go, python).envrc→ environment variables (DATABASE_URL, API_KEY, etc.)Don't use
[env]section in.mise.toml- it creates confusion about where vars come from.
Install direnv via mise:
mise use -g direnv
Add direnv hook to shell rc:
# zsh
eval "$(direnv hook zsh)"
# fish
direnv hook fish | source
Create .envrc in your project:
# Load mise tools for this directory
if command -v mise &> /dev/null; then
eval "$(mise hook-env -s bash)"
fi
# Project-specific environment
export DATABASE_URL="postgres://localhost/myapp"
export LOG_LEVEL="debug"
Allow the envrc:
direnv allow
Tip: Use .envrc.example (committed) + .envrc (gitignored with secrets).
just and mise complement each other:
See the just-pro skill for full patterns. Quick summary:
# Every recipe runs through mise automatically
set shell := ["mise", "exec", "--", "bash", "-c"]
build:
npm run build
test:
go test ./...
_exec cmd:
#!/usr/bin/env bash
if command -v mise &>/dev/null; then
mise exec -- {{cmd}}
else
{{cmd}}
fi
build: (_exec "npm run build")
setup:
#!/usr/bin/env bash
mise trust && mise install
# Create .envrc from example if missing
if [[ ! -f .envrc ]] && [[ -f .envrc.example ]]; then
cp .envrc.example .envrc
echo "Created .envrc from example - edit with your values"
direnv allow
fi
echo "Toolchain ready"
| Aspect | Mise + Direnv | Devcontainer |
|--------|---------------|--------------|
| Isolation | Shared host filesystem | Full container isolation |
| Speed | Native performance | Container overhead |
| Setup time | Seconds (mise install) | Minutes (image build) |
| Works offline | After first install | After first build |
| IDE support | Any editor, native | VS Code / JetBrains |
| Team adoption | Low friction | Requires Docker knowledge |
| CI parity | Good (mise in CI) | Excellent (same container) |
Recommendation: Use mise for fast local dev. Add devcontainer for hermetic reproducibility if needed. They're not mutually exclusive.
mise doctor # Check activation status
Ensure mise activates after other PATH modifications in shell rc.
~/.local/share/mise/shims): Wrapper scripts, always workUse both for reliability:
# Shims first (fallback), then activate (dynamic)
export PATH="$HOME/.local/share/mise/shims:$PATH"
eval "$(mise activate zsh)"
Use mise hook-env -s bash in .envrc, not mise activate:
eval "$(mise hook-env -s bash)" # Correct
eval "$(mise activate bash)" # Wrong - generates shell hooks
# Install tools
mise use node@22 # Current directory
mise use -g ripgrep # Global
# Manage versions
mise ls # List installed
mise ls-remote node # Available versions
mise outdated # Check for updates
# Project setup
mise install # Install from .mise.toml
mise trust # Trust current directory's config
# Maintenance
mise prune # Remove unused versions
mise reshim # Rebuild shims
mise self-update # Update mise itself
development
Initialize a new repository with standard scaffolding - git, gitignore, AGENTS.md, justfile, mise, beads, and timbers. Use when starting a new project or setting up an existing repo for Claude Code workflows.
data-ai
Activate at session start when using Agent Teams for complex multi-agent work. Establishes team lead role with delegation protocols, teammate spawning, model selection, and beads integration. You coordinate the team; teammates implement.
data-ai
Use when creating a worktree, setting up a worktree, starting feature work that needs isolation, or before executing implementation plans. Covers git worktree creation under .worktrees/, gitignore setup, beads integration, and merge guardrails.
data-ai
Activate when you are a delegated subagent (not the orchestrator). Establishes subagent protocol with terse returns, details to history/, file ownership boundaries, and escalation rules. You implement; orchestrator reviews and commits.