Base may run remote shell installers only when they are defined by Base itself, documented here, and reached through the setup surface that owns that trust decision.
Consent and installer integrity are separate decisions. A setup flag authorizes Base to take the documented install path; it does not authenticate bytes served by a mutable URL. Base discloses that limitation whenever it uses an official mutable installer without checksum verification.
| Installer | URL | Where Base may use it | Opt-in |
|---|---|---|---|
| Homebrew | https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh by default; managed environments may provide a pinned installer location with an expected SHA-256 |
bootstrap.sh, install.sh, and basectl setup when Homebrew is missing on macOS |
First-mile setup path; bootstrap.sh --no-homebrew-install can refuse this path |
| Codex CLI | https://chatgpt.com/codex/install.sh by default; managed environments may provide a local, mirrored, or pinned installer with an expected SHA-256 |
basectl setup --profile ai |
Explicit --profile ai |
| Claude Code | https://claude.ai/install.sh by default; managed environments may provide a local, mirrored, or pinned installer with an expected SHA-256 |
basectl setup --profile ai |
Explicit --profile ai |
| uv | https://astral.sh/uv/install.sh by default; managed environments may provide a local, mirrored, or pinned installer with an expected SHA-256 |
basectl setup <project> on Debian-family Linux when a manifest declares python.manager: uv or a runner: uv command and uv is missing |
Explicit --yes; --dry-run only previews |
| mise | https://mise.run by default; managed environments may provide a local, mirrored, or pinned installer with an expected SHA-256 |
basectl setup <project> on Debian-family Linux when a manifest declares mise configuration and mise is missing |
Explicit --yes; --dry-run only previews |
Project manifests cannot declare arbitrary remote shell installers. Project-owned command strings remain governed by the separate manifest-command trust boundary; they do not become Base-owned installers or extend this list.
The maintained templates/project-install.sh is copied into another project
and governed by the Project Installer contract. It is
not a Base runtime installer entry point.
--dry-run prints planned remote installer commands without downloading or
executing installer content.
The ai profile does not prompt separately after --profile ai is selected.
That explicit profile flag is the opt-in boundary, so scripted and
non-interactive setup stays deterministic.
uv and mise bootstrap only after the project manifest requires the tool, the
tool is missing, the host is Debian-family Linux, and setup has received
--yes. Base clears inherited setup consent before parsing command-line flags,
so exporting BASE_SETUP_YES does not bypass that boundary.
Base intentionally follows each tool's official mutable installer entry point instead of pinning a reviewed commit by default. When Base uses a default path, it identifies the URL as mutable and explicitly says that the script is not checksum-verified.
Teams that require pinned, mirrored, or managed Homebrew installer content can opt in by setting both a Homebrew installer location and its expected SHA-256 before running Base:
- all Homebrew entry points:
BASE_HOMEBREW_INSTALLER_URLandBASE_HOMEBREW_INSTALLER_SHA256 install.shonly:BASE_INSTALL_HOMEBREW_INSTALLER_URLandBASE_INSTALL_HOMEBREW_INSTALLER_SHA256bootstrap.shonly:BASE_BOOTSTRAP_HOMEBREW_INSTALLER_URLandBASE_BOOTSTRAP_HOMEBREW_INSTALLER_SHA256basectl setuponly:BASE_SETUP_HOMEBREW_INSTALLER_URLandBASE_SETUP_HOMEBREW_INSTALLER_SHA256
When any pinned Homebrew installer variable is present, Base requires both the
installer location and expected SHA-256. Missing or mismatched values fail
closed before installer execution. Local file paths, file:// URLs, and remote
URLs are accepted as installer locations.
The Python-owned Codex CLI, Claude Code, uv, and mise installers support paired overrides:
- Codex CLI:
BASE_SETUP_CODEX_INSTALLER_URLandBASE_SETUP_CODEX_INSTALLER_SHA256 - Claude Code:
BASE_SETUP_CLAUDE_INSTALLER_URLandBASE_SETUP_CLAUDE_INSTALLER_SHA256 - uv:
BASE_SETUP_UV_INSTALLER_URLandBASE_SETUP_UV_INSTALLER_SHA256 - mise:
BASE_SETUP_MISE_INSTALLER_URLandBASE_SETUP_MISE_INSTALLER_SHA256
For these installers, either both variables must be present or neither may be
present. The URL may be a local path, a local file:// URL, or an HTTPS URL;
HTTP and other schemes fail closed. Base fetches or copies the installer once
into a user-private temporary directory, verifies the expected SHA-256, runs
that same temporary file without interpolating its location into shell source,
and removes the temporary copy afterward. Tests exercise these paths without
network access.
The checksum covers the installer script bytes only. It does not authenticate packages, binaries, or other content that the installer downloads afterward. Managed environments that need end-to-end provenance should use a reviewed installer which itself pins and verifies downstream artifacts.
Base does not provide a manifest field for arbitrary pinned remote installers.
Python-owned installers are registered in one code policy. AI profile installers and the uv/mise verified-file path run through Base's Python command runner, which preserves live output and writes redacted stdout/stderr tails to persistent logs and failure summaries.
Homebrew first-mile installers run before the Python setup layer may exist. Their output is shown live by the shell installer path and is not rewritten by Base. Those standalone entry points remain independent of Python; contract tests keep their default URL and this policy table synchronized.