Configure and operate Mise for deterministic developer environments. Use when installing runtime/tool versions, defining reusable tasks, managing layered environment variables, migrating from asdf/nvm/pyenv, or debugging mise.toml behavior in CI and local shells. Keywords: mise, mise.toml, tool versions, tasks, env, asdf migration, setup automation, dev environment.
Overall
score
99%
Does it follow best practices?
Validation for skill structure
❌ NEVER do this:
# mise.toml (committed to git)
[env]
API_SECRET = "sk_live_abc123xyz"
DATABASE_PASSWORD = "super_secret_password"
JWT_SECRET = "my-secret-key"
AWS_SECRET_ACCESS_KEY = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"✅ Instead:
# mise.toml (committed)
[env]
_.file = [".env", ".env.secrets"]
# .env.secrets (git-ignored)
API_SECRET=sk_live_abc123xyz
DATABASE_PASSWORD=super_secret_password
JWT_SECRET=my-secret-key
AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
# .gitignore
.env.secrets
mise.local.toml❌ Don't:
[env]
PROJECT_DIR = "/Users/john/projects/myapp"
DATA_DIR = "/Users/john/projects/myapp/data"
LOG_FILE = "/Users/john/projects/myapp/logs/app.log"✅ Do:
[env]
PROJECT_DIR = "{{ config_root }}"
DATA_DIR = "{{ config_root }}/data"
LOG_FILE = "{{ config_root }}/logs/app.log"❌ Don't repeat in every project:
# project-1/mise.toml
[env]
EDITOR = "code"
BROWSER = "firefox"
GIT_EDITOR = "code --wait"
# project-2/mise.toml
[env]
EDITOR = "code"
BROWSER = "firefox"
GIT_EDITOR = "code --wait"✅ Use global config:
# ~/.config/mise/config.toml
[env]
EDITOR = "code"
BROWSER = "firefox"
GIT_EDITOR = "code --wait"❌ Don't mix tools:
# .bashrc
eval "$(mise activate bash)"
eval "$(nvm load)"
eval "$(pyenv init -)"
eval "$(rbenv init -)"✅ Use Mise exclusively:
# .bashrc
eval "$(mise activate bash)"
# mise.toml
[tools]
node = "20"
python = "3.11"
ruby = "3.2"❌ Don't:
[tasks.ci]
run = "npm run lint; npm test; npm run build"
# If lint fails, test and build still run✅ Do:
[tasks.ci]
run = [
"npm run lint",
"npm test",
"npm run build"
]
# Stops on first failure❌ Don't:
[tasks.deploy-dev]
run = "deploy.sh --env development"
[tasks.deploy-staging]
run = "deploy.sh --env staging"
[tasks.deploy-prod]
run = "deploy.sh --env production"✅ Do:
[env]
ENVIRONMENT = "development"
[tasks.deploy]
run = "deploy.sh --env {{ env.ENVIRONMENT }}"❌ Don't:
[tasks.test-api]
run = "cd packages/api && npm test"
[tasks.test-web]
run = "cd packages/web && npm test"✅ Do:
# Root mise.toml
[tasks.test-all]
run = '''
for pkg in packages/*; do
mise run -C "$pkg" test
done
'''
# packages/*/mise.toml
[tasks.test]
run = "npm test"❌ Don't install everything:
[tools]
node = "20"
python = "3.11"
ruby = "3.2"
go = "1.21"
rust = "stable"
java = "17"
php = "8.2"
dotnet = "8"✅ Install only what you need:
[tools]
node = "20"❌ Don't:
[tasks.x]
run = "./scripts/complex-task.sh"✅ Do:
[tasks.deploy]
description = "Deploy application to production"
run = "./scripts/deploy.sh"❌ Don't:
[tasks.build]
run = "npm run build"
[env]
NODE_ENV = "development"
[tools]
node = "20"✅ Do:
[tools]
node = "20"
[env]
NODE_ENV = "development"
[tasks.build]
run = "npm run build"# Check for secrets
grep -i "secret\|password\|key" mise.toml
# Check for hardcoded paths
grep "/Users\|/home" mise.toml
# Validate configuration
mise doctormise doctor#!/usr/bin/env bash
# .git/hooks/pre-commit
if git diff --cached mise.toml | grep -iE "secret|password|key.*="; then
echo "ERROR: Possible secret in mise.toml"
exit 1
fi