basectl onboard is the guided setup experience for Base itself.
It helps technically-adjacent users through the first Base setup without
turning basectl setup into an interactive, hand-holding command. The setup
command remains the direct, scriptable reconciler. The onboard command is
slower, friendlier, and more explanatory because that is its purpose.
basectl onboard runs a checklist-style first-run flow around existing Base
commands:
- runs
basectl check - prompts before running
basectl setup - prompts before running
basectl update-profile, unless profile updates are disabled - runs
basectl doctor - lists discovered projects with
basectl projects list - suggests the next interactive shell step
It keeps underlying command output visible and shows each Base command before it
runs it. Use it when you want a guided first setup. Use basectl setup directly
when you want the scriptable reconciler.
basectl onboard [options]Options:
--profile <list> Include named prerequisite profiles.
--dry-run Explain and show planned actions without making changes.
--yes Accept default answers for setup/profile prompts.
--no-profile Skip shell profile updates.
-v Enable DEBUG logging for underlying commands.
-h, --help Show help text.
The command defaults to the base project. Project-specific guided onboarding
remains a project installer responsibility.
Base should not grow basectl onboard <project> as a product-specific guided
installer. Project onboarding belongs in the project repository, where the
installer can speak in that product's language, clone or update that product's
repo, explain product-specific prerequisites, and call Base for the workspace
mechanics it owns.
The stable split is:
basectl onboardguides first-run Base setup.basectl setup <project>reconciles a Base-managed project from its manifest.<project>/install.shor a packaged project installer guides product-specific onboarding and calls Base internally.
Future workspace or team onboarding should start from a workspace manifest
design, not from project-specific product logic inside Base. A future command
such as basectl onboard <workspace> would need an explicit manifest location,
clone policy, trust model, partial-failure model, and dry-run story before it
becomes part of the product surface. See Workspace Manifest.
basectl onboard is for someone who can use a terminal but does not yet know
what Base will do to their machine.
Examples:
- a DevOps learner setting up a Mac for a Base-managed project
- a new developer joining a workspace that uses Base
- a technically-adjacent user who wants confirmation before each major setup step
It is not the right layer for product-specific onboarding. A project such as
Banyanlabs should still own its own install.sh or packaged installer and call
Base internally. See Project Installers for that
boundary.
basectl onboard orchestrates existing Base primitives:
basectl checkfor quick environment statebasectl doctorfor human-readable diagnosis and suggested fixesbasectl setupfor actual reconciliationbasectl setup --profile <list>when the user opts into Base prerequisite profilesbasectl update-profilefor shell startup integrationbasectl projects listto show discovered projects after setupbasectl activate baseas the final suggested next step
It does not duplicate Homebrew, Python, venv, manifest, or shell-profile logic. Those responsibilities already belong to the setup/check/profile commands.
Initial command shape:
basectl onboard [options]Planned options:
--profile <list> Include named prerequisite profiles.
--dry-run Explain and show planned actions without making changes.
--yes Accept default answers for non-destructive prompts.
--no-profile Skip shell profile updates.
-v Enable DEBUG logging for underlying commands.
-h, --help Show help text.
The command should default to the base project. Project-specific guided
onboarding remains a project installer responsibility.
The shipped flow is simple and checklist-oriented:
- Print a short explanation of what Base is about to verify.
- Run
basectl check. - If checks fail, explain that setup can reconcile the missing pieces.
- Ask for confirmation before running
basectl setup. - If
--profilewas requested, include those prerequisite profiles in setup. - Ask for confirmation before running
basectl update-profile, unless--no-profilewas set. - Run
basectl doctorto summarize the final state. - Print discovered projects with
basectl projects listwhen available. - Suggest
basectlorbasectl activate baseas the next interactive step.
The command shows the exact Base command before it runs it. For example:
Next: basectl setup
This installs or verifies Homebrew, Xcode Command Line Tools, Base Python, and
Base-managed artifacts.
Proceed? [y/N]
Prompts should be explicit but sparse:
- Prompt before operations that can install software or edit shell startup files.
- Do not prompt before read-only checks.
- Treat Enter as the conservative answer when there is risk.
--yesmay accept normal setup/profile prompts, but should not bypass fatal safety checks such as unsupported operating systems.--dry-runshould not prompt for actions it will not perform.
The command is friendly without hiding the mechanics:
- Use plain English headings such as
Check,Setup,Shell Profile, andNext Steps. - Keep underlying command output visible so users can see long-running progress.
- Keep logs on stderr, following Base's existing logging convention.
- Use
basectl doctoroutput for final health reporting rather than inventing a separate diagnosis format.
Failures are recoverable and specific:
- If
basectl checkfails, continue to the setup prompt. - If
basectl setupfails, run or recommendbasectl doctorand stop before profile updates. - If
basectl update-profilefails, leave setup success intact and explain how to rerun that step. - Preserve the failing command's exit status when onboarding cannot complete.
basectl onboard should not:
- become a replacement for
basectl setup - become a product-specific installer
- clone project repositories
- manage secrets or credentials
- hide underlying command output behind a full-screen interface in v1
- introduce a dependency on a TUI framework before the simple checklist version proves insufficient
The implementation is a Bash subcommand under
cli/bash/commands/basectl/subcommands/onboard.sh.
That keeps it close to the setup/check/profile primitives it orchestrates and avoids adding Python dependencies for interactive prompting. If a richer UI is needed later, the Bash command can delegate to a Python package while preserving the same public command.
Tests should cover:
- help text
- dry-run flow
- declined setup prompt
- accepted setup prompt
--yesnon-interactive flow--profile <list>passing through to setup and doctor--no-profileskipping profile updates- setup failure stopping later steps