CLI Reference
The vaibify core is fully scriptable. Everything the dashboard does can also be driven from the command line, so a build, a run, a test pass, or a PROOF report can be part of a script or a scheduled job. The other pages describe the dashboard; this page is the command-line counterpart.
The command is vaibify, with the shorthand vaib. Every command
prints its own options, and that output is the authority:
vaibify --help # every command
vaibify <command> --help # one command's options
Global options and project targeting
Option |
Meaning |
|---|---|
|
Use this |
|
Port for the hub. By default the hub reuses the port it used last (so a bookmarked tab keeps working) and moves only if another program holds it; an explicit port is used as given and fails if taken |
|
Serve without opening a browser. The process still runs in the foreground; it is not a daemon |
|
Print and exit |
Run with no command, vaibify starts the hub: the dashboard for
all registered projects. Commands that act on a project resolve it in
this order: --project/-p NAME, then --config PATH, then a
vaibify.yml in the current directory, then the only registered
project. With several registered projects and none of these, the
command lists them and exits. A project created with init or
registered with register can be targeted with -p from any
directory.
Commands
Command |
Purpose |
|---|---|
|
Create a project in the current directory from a template, or just a |
|
Register an existing directory containing a |
|
Open the setup wizard in a browser, on port 8051 |
|
Edit |
|
Install and start the Docker runtime vaibify’s containers need |
|
Diagnose this machine, the container, and the project; changes nothing |
|
Clear a container’s stale name-resolution state |
|
Build the image from |
|
Start the container |
|
Stop the container; the workspace volume remains |
|
Show container, image, and volume state, and optionally the PROOF level |
|
Delete the workspace volume, then offer to delete the images |
|
Open a shell in the running container |
|
Copy files between the host and the workspace |
|
List a container directory or print a container file |
|
Run the container isolation check |
|
Run every step, one step, or from a step onward |
|
Summarize the workflow or one step |
|
Run the tests of every step or one step |
|
Record your sign-off on a step, as the dashboard’s sign-off does |
|
Create or refresh a step’s |
|
Verify the Level 3 reproducibility envelope, or reproduce a published project |
|
Open the hub, or a single-project viewer |
|
Move a container’s live session into a fresh browser tab |
|
List or stop live hubs and viewers |
|
Run any dashboard action from the host, as the researcher |
|
Prove a quarantined container’s interrupted operations settled |
|
Store, check, or delete an agent provider’s API key |
|
Store, inspect, or delete the GitHub, Overleaf, and Zenodo credentials a project publishes with |
|
Remove a stored credential and revoke it upstream where possible |
|
Open a dashboard for another machine over SSH |
|
The far end of |
Vaibify has no publish command. Zenodo and GitHub publication run
through the PROOF Level 2 rows in the dashboard and the matching
vaibify do actions (push-to-github, publish-to-zenodo).
Creating and configuring projects
vaibify init
vaibify init # list the installed templates
vaibify init --template NAME [--name NAME] [--force]
vaibify init --name NAME [--minimal] [--force]
Option |
Meaning |
|---|---|
|
Copy a template ( |
|
Project name. Given alone, writes a |
|
The smallest |
|
Overwrite an existing |
With a template, init copies the template’s files into the current
directory, moves any project.json into .vaibify/projects/, writes a
vaibify.yml from the built-in defaults, and registers the project. It
refuses, before writing anything, when .vaibify/projects/project.json
already exists. Because a build clones only the repositories named in
vaibify.yml, init warns when a template’s container.conf lists
repositories the new vaibify.yml does not carry. A name already
registered to a different directory is scaffolded but not registered,
and the command says so.
vaibify register and vaibify config
vaibify register [DIRECTORY] adds an existing directory (default:
the current one) to the registry so -p finds it; the directory must
contain a vaibify.yml, and nothing is written there.
vaibify config edit opens vaibify.yml in $EDITOR;
vaibify config export FILE [-p NAME] writes the current configuration
to a file; vaibify config import FILE replaces the current
configuration with a file’s contents. Every field is documented in the
configuration reference.
Diagnosing and repairing
vaibify doctor
vaibify doctor [--quiet] [--build | --start | --container] [--online]
[--json] [--explain CHECK] [-p NAME]
Doctor examines three scopes: host (the Python’s architecture, the
Docker context and endpoint, the daemon and runtime, storage, memory,
CPU), container (network attachments, name resolution, proxy path),
and project (vaibify’s own records of the project); every scope
also reports the Agent Council’s credential-test records. With no
scope flag every scope runs; --build and --start run the host checks relevant to
that step, and --container runs the container and project checks.
Each check reports ok, warn, fail, or not checked (with the
reason; never counted as ok). Every warn and fail names a next step
for the runtime this machine actually uses. For a running container,
doctor also reports whether it was created consistently with
x11Forwarding, which is fixed when a container is created, and
what its network mode is (an allowlist-mode container reaches the
network only through its proxy; see Security Model). --quiet hides the ok
lines, --json emits the results as JSON, and --explain CHECK
prints how one check decides and nothing else.
Doctor works before any project exists, so it is the first check after
an install. It warns when the Python running it is being translated
(an Intel-only Python on Apple Silicon), compares what a project will
request against what a Colima virtual machine has, and its
shell-completions line prints the exact line to add when TAB
completion is not loaded. In the dashboard, a failure toast’s Click
to run a diagnosis runs the same checks without a project.
By default doctor resolves names but opens no connections. --online
permits connections to the host your project already depends on (its
first repository’s host or the enabled agent’s provider), over the port
and proxy your project would use, without authenticating.
Exit |
Meaning |
|---|---|
0 |
Everything applicable was assessed and nothing failed |
1 |
At least one check failed |
2 |
A scope you named contains a check that could not be assessed |
vaibify repair dns
vaibify repair dns [-p NAME] [--recreate] [--yes]
Clears a container’s stale name-resolution state by restarting it.
--recreate instead recreates the container from the image it is
running, which is required when DNS servers were baked into the
container from outside vaibify. --yes skips the confirmation prompt.
Environment lifecycle
vaibify setup-docker
vaibify setup-docker [--yes] [--no-start] [--cpus N] [--memory GB]
Gives this machine a Docker that vaibify can use, the same plan the dashboard’s Set up Docker button follows. It reads the machine, shows the next step, runs it when you agree, and reads the machine again, so it resumes from wherever the machine is:
macOS: installs Colima, Docker and buildx with Homebrew or MacPorts, then starts Colima with all CPUs but one and half the RAM (at least 4 GB). With neither package manager it tells you how to install one. A MacPorts that stopped running after a macOS upgrade is named in MacPorts’ own words, with
sudo port migrateto run yourself. A stopped Colima machine, Docker Desktop, OrbStack or Rancher Desktop is started rather than replaced.Ubuntu, Debian, Fedora, RHEL, CentOS (and distributions that declare one of them as their parent): installs Docker Engine from Docker’s own repository and starts it, then offers the
dockergroup or rootless Docker. Docker publishes no repository for other distributions, so for those it points to their own instructions.
A step that needs an administrator asks through sudo in your
terminal. A step only you can do (installing a package manager,
logging out and back in) is printed with its commands; in a terminal
the command waits for you, otherwise it exits with status 2. --yes
runs every step without asking and never restarts a running Colima
machine. --no-start installs what is missing but starts nothing.
--cpus and --memory set a new Colima machine’s size. A step that
runs without changing the machine stops the command rather than
repeating.
vaibify build
vaibify build [--no-cache] [-p NAME]
Runs the checks before a build,
then builds the base image and one layer per enabled feature.
--no-cache ignores Docker’s build cache. When the build produces an
image different from the one the recorded results came from, it says
so, and whether vaibify’s own build recipe changed too (if not, the
difference came from outside vaibify). On macOS, a long build can be
kept from sleeping with caffeinate -s vaibify build.
vaibify start
vaibify start [-d] [--gui [--port N]] [--jupyter] [-p NAME]
[--image-trust restricted|as-built|inspect] [--with-credentials]
[COMMAND]
Option |
Meaning |
|---|---|
|
Start in the background and return, as a script needs. A |
|
Also open the single-project viewer, on |
|
Enable JupyterLab with port forwarding |
|
How an image vaibify did not build may run. Asked interactively on a terminal; required without one |
|
Let that image’s code read your stored credentials. Needs |
Without --detach, start attaches a terminal to the container, or
runs COMMAND in it. See Security Model for what each
image-trust choice does.
vaibify status
vaibify status [--proof] [--json] [-p NAME]
Shows the container, image, and volume state. --proof adds the
project’s PROOF level and its blockers, the same ones the PROOF tab
shows; --json emits the environment and PROOF status as one JSON
object.
vaibify stop and vaibify destroy
vaibify stop [-p NAME] stops the container; the workspace volume
remains.
Warning
vaibify destroy deletes the project’s workspace volume: every file in
the container that has not been committed and pushed. The volume is
Docker-managed storage, not a directory on your computer, so it is the
only copy. The confirmation prompt is the only guard.
After the volume, destroy offers to remove the project’s images. It
does not remove the container itself (stop it with vaibify stop) or
the volume that holds the container’s stored credentials, which
remains until you remove it with docker volume rm.
start, stop, destroy and build each hold the environment’s
name while they work, as the dashboard’s start, stop, deletion,
rename and containerization do, so two of them can never interleave on
one environment. One that finds the name held refuses at once, naming
what holds it: '<name>' is being renamed by another vaibify process; try again when it finishes. start is also refused while a rename of
the environment has not finished; vaibify reconcile <name> settles
one.
vaibify verify
vaibify verify [-p NAME] runs checkIsolation.sh inside the running
container; what it checks is in Security Model.
Both connect and verify open an interactive exec that vaibify
records on the host and ends on every exit: closing the window ends
the shell and everything started in it, and a CLI killed outright is
cleaned up by the running hub’s reaper once the CLI is provably dead.
See Known debt for what the record does not cover.
Shell helpers
The first vaibify command after an install or upgrade configures
shell completion and three helper aliases for bash, zsh, and fish. The
setup only appends to your shell’s configuration file (~/.zshrc;
~/.bash_profile on macOS or ~/.bashrc on Linux;
~/.config/fish/config.fish) and never edits or removes a line.
Alias |
Shorthand |
Runs |
|---|---|---|
|
|
|
|
|
|
|
|
|
On macOS the setup also links Colima’s Docker socket to
/var/run/docker.sock when that path is free and writable without
sudo.
Tab completion
Press TAB after vaibify push or vaibify pull (or their aliases) to
complete a path inside the project. vaibify pull <TAB> offers paths in
the container; vaibify push data.csv <TAB> offers container paths for
the destination. Container paths may be relative to the workspace root
(StepName/output.csv) or absolute. -p NAME is honored. A host
project has no container, so its paths complete from the project’s own
directory. Nothing is offered while the container is stopped. In bash,
a path containing = or : is not completed.
If TAB does nothing
Run vaibify doctor. Its shell-completions line reads the
configuration file of the shell named in $SHELL and, when that file
does not load vaibify’s completion script, prints the exact line to
add. To rerun the setup, remove its marker and run any command:
rm ~/.vaibify/.setup_done
vaibify --version
Files and shells
Command |
Meaning |
|---|---|
|
Open a shell inside the running container; closing the window ends the shell and everything started in it |
|
Copy a host file into the workspace. A relative container path is read from |
|
Copy a workspace file to the host. A relative container path is read from |
|
List a container directory (default |
|
Print a container file; a relative path is read from |
The shell helpers that the first command after an install configures (see Shell helpers) wrap the first three:
vaibify_connect -p my-analysis
vaibify_push -p my-analysis data.csv /workspace/data.csv
vaibify_pull -p my-analysis /workspace/results.csv ./results.csv
Workflows and tests
Step numbers on these commands are 1-based. Labels such as A09 are
per-type sequential (the ninth automated step), as in the dashboard.
Command |
Meaning |
|---|---|
|
Run every step, one step, or from a step onward |
|
Summarize the workflow, or show one step in detail |
|
Run the tests of every step or one step. Exits 1 on any failure, 2 when the step number is out of range |
|
Record your sign-off on a step. |
verify-step records the sign-off through the dashboard’s own route,
so it carries the same timestamp and the same hashes of the plots it
covers, and a later change to those plots is noticed exactly as it is
after a sign-off in the browser. A hub must be running, and the
command claims the container for the one request.
vaibify generate-standards
vaibify generate-standards --step-dir PATH [--rtol FLOAT] [--detect-stochastic]
vaibify generate-standards --workflow PATH --step-label LABEL [--rtol FLOAT] [--detect-stochastic]
Creates or refreshes a step’s tests/quantitative_standards_<step>.json from
live data, outside the dashboard: for one step directory, or by step
label from a workflow file. --rtol sets the default relative
tolerance when a fresh standards file is generated, and
--detect-stochastic scans the step’s data*.py scripts for unseeded
random-number generation first. The dashboard’s equivalent is
Generate; see Testing Model.
Reproducibility
vaibify reproduce
vaibify reproduce [--repo PATH] [--rerun] [--workflow NAME] [--skip-tier N]
vaibify reproduce --from SOURCE [--prepare | --rerun] [--workflow NAME] [--allow-emulation]
The first form walks a project’s Level 3 envelope in tiers, from a
checked-out repository (--repo, default: the current directory):
Tier |
What it does |
|---|---|
1 |
Checks |
2 |
Installs |
3 |
Pulls the pinned image by digest |
4 |
Runs the same Level 3 readiness checks as the dashboard |
5 |
Only with |
--skip-tier skips one of tiers 1–4 and may be repeated. --workflow
is required when the container holds more than one workflow. Exit 0
means every selected tier passed, 1 that one failed, 2 a usage error
such as a missing envelope file. A run ends with
L3 reproduction confirmed and attested., L3 reproduction ready
(without --rerun), or L3 reproduction failed; see tier output above.
The shadow rerun uses an image already on your own Docker daemon, so
only tiers 1–4 (and reproduce.sh) show whether a fresh machine could
obtain the image. Each of tiers 1–3 is an ordinary command
(sha256sum -c, pip install --require-hashes,
docker pull <image>@sha256:…) that anyone reading the envelope can
run by hand.
With --from, vaibify reproduces a published project from an
https:// or ssh:// clone URL, a user@host:path address, or a
clean local clone under your home directory, without installing it as
one of your own projects:
Form |
What it does |
|---|---|
|
Stages an exact snapshot of one commit, validates it, prints what a rerun would use (workflow, commit, pinned image, platform, archived deposit), and discards it. Nothing is pulled or run |
|
Also obtains the pinned image (registry, archived deposit, or local copy), so a long download can be done ahead of time |
|
Obtains the image, reruns the snapshot in a shadow container, compares the outputs with the project’s manifest, and writes a report under |
|
Accepts a pinned build for another processor; the verdict says so |
|
Selects the workflow when the repository holds several |
--from cannot be combined with --repo or --skip-tier. See
Reproducibility.
The hub, sessions, and ports
vaibify gui and vaibify open
vaibify and vaibify gui open the hub. vaibify gui -p NAME serves
a single-project viewer on port 8050. Several hubs can run on one
machine. Each container may be open in only one browser session at a
time, so a second vaibify start on a container held elsewhere is
refused. vaibify open CONTAINER moves a held session into a fresh
browser tab; it works only from the host’s own keyboard, never from a
container or a remote peer, and it is also how to get a fresh tab
after a session reaches its lifetime limit.
vaibify sessions
Hubs and viewers run in the foreground of the terminal that started them. Closing a browser tab does not stop them. Closing the terminal window does, cleanly: the hub drains the terminals it owns and releases its locks, the same as one Ctrl-C. A second Ctrl-C while that shutdown runs is ignored; Ctrl-\ (SIGQUIT) is the hard stop. On the host only:
vaibify sessions # pid, role, port, start time, containers held
vaibify sessions stop PID # stop one session
vaibify sessions stop --all # stop every session except this one
stop sends SIGTERM, so the server releases its session and
container locks, and it refuses any PID that is not a live vaibify
session.
The dashboard’s equivalent is Quit vaibify (or Admin → Quit),
which stops a hub and the windows it opened, and is refused while any
of them has work in progress. sessions stop makes no such check:
it stops the session it is given, the same as closing its terminal.
vaibify do
Every dashboard action has a command-line equivalent. Most are
vaibify do subcommands, generated from two lists: the agent-action
catalog, which the dashboard and the in-container vaibify-do also
use, and a researcher-only list that is never shipped into a container
(container settings, the Agent Council, uploads, file transfers).
vaibify do authenticates as the researcher, so actions reserved for
the researcher (user-only actions, such as clean-outputs) are
available here; bAgentSafe constrains an agent in a container, not
the researcher at their own terminal. The agent’s in-container usage
is described in For Agents.
The rest have a hand-written home: credentials are vaibify credential, building and starting are vaibify build and vaibify start, registering a directory is vaibify register, and opening a
project in another tab is vaibify open. A handful of dashboard
actions have no command-line form because they only make sense in a
browser, such as moving a live session into a fresh tab.
tests/testArchitecturalInvariants.py::testEveryGuiInvokedMutationHasCliEquivalent
fails when a new dashboard action has none of these.
vaibify do # list every action
vaibify do run-step --help # one action's arguments
vaibify do run-step A09 # run one step
vaibify do run-selected-steps A03 A04
vaibify do check-l2-readiness --json
Option |
Meaning |
|---|---|
|
Target project |
|
Port of the hub to drive, when several are running |
|
Container path of the |
|
One JSON object per line |
|
Print the call without sending it |
|
Seconds to wait for the response, or for the next event of a run ( |
|
Run actions only: stop with exit code 3 at an interactive step instead of asking at the terminal |
Options follow the action name. Step selectors on the run actions are
bare words (labels such as A09, or 0-based indices); other fields
are key=value pairs, or one JSON object. A hub must be running (start
one with vaibify in another terminal), and the dashboard shows every
action as it runs. The command claims the container for one action and
then releases it, so a container open in a dashboard tab is refused
rather than taken over: close that tab, or run the action from inside
the container with vaibify-do.
An action that starts work the hub carries on with, such as a run or
Verify Level 3, returns once that work has finished: the release
waits for it, says so, and gives up after --timeout seconds with the
hub’s reason. Pass a longer --timeout for a long verification.
A run that reaches an interactive step asks at the terminal whether to
run it or skip it. To run it, it prints the step’s commands for you to
run in a container shell (vaibify connect), then asks for the exit
code and reports it, as the dashboard’s buttons do. With
--non-interactive the run stops at that step at once, names it, and
exits 3, so a script never waits on a question nobody will answer. The
command stops the paused run as the dashboard’s Stop button does, so
the container is released at once rather than held until the hub gives
up on the step.
Actions that act on the hub rather than on a running container, such
as set-container-settings, address the project by name and claim
nothing. vaibify do rename-environment -p OLD sNewName=NEW renames a
stopped environment; it is a dry run that lists every move unless
bDryRun=false is given (see Renaming an
environment).
vaibify do rename-project sWorkflowPath=PATH sNewName=NAME renames a
Project, also a dry run first; an in-container agent is refused both. upload-file-stream takes sLocalPath=<file> and streams
that host file as the request body, filling in its size and name.
Recovering a quarantined container
vaibify reconcile CONTAINER [--yes]
vaibify reconcile CONTAINER --break-glass SHA256
vaibify reconcile CONTAINER --force-abandon OPERATION
vaibify reconcile CONTAINER --terminate-recorded
vaibify reconcile CONTAINER --abandon-host-journal SHA256
Once a terminal has been used in an environment, vaibify reports its
quiescence as unproven on release or shutdown, and reconcile is how
to settle it. It also finishes or undoes a rename of the environment
that vaibify stopped partway through, before anything else. A plain run shows which operation was mid-write, when,
and in which container; proves the recorded writer dead and the
operation settled; and only then clears the quarantine, or refuses and
leaves the container quarantined. The dashboard’s Reconcile now
button runs the same proof. The other options are destructive
judgments available only here:
Option |
Meaning |
|---|---|
|
Skip the confirmation prompt |
|
Clear a malformed marker whose raw bytes hash to this value (a plain run prints it) |
|
Poison a wedged operation on the live hub that holds the container; changes are refused until it is reconciled |
|
Host projects only: signal the process groups vaibify journaled, then retry the proof. A record whose identity cannot be proven is reported, never signaled |
|
Host projects only: give up on proving a malformed marker with this hash, recording the abandonment beside the journal. Proves nothing |
Credentials
Command |
Meaning |
|---|---|
|
Store an agent provider’s API key, read from a prompt that does not echo |
|
Report whether a provider’s key is configured |
|
Remove a provider’s key |
|
Store a publishing token for a project, read from a prompt that does not echo |
|
Report which remotes are configured and reachable |
|
The same as |
|
Remove the stored GitHub credential, or one repository’s with |
|
The same, for Overleaf |
|
The same, for one project’s token on one Zenodo instance (default |
credential set is the command-line form of the dashboard’s credential
forms. The token is read at a hidden prompt and sent only in the body
of one request to the hub on this machine; it never appears on the
command line, in an environment variable, or in any message the
command prints. --project-id binds an Overleaf project, and
--instance chooses the Zenodo instance (default sandbox).
revoke prints whether the upstream token was revoked and whether the
local copy was cleared, and exits non-zero if the local copy was not
cleared. For GitHub it also runs gh auth logout. Overleaf and Zenodo
offer tools no way to revoke a token, so for them the command clears
the local copy and names the account page where you revoke the token
yourself; do that too, because clearing a local copy does not
invalidate a token that may have been copied elsewhere. A Zenodo token
is stored per project, so revoke zenodo clears one project’s slot
for one instance. A token moved out of an older container awaits your
decision in the dashboard, or with vaibify do decide-migrated-zenodo-token sSlot=<slot> sDecision=confirm|decline
(see External Resources).
Remote machines
vaibify remote DESTINATION [--port N]
Opens a dashboard for another machine over SSH: it starts or adopts a
hub there, forwards one loopback port, and opens a signed-in browser
tab. --port chooses that port; both ends use the same number.
Pressing Ctrl-C closes the tunnel and leaves the remote hub running.
vaibify remote-helper --port N is the far end of that connection and
is not for interactive use.
Install the same vaibify version on both machines. The helper refuses to drive a hub of another version and names both versions.
Vaibify must be on the remote user’s non-interactive PATH:
ssh DESTINATION vaibify --versionmust print a version (see Installing for remote access).DESTINATIONis a plain[user@]host. Proxy jumps, identity files, ports, and usernames belong in~/.ssh/config.There is no project option. You choose the project in the dashboard once the tunnel is up.
After a dropped connection, run
vaibify remoteagain. If exactly one session lost its browser, it is handed back to you; if several are waiting, you sign in fresh and choose.
Message |
Meaning |
|---|---|
“the remote produced no vaibify startup record” |
Usually the PATH problem above; check |
“…is version X and this is Y” |
The two installations differ. Upgrade one, or pass |
“…it is not a vaibify hub” |
Another program holds that port on the remote machine. Pass |
“port N is already in use on this machine” |
The local end of the forward is taken. Omit |
The tab says the session expired |
You were away longer than the hold window. Run |
A terminal session on the remote machine can leave a project needing
vaibify reconcile, which must run on that machine, so keep a way in
that does not depend on the tunnel. See
Connecting to External Resources.