Ctrl K
ComunidadGuías…

toolchain.toml

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# Every host binary Sjel assumes is installed. No entry, no check. Read by tools/toolchain-check,
# wrapped by tools/install.sh and tools/doctor; single-line TOML only (tools/lib/toml.sh).
#
#   required    "yes" (a miss fails doctor) | "optional" (a miss warns) | "runtime" (only this
#               machine's container_runtime is checked, the others are alternatives)
#   why         one line: what Sjel uses it for
#   install_macos / install_linux   the copy-paste install hint for that OS
#   bin         the executable name, when it differs from the section name
#   app         the macOS app bundle, so `sjel storage installed` never reports it idle
#   os          "macos" | "linux"; the checker skips the entry elsewhere
#   upstream    the upstreams.toml section id, when this tool is also audited code
#   min_version / version_cmd   an optional floor, checked only when both are present
#   needed_by   where it applies: "workflow:<name>", "capability:<id>",
#               "capability-field:<field>", "overlay". Absent = core, checked on every machine.
#
#   tools/toolchain-check                    # this machine: core + enabled capabilities + runtime
#   tools/toolchain-check --workflow backup  # ...plus what a backup needs, before it holds a service

# ---- always required ------------------------------------------------------------------

[git]
required = "yes"
why = "version control; the spine of update.sh and every repo operation"
install_macos = "preinstalled with Xcode CLT — or: brew install git"
install_linux = "apt-get install -y git"

[bash]
required = "yes"
why = "every tools/*.sh runs here; Sjel targets bash 3.2 (CONTRIBUTING.md#portable-shell)"
install_macos = "preinstalled (3.2)"
install_linux = "preinstalled"

[jq]
required = "yes"
why = "JSON in shell — the secret setup, tools/restore.sh and the security workflow"
install_macos = "brew install jq"
install_linux = "apt-get install -y jq"

[bun]
required = "yes"
upstream = "bun"
min_version = "1.4.0" # UI Security Scanner API; and the lockfileVersion 2 that 1.3.14 cannot parse
version_cmd = "bun --version"
why = "the TS runtime (CONTRIBUTING.md#language-tooling): doctor, packs-codex, the site build and the web clipper"
install_macos = "brew install oven-sh/bun/bun"
install_linux = "curl -fsSL https://bun.sh/install | bash"

[uv]
required = "yes"
why = "the Python runtime (CONTRIBUTING.md#language-tooling): printctl and any uv-run script"
install_macos = "brew install uv"
install_linux = "curl -LsSf https://astral.sh/uv/install.sh | sh"

[gh]
required = "yes"
why = "GitHub CLI: repos.ts, systems.toml visibility checks, the PR workflow"
install_macos = "brew install gh"
install_linux = "apt-get install -y gh   # or: https://cli.github.com"

[bitwarden-cli]
required = "yes"
bin = "bw"
needed_by = ["overlay"]
upstream = "bitwarden-cli"
why = "the canonical secret store CLI (CONTRIBUTING.md#secrets): the secret setup, bw-unlock and backup restore"
install_macos = "brew install bitwarden-cli"
install_linux = "npm i -g @bitwarden/cli   # or the latest GitHub release"

# ---- optional (feature/gate-scoped; absence warns, never fails) ------------------------

[restic]
required = "optional"
needed_by = ["workflow:backup"]
why = "encrypted backups (CONTRIBUTING.md#backups-before-migrations); backup.sh and nothing else"
install_macos = "brew install restic"
install_linux = "apt-get install -y restic"

[sqlite3]
required = "optional"
needed_by = ["capability-field:backup_sqlite", "capability-field:backup_sqlite_online", "workflow:restore"]
why = "cold SQLite backup, the store's live `.backup` copy and isolated restore integrity checks"
install_macos = "preinstalled — or: brew install sqlite"
install_linux = "apt-get install -y sqlite3"

[swift]
required = "optional"
os = "macos"
needed_by = ["workflow:backup"]
why = "Foundation checks that the store's iCloud Drive archive finished uploading and downloads an offloaded predecessor"
install_macos = "install Xcode Command Line Tools: xcode-select --install"

[python3]
required = "optional"
needed_by = ["workflow:backup"]
why = "store-only iCloud retention verifies per-archive hashes and invokes an isolated restore"
install_macos = "preinstalled with Xcode Command Line Tools — or: brew install python"
install_linux = "apt-get install -y python3"

[apfel]
required = "optional"
os = "macos"
needed_by = ["capability:foundation-models"]
upstream = "apfel"
version_cmd = "apfel --version"
min_version = "1.9.1"
why = "capabilities/foundation-models runs `apfel --serve`; needs macOS 26+, Apple Silicon and Apple Intelligence enabled"
install_macos = "brew install apfel"

[macmon]
required = "optional"
os = "macos"
needed_by = ["capability:macmon"]
upstream = "macmon"
version_cmd = "macmon --version"
min_version = "0.7.0"
why = "capabilities/macmon runs `macmon serve` for the app's Systems page; tools/sysmon power runs it as a TUI"
install_macos = "cargo install macmon --locked"   # latest; min_version is a floor, not a target

[sqld]
required = "optional"
os = "macos"
needed_by = ["capability:sqld"]
upstream = "libsql-server"
version_cmd = "sqld --version"
min_version = "0.24.32"
why = "capabilities/sqld runs it as the libSQL primary other devices replicate from"
install_macos = "tools/install-sqld.sh"   # pinned version + digest, into ~/.local/bin

[exiftool]
required = "optional"
upstream = "exiftool"
version_cmd = "exiftool -ver"
min_version = "13.55"
why = "media ingest calls it once per staged tree for DateTimeOriginal, and refuses before writing bytes without it"
install_macos = "brew install exiftool"
install_linux = "apt-get install -y libimage-exiftool-perl"

[yt-dlp]
required = "optional"
needed_by = ["capability:comms"]
version_cmd = "yt-dlp --version"
min_version = "2026.08.19"
why = "capabilities/comms/src/media.rs execs it for share-link metadata and subtitles, always with --skip-download"
install_macos = "brew install yt-dlp"
install_linux = "apt-get install -y yt-dlp   # or: uv tool install yt-dlp"

[ollama]
required = "optional"
needed_by = ["capability:comms", "capability:scouting"]
version_cmd = "ollama --version"
min_version = "0.33.0"
why = "serves the `embedding` and `summarization` roles: comms relevance ranking, scouting vectors and the local digest rung"
app = "Ollama.app"
install_macos = "brew install --cask ollama"
install_linux = "curl -fsSL https://ollama.com/install.sh | sh"

[tailscale]
required = "optional"
version_cmd = "tailscale version"
min_version = "1.98.9"
why = "capabilities/host-net execs `tailscale status --json`, `debug prefs` and `lock status` for its tailnet verb"
install_macos = "brew install --cask tailscale"
install_linux = "curl -fsSL https://tailscale.com/install.sh | sh"

[libreoffice]
required = "optional"
bin = "soffice"
why = "headless LibreOffice is the only renderer the slide-deck Pack has, and rendering is its verification step"
app = "LibreOffice.app"
install_macos = "brew install --cask libreoffice"
install_linux = "apt-get install -y libreoffice"

[xcode]
required = "optional"
bin = "xcodebuild"
os = "macos"
app = "Xcode.app"
why = "builds and archives the iOS app through tools/distribution/ios-archive, which `sjel testflight` drives"
install_macos = "xcode-select --install is not enough; install Xcode from the App Store"

# ---- interactive terminal tools (this Mac's shell; absence warns) -----------------------
# No Sjel script execs these; they replace cat, ls and git's default diff for the human at the shell.

[bat]
required = "optional"
os = "macos"
why = "colourised file reading: `cat` and MANPAGER in the personal shell config"
install_macos = "brew install bat"

[eza]
required = "optional"
os = "macos"
why = "`ls`/`ll`/`la`/`lt`/`ltt` in the personal shell config"
install_macos = "brew install eza"

[git-delta]
required = "optional"
os = "macos"
bin = "delta"
why = "git's pager for diff, log and blame, set once in ~/.gitconfig"
install_macos = "brew install git-delta"

[zoxide]
required = "optional"
os = "macos"
why = "`z` and `zi`, the frecent-directory jump"
install_macos = "brew install zoxide"

[fzf]
required = "optional"
os = "macos"
why = "Ctrl-R history search, Ctrl-T file picking and completion, and the selector zoxide's `zi` reaches for"
install_macos = "brew install fzf"

# ---- the Rust command-line baseline ----------------------------------------------------

[cargo]
required = "yes"
why = "the Rust toolchain: builds sjel-cli and every capability's `build` command"
install_macos = "brew install rustup && rustup default stable   # or: brew install rust"
install_linux = "curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh"

[ripgrep]
required = "yes"
bin = "rg"
why = "the search tool Sjel's agents and scripts use instead of grep (AGENTS.md)"
install_macos = "brew install ripgrep"
install_linux = "apt-get install -y ripgrep"

[fd]
required = "yes"
why = "the file finder Sjel uses instead of find"
install_macos = "brew install fd"
# Debian and Ubuntu ship the binary as `fdfind` because of a name clash with an older package.
install_linux = "apt-get install -y fd-find && ln -sf \"$(command -v fdfind)\" ~/.local/bin/fd"

[sd]
required = "optional"
os = "macos"
why = "search and replace with one regex syntax on every OS, instead of sed"
install_macos = "brew install sd"

[jaq]
required = "optional"
os = "macos"
why = "a faster jq clone; [jq] stays the required JSON tool and no script calls this yet"
install_macos = "brew install jaq"

[hyperfine]
required = "optional"
os = "macos"
why = "command benchmarks, for measuring a script against its sjel-cli port"
install_macos = "brew install hyperfine"

[tokei]
required = "optional"
os = "macos"
why = "line counts per language, for how much shell and TypeScript is left to port"
install_macos = "brew install tokei"

[dust]
required = "optional"
os = "macos"
why = "disk usage as a tree for the interactive shell"
install_macos = "brew install dust"

[procs]
required = "optional"
os = "macos"
why = "process listing for the interactive shell, with ports and a tree view"
install_macos = "brew install procs"

# ---- container runtimes (the checker validates only this machine's chosen one) ---------

[docker]
required = "runtime"
why = "container runtime (machine.toml container_runtime = docker); tools/agentbox depends on the CLI by name"
install_macos = "brew install --cask orbstack   # or --cask docker, or colima — Sjel assumes the docker CLI, never one provider of it"
install_linux = "apt-get install -y docker.io   # or Docker Engine per docs.docker.com"

[podman]
required = "runtime"
why = "rootless container runtime alternative (machine.toml container_runtime = podman)"
install_macos = "brew install podman"
install_linux = "apt-get install -y podman"

# ---- audit scanners (absence warns) ----------------------------------------------------

[gitleaks]
required = "optional"
needed_by = ["workflow:audit"]
upstream = "gitleaks"
why = "secret scan over git history — tools/audit"
install_macos = "brew install gitleaks"
install_linux = "apt-get install -y gitleaks   # or the latest GitHub release"

[osv-scanner]
required = "optional"
needed_by = ["workflow:audit"]
bin = "osv-scanner"
upstream = "osv-scanner"
why = "dependency-CVE scan over every lockfile and this machine's globally installed packages — tools/audit"
install_macos = "brew install osv-scanner"
install_linux = "go install github.com/google/osv-scanner/cmd/osv-scanner@latest"

[grype]
required = "optional"
needed_by = ["workflow:audit"]
upstream = "grype"
why = "container-image CVE scan by hand, `grype registry:<image>:<tag>`, with no container runtime"
install_macos = "brew install grype"
install_linux = "apt-get install -y grype   # or the latest GitHub release"

[rsync]
required = "optional"
needed_by = ["workflow:backup", "workflow:restore"]
why = "the file-copy path for backup staging and restore placement; backup.sh refuses to start without it"
install_macos = "preinstalled — or: brew install rsync"
install_linux = "apt-get install -y rsync"