Skip to content

Requirements

Requirements declare the system-level tools a step needs before it can run — things like Ruby, Node.js, PostgreSQL, or Docker. Bivvy checks whether each requirement is satisfied before executing the step and offers to install missing ones.

Declaring requirements

Add a requires list to any step:

steps:
bundle_install:
command: bundle install
requires:
- ruby
database_setup:
command: rails db:setup
requires:
- ruby
- postgres-server

Built-in requirements

Bivvy ships with 10 built-in requirement definitions:

Language runtimes

NameCheckInstall template
rubyRuby available via version manager or systemmise-ruby
nodeNode.js available via version manager or systemmise-node
pythonPython available via version manager or systemmise-python
rustrustc --version succeedsrust-install

Runtime requirements are version-manager-aware. Bivvy detects whether the runtime is managed by mise, rbenv, nvm, pyenv, or volta, and adjusts its checks accordingly.

Database client tools

NameCheckInstall template
postgrespsql --version succeedspostgres-install

Services

NameCheckInstall template
postgres-serverpg_isready -q succeedspostgres-install
redis-serverredis-cli ping succeedsredis-install

Container tools

NameCheckInstall template
dockerdocker info succeedsdocker-install

Package / version managers

NameCheckInstall template
brewbrew --version succeedsbrew-install
misemise --version succeedsmise-install

What happens when a requirement is missing

Bivvy categorizes each requirement into one of these statuses:

StatusMeaningInteractive behavior
SatisfiedTool is available and readyNo action needed
InactiveInstalled via version manager but not activatedPrompt to activate
SystemOnlyAvailable at system path but not via version managerWarn, offer managed install
ServiceDownBinary present but service not runningPrompt to start
MissingNot installed at allPrompt to install

In interactive mode, Bivvy offers to fix each gap before running the step. For example:

⚠ ruby is not installed
Install Ruby using mise? [Y/n]

Non-interactive behavior

In --non-interactive mode:

  • Missing requirements block execution (the step fails)
  • SystemOnly requirements produce a warning but allow the step to run
  • ServiceDown requirements block execution
  • Inactive requirements block execution

Use provided_requirements in environment config to skip checks entirely in non-interactive environments like CI.

Custom requirements

Define project-specific requirements at the config root:

requirements:
elasticsearch:
check:
type: service_reachable
command: "curl -sf http://localhost:9200/_cluster/health"
install_hint: "Install Elasticsearch: https://elastic.co/downloads"
graphviz:
check:
type: command_succeeds
command: "dot -V"
install_template: brew-install
install_hint: "brew install graphviz"

Check types

TypeFieldsDescription
command_succeedscommandRuns a shell command, passes on exit code 0
file_existspathChecks if a file or directory exists
service_reachablecommandRuns a command that probes a service

Custom requirement fields

FieldTypeRequiredDescription
checkobjectyesHow to verify the requirement is satisfied
install_templatestringnoTemplate to use for installation
install_hintstringnoHuman-readable install instructions

Provided requirements

Environments can mark requirements as already satisfied, skipping all checks and install prompts:

settings:
environments:
ci:
provided_requirements:
- docker
- postgres-server
- redis-server
docker:
provided_requirements:
- docker

This is especially useful for CI pipelines and containers where tools are pre-installed or managed externally. See Environments for more.