Context
mise.toml pins node, pnpm and gitleaks. Other CLIs the repository calls (infisical for .infisical.yaml, encore,
maestro for mobile flows, uv for spec-kit) are installed however each contributor likes. CI installs tools in ad-hoc steps:
.github/workflows/ci.yml had no gitleaks, so the secrets scan failed with exit 127 until commit ff3357f added a
curl | tar step, which now duplicates the version pinned in mise.toml. Two places pin the same tool, and they will drift.
Decision
- Every CLI that a contributor or CI calls is pinned in
mise.toml. Today that adds:infisical(at least the first version that reads.infisical.yaml),maestro,encoreanduv. A new CLI is added tomise.tomlin the change that first calls it. - CI installs tools through mise (
jdx/mise-action, SHA-pinned per 0019), not through per-tool steps. The gitleakscurlstep is removed when this lands. - Homebrew-only installs are not supported for repository tooling. A contributor may have a tool from Homebrew; the repository relies only on the mise pin.
- npm-distributed CLIs stay in catalogs (turbo, oxlint, changesets and the rest); mise covers what pnpm does not install.
Consequences
mise installis the one setup step for tools; onboarding docs say so.- A version bump is one line, and
turbo.jsoncalready listsmise.tomlinglobalDependencies, so a bump invalidates the cache. - Some CLIs (maestro, encore) may need a mise backend other than the core registry; the pin records which.
Enforcement
Planned — the CI workflow usesjdx/mise-action; optionally, a validate-repository.mjs check that every executable named
in package.json scripts and workflow run: lines is either a workspace dependency or a mise.toml tool. Nothing checks this today.
Supersedes and sources
Supersedes: none. Sources: owner decision in chat, 2026-10-19; commitff3357f (gitleaks exit 127); mise.toml.