pathlint 0.0.4

Lint the PATH environment variable against declarative ordering rules.
Documentation
# Built-in source catalog. See docs/PRD.md §9.

#

# Bump `catalog_version` whenever an existing source's per-OS path,

# semantics, or definition changes — never just for additions.

# Users who pin `require_catalog = N` in their pathlint.toml will

# get a config error on a binary whose embedded catalog is older

# than what they need.

catalog_version = 2



# ---- Cross-OS user-installed binaries ----



[source.cargo]

description = "binaries from `cargo install`"

windows = "$UserProfile/.cargo/bin"

unix    = "$HOME/.cargo/bin"

uninstall_command = "cargo uninstall {bin}"



[source.go]

description = "binaries from `go install`"

windows = "$UserProfile/go/bin"

unix    = "$HOME/go/bin"

# `go install` doesn't ship a remove command — `rm $GOBIN/<bin>`

# is the practical answer, but it depends on the shell.



[source.npm_global]

windows = "$AppData/npm"

unix    = "$HOME/.npm-global/bin"

uninstall_command = "npm uninstall -g {bin}"



[source.pip_user]

windows = "$AppData/Python"

unix    = "$HOME/.local/bin"

uninstall_command = "pip uninstall {bin}"



[source.user_bin]

windows = "$UserProfile/bin"

unix    = "$HOME/bin"



[source.user_local_bin]

unix    = "$HOME/.local/bin"



# ---- Polyglot version managers ----



# Catch-all that matches anything served by mise (shims + installs).

# Kept for backwards compatibility with rules that don't care which

# layer mise served the binary from. Prefer mise_shims / mise_installs

# in new rules for finer control.

[source.mise]

description = "any binary served by mise (alias matching shims + installs)"

windows = "$LocalAppData/mise"

unix    = "$HOME/.local/share/mise"



# Binaries reached via the mise shim layer ($PATH front-loaded with

# `mise/shims`). This is the typical setup when shells run

# `mise activate`.

[source.mise_shims]

description = "mise shim layer"

windows = "$LocalAppData/mise/shims"

unix    = "$HOME/.local/share/mise/shims"



# Direct binaries from `mise/installs/<tool>/<version>/bin`. This is

# what shows up when mise activates a runtime via PATH-rewriting

# rather than shims, or when a plugin (cargo-*, npm-*, etc.) was

# installed through mise.

[source.mise_installs]

description = "mise per-runtime install dirs"

windows = "$LocalAppData/mise/installs"

unix    = "$HOME/.local/share/mise/installs"



[source.volta]

windows = "$LocalAppData/Volta"

unix    = "$HOME/.volta/bin"

uninstall_command = "volta uninstall {bin}"



[source.aqua]

windows = "$LocalAppData/aquaproj-aqua"

unix    = "$HOME/.local/share/aquaproj-aqua"

# aqua manages tools via aqua.yaml, no per-binary uninstall.



[source.asdf]

unix    = "$HOME/.asdf/shims"

# asdf removes tools by plugin: `asdf uninstall <plugin> <version>`.



# ---- Windows-only package managers ----



[source.winget]

windows = "$LocalAppData/Microsoft/WinGet"

uninstall_command = "winget uninstall {bin}"



[source.choco]

windows = "$ProgramData/chocolatey"

uninstall_command = "choco uninstall {bin}"



[source.scoop]

windows = "$UserProfile/scoop"

uninstall_command = "scoop uninstall {bin}"



[source.WindowsApps]

description = "Microsoft Store stub layer"

windows = "Microsoft/WindowsApps"



[source.strawberry]

windows = "Strawberry"



[source.mingw]

windows = "mingw"



[source.msys]

windows = "msys"



# ---- macOS-only package managers ----



[source.brew_arm]

description = "Homebrew on Apple Silicon"

macos = "/opt/homebrew"

uninstall_command = "brew uninstall {bin}"



[source.brew_intel]

description = "Homebrew on Intel macOS"

macos = "/usr/local"

uninstall_command = "brew uninstall {bin}"



[source.macports]

macos = "/opt/local"

uninstall_command = "sudo port uninstall {bin}"



# ---- Linux-only package managers ----



[source.apt]

linux = "/usr/bin"

uninstall_command = "sudo apt remove {bin}"



[source.pacman]

linux = "/usr/bin"

uninstall_command = "sudo pacman -Rns {bin}"



[source.dnf]

linux = "/usr/bin"

uninstall_command = "sudo dnf remove {bin}"



[source.flatpak]

linux = "/var/lib/flatpak/exports/bin"

uninstall_command = "flatpak uninstall {bin}"



[source.snap]

linux = "/snap/bin"

uninstall_command = "sudo snap remove {bin}"



# ---- Termux ----



[source.pkg]

description = "Termux pkg installs"

termux = "$PREFIX/bin"

uninstall_command = "pkg uninstall {bin}"



[source.termux_user_bin]

termux = "$PREFIX/../home/bin"



# ---- OS baseline ----



[source.system_windows]

windows = "$SystemRoot/System32"



[source.system_macos]

macos = "/usr/bin"



[source.system_linux]

linux = "/usr/bin"