name: sayt-cli description: > How to write .mise.toml files with correct tool versions, settings, and platform stubs. Use when setting up project toolchains, fixing missing tools, or configuring sayt setup/doctor. user-invocable: false
setup / doctor — Tool Management with mise
sayt setup installs project toolchains. sayt doctor verifies each environment tier is ready.
How It Works
sayt setuplooks for.mise.tomlin the current directory- Runs
mise trust -y -a -qto trust the config - Runs
mise installto install all specified tools - Preloads vscode-task-runner (
vtr) into the uvx cache for offline use - If
.sayt.nuexists, recursively calls it withsetupfor custom logic
sayt doctor checks which environment tiers have their required tools available:
| Tier | Tools checked |
|---|---|
| pkg | mise (or scoop on Windows) |
| cli | cue, gomplate |
| ide | vtr (vscode-task-runner) |
| cnt | docker |
| k8s | kind, skaffold |
| cld | gcloud |
| xpl | crossplane |
.mise.toml File Format
mise uses TOML configuration to specify tool versions per project.
Structure
[settings]
locked = true # Use lockfile for reproducible installs
lockfile = true # Generate/use mise.lock
experimental = true # Enable experimental features
paranoid = false # Disable paranoid mode
[tools]
# Standard registry tools
node = "22.14.0"
go = "1.22"
java = "openjdk-21.0"
python = "3.12"
# GitHub-hosted tools (not in default registry)
"github:pnpm/pnpm" = "9.15.2"
"github:sqlc-dev/sqlc" = "1.28.0"
"github:bufbuild/buf" = "1.32.1"
Settings Reference
[settings]
locked = true # Require lockfile to exist
lockfile = true # Create/update mise.lock
experimental = true # Needed for some plugin features
paranoid = false # Don't verify checksums aggressively
github.slsa = false # Skip SLSA provenance verification
github.github_attestations = false # Skip GitHub attestations
aqua.github_attestations = false # Skip aqua GitHub attestations
aqua.cosign = false # Skip cosign verification
aqua.slsa = false # Skip aqua SLSA verification
aqua.minisign = false # Skip minisign verification
These security settings are commonly disabled during development for speed. Enable them in CI/production.
Common Tool Specs
Node.js project:
[tools]
node = "22.14.0"
"github:pnpm/pnpm" = "9.15.2"
Go project:
[tools]
go = "1.22"
"github:sqlc-dev/sqlc" = "1.28.0"
"github:gotestyourself/gotestsum" = "1.12.0"
JVM project:
[tools]
java = "openjdk-21.0"
Python project:
[tools]
python = "3.12"
Multi-language project:
[tools]
node = "22.14.0"
go = "1.22"
"github:bufbuild/buf" = "1.32.1"
Platform-Specific Stubs
sayt uses mise "tool stubs" for tools like CUE, Docker, and uvx. These have platform-specific TOML configs:
cue.toml— Standard CUE stubcue.musl.toml— Alpine/musl Linux variantdocker.toml/docker.musl.toml— Docker stubuvx.toml/uvx.musl.toml— Python uvx stubnu.toml/nu.musl.toml— Nushell stub
The musl variant is automatically selected when running on musl-based Linux (e.g., Alpine containers).
Custom Setup Logic via .sayt.nu
If your project needs setup beyond what mise provides, create .sayt.nu:
# .sayt.nu — Custom setup hooks
def "main setup" [] {
# Example: install Nix packages
nix-env -iA nixpkgs.myTool
# Example: run database migrations
sqlc generate
}
sayt automatically detects and runs .sayt.nu setup after the mise-based setup completes.
Writing Good .mise.toml Files
- Pin exact versions — Use
"22.14.0"not"22"for reproducibility - Use lockfiles — Set
locked = trueandlockfile = true - Prefer registry names — Use
nodenot"github:nodejs/node"when available - Use
github:prefix — For tools not in the default mise registry - Keep settings section — Even if using defaults, be explicit about security settings
Current flags
!sayt help setup 2>&1 || true
!sayt help doctor 2>&1 || true