Wiedii — Política de Gestión de Herramientas con mise
⚠️ Verificar versiones antes de usar — los números de versión de herramientas en esta nota pueden estar desactualizados. Usar
mise ls-remote <herramienta> | tail -5para consultar las versiones disponibles. Ver politicas-core.
mise es el gestor centralizado de herramientas. Toda herramienta binaria disponible en el registro de mise debe instalarse via mise. Los entornos deben ser 100% reproducibles: versiones exactas fijadas y lockfiles mise.lock son obligatorios.
1. Orden de prioridad de backends
Obligatorio: antes de agregar o actualizar cualquier herramienta en
mise.toml, abrir https://mise-versions.jdx.dev/ y confirmar qué backends la soportan y qué versiones están disponibles. Nunca asumir un backend — siempre verificar.
Core tools (runtimes del lenguaje) — node, bun, python, go, ruby, rust, deno, java, swift, zig, elixir, erlang — se escriben con su nombre corto, SIN prefijo (node = "24.1.0", no "core:node"). El prefijo core: es redundante; no es una "opción", es donde viven los runtimes.
Resto de herramientas (CLIs/binarios) — prioridad de backend, con prefijo OBLIGATORIO:
| Prioridad | Backend | Cuándo usarlo |
|---|---|---|
| 1º | aqua: | Preferido siempre. Registro curado de mise con checksums verificados. |
| 2º | npm: | CLI del ecosistema JS que NO va en package.json. |
| 3º | pipx: | CLI de Python que NO va en pyproject.toml. |
| 4º | cargo: | CLI de Rust no disponible en aqua. |
| 5º | asdf: | Último recurso — plugins heredados. |
Otros backends (
vfox:,go:,gem:,ubi:,dotnet:…) solo si la herramienta únicamente existe ahí.
Regla del gestor nativo: si la herramienta pertenece al ecosistema del lenguaje del proyecto (prettier/eslint → package.json, ruff/mypy → pyproject.toml), va en su gestor nativo, NO en mise. Excepción: las CLIs de Go siempre van en mise.toml (go.mod solo registra librerías importadas, no ejecutables).
2. Valores de versión prohibidos
latest y lts están prohibidos. Todas las versiones deben ser exactas: "X.Y.Z".
# ❌ Prohibido
bun = "latest"
# ✅ Requerido
bun = "1.3.14"
Nota sobre
bun: es un core tool nativo de mise —bun = "x.y.z"es equivalente a"core:bun" = "x.y.z". El registro de mise mapea automáticamente el alias corto. La forma sin prefijo es la canónica según los docs oficiales de mise.
3. Config global del sistema (~/.config/mise/config.toml)
El config global debe forzar el determinismo. El bloque de abajo es la plantilla base mínima — cada developer la extiende con las herramientas globales que necesite, respetando las reglas de esta sección:
[settings]
experimental = true # necesario para los [hooks] (postinstall) — NO para el lockfile
lockfile = true # habilita lectura/escritura de mise.lock (NO lo crea: usar `mise lock`)
all_compile = false # evita instalaciones implícitas por compilación
[tools]
# Herramientas globales gestionadas por mise (versiones exactas, backends explícitos).
# IMPORTANTE: las herramientas que Homebrew ya gestiona NO van aquí — evitar duplicados.
# Ejemplos: git, git-flow-next, glab → Homebrew. bun, node → mise (versiones por proyecto).
node = "24.13.0" # core tool → nombre corto, sin prefijo
bun = "1.3.14" # core tool → nombre corto, sin prefijo
4. Template estándar de mise.toml por proyecto
Cada proyecto debe tener un mise.toml en la raíz con:
- Prefijos de backend explícitos
- Versiones exactas fijadas
- Bloque
[env]para variables de entorno del proyecto [hooks]para instalar lefthook automáticamente trasmise install[tasks.setup]para onboarding reproducible
[tools]
bun = "1.3.14"
"aqua:evilmartians/lefthook" = "2.1.3"
# git-flow-next es GLOBAL — no agregar aquí; ver ~/.config/mise/config.toml
"aqua:tamasfe/taplo" = "0.9.3"
"aqua:hadolint/hadolint" = "2.12.0"
"aqua:mvdan/sh" = "3.9.0" # shfmt
"aqua:koalaman/shellcheck" = "0.10.0"
# Agregar según stack:
# "aqua:astral-sh/ruff" = "0.4.5" # Python
# "cargo:mypy" = "1.10.0" # tipos estáticos Python
# "aqua:golangci/golangci-lint" = "1.59.0" # Go
# "aqua:aquasecurity/trivy" = "0.52.0" # escaneo de seguridad
# "aqua:snyk/snyk" = "1.1295.0" # seguridad de dependencias
[env]
# variables de entorno a nivel de proyecto
# NODE_ENV = "development"
[hooks]
# postinstall es un hook experimental de mise — no requiere mise activate
# CI=true lo setean GitLab CI, GitHub Actions y la mayoría de sistemas CI
# En local $CI está vacío → lefthook install corre normalmente
postinstall = "[ -z \"$CI\" ] && lefthook install || true"
[tasks.setup]
description = "Setup completo: herramientas, lock, hooks y dependencias"
# ⚠️ Una sola cadena con && (NO array): el hook `toml` con reorder_arrays=true reordenaría
# alfabéticamente los pasos al commitear y rompería el orden de ejecución. Ver [mise](../herramientas/mise.md) y [wiedii-configs](../herramientas/wiedii-configs.md).
run = "mise trust && mise install --yes && mise lock && pkg=$(find . -maxdepth 2 -name 'package.json' ! -path '*/node_modules/*' | head -1) && { [ -n \"$pkg\" ] && bun install --cwd \"$(dirname \"$pkg\")\" || true; }"
5. Requisito de lockfile
Verificar antes de fijar: antes de commitear cualquier versión en
mise.toml, confirmar que la versión existe para el backend elegido en https://mise-versions.jdx.dev/.
⚠️ El lockfile NO se crea solo.
lockfile = truesolo le dice a mise que lea y escribamise.lock: mantiene actualizado un archivo que ya exista, pero NO lo genera. Hay que crearlo una vez conmise locky commitearlo. (El settingexperimentalno tiene que ver con el lock — es para los[hooks].)
Al crear el repo (una vez): generar el lock y commitearlo.
mise lock # crea mise.lock para la plataforma actual
# Reproducibilidad mac (dev) + linux (CI/Docker): fijar ambas plataformas
mise lock --platform macos-arm64,linux-x64
git add mise.toml mise.lock
Después, el lock se mantiene solo en cada cambio de herramienta:
mise use aqua:tool/name@x.y.z # cambia mise.toml y actualiza mise.lock
mise install # instala y actualiza mise.lock (si ya existe)
mise upgrade # sube versiones dentro del rango + actualiza el lock
git add mise.toml mise.lock
mise install y mise use solo actualizan un mise.lock existente; no lo crean. Por eso el mise lock inicial es obligatorio. El mise run setup de Wiedii ya incluye mise lock para que el archivo nunca falte.
6. Comandos de auditoría y limpieza
mise ls # listar herramientas instaladas y su backend
mise outdated # identificar herramientas con actualizaciones disponibles vs. versión fijada
mise prune # eliminar binarios huérfanos que no están en el lockfile
7. Resolución de conflictos (mise.toml vs mise.lock)
- Cambio solicitado por el usuario: actualizar
mise.toml, luego regenerar conmise install. - Sin instrucción de cambio: respetar
mise.lock— no modificar el entorno. - Siempre reportar si se usó un backend de menor prioridad cuando uno de mayor prioridad estaba disponible.
8. Reglas de invocación de herramientas
| Tipo de herramienta | Cómo invocar | Ejemplo |
|---|---|---|
| Binarios gestionados por mise | mise exec -- <tool> | mise exec -- taplo fmt file.toml |
| Paquetes instalados por bun | bun <package> | bun eslint src/ |
| Paquetes puntuales (no instalados) | bunx | bunx --yes some-package |
Nunca usar bunx para paquetes instalados en node_modules.
9. Scripts requeridos en package.json
{
"type": "module",
"scripts": {
"commit": "bun --bun czg"
},
"devDependencies": {
"@commitlint/cli": "21.0.1",
"@commitlint/config-conventional": "21.0.1",
"cz-git": "1.13.1",
"czg": "1.13.1"
},
"engines": {
"bun": "1.3.14",
"node": "Please use Bun instead of Node to install dependencies",
"npm": "Please use Bun instead of NPM to install dependencies",
"pnpm": "Please use Bun instead of PNPM to install dependencies",
"yarn": "Please use Bun instead of Yarn to install dependencies"
}
}
"type": "module"— todos los repos nuevos en Wiedii usan ESM. Las configs JS (commitlint.config.js,changelog.config.js) usanimport/export default. ⚠️ Excepción monorepo Nx: elpackage.jsonde la RAÍZ de un workspace Nx NO debe llevar"type": "module"(rompe los generators/migraciones de Nx). En ese caso, dejar la raíz sintype, declarar"type": "module"solo en cadapackages/*, y usar extensión.mjs/.cjsexplícita para las configs de la raíz. Ver nx-monorepo."commit": "bun --bun czg"—bun commitabre el wizard de commits semánticos.bun --bunfuerza el runtime de Bun (más rápido).czges el binario que instala czg.cz-gitse agrega como dep directa porquecommitlint.config.jsla importa explícitamente (import { defineConfig } from 'cz-git').commitizenno se usa — solobun commit→czg.engines— patrón Wiedii: mensajes de error en los campos de versión hacen explícito que solo se usa Bun.lefthook installno va enpackage.json— se gestiona exclusivamente via[hooks].postinstallenmise.toml. Esto garantiza que los hooks se instalan en cualquier proyecto, sea Node o no, y nunca en CI.
10. Herramientas que son SIEMPRE globales (no agregar al mise.toml del proyecto)
Estas herramientas nunca van en el mise.toml de un proyecto individual porque son transversales a todos los repos o las gestiona Homebrew:
| Herramienta | Gestor | Motivo |
|---|---|---|
git | Homebrew | Herramienta base del sistema |
git-flow-next | Homebrew | Branching cross-proyecto — brew install git-flow-next |
glab | Homebrew | CLI de GitLab — brew install glab |
docker / docker compose | OrbStack (Homebrew) | Runtime de contenedores |
mise | Homebrew | No puede gestionarse a sí mismo |
CLIs de IA (claude, claude-code) | Homebrew | Herramientas de desarrollo global |
Regla: si una herramienta ya está en Homebrew y se usa en todos los proyectos, no duplicarla en mise. Si mise es el gestor correcto (versiones por proyecto, como bun o node), entonces sí va en el config global de mise — pero nunca en el mise.toml del proyecto individual.
11. Setup inicial tras clonar
mise run setup
# Equivale a:
# mise trust
# mise install --yes → instala herramientas + ejecuta lefthook install (si no es CI)
# mise lock → crea/actualiza mise.lock (commitearlo al repo)
# bun install → solo si existe package.json
lefthook install se ejecuta una sola vez, via [hooks].postinstall de mise, después de mise install --yes. No se ejecuta en entornos CI ($CI=true). No depende de que el proyecto use Node.
Referencias
- mise — guía completa de la herramienta con bondades y comandos
- gestion-herramientas-brew-mise — arquitectura de 3 niveles brew + mise