← Back to Documentation

CLI Reference

Every aro subcommand, what it is for, and the flags worth knowing.

Every command

CommandWhat it does
aro run <path>Run an application in the interpreter
aro debug <path>Step-debug: pause at every statement, inspect, continue
aro build <path>Compile to a native binary through LLVM
aro compile <path>Compile and report diagnostics, without linking
aro check <path>Check sources for errors and warnings
aro diff <range>Compare feature-set graphs between two revisions
aro test <path>Run the colocated tests — add --compiled to run them through a native binary
aro replInteractive read-eval-print loop
aro kernelThe native Jupyter kernel, and its installer
aro new pluginScaffold a plugin in Swift, Rust, C, C++, Python or ARO
aro add <source>Install a plugin from a Git repository
aro remove <name>Uninstall a plugin
aro pluginsList installed plugins
aro actionsList every registered action, and optionally every qualifier
aro lspStart the Language Server over stdio
aro mcpStart ARO as an MCP server for LLM tooling
aro askLocal-model coding assistant that can read, write and test ARO
aro uiOpen Solaro, the ARO desktop UI, at a project path

Piping works too — source on stdin is evaluated directly:

echo 'Log "Hi" to the <console>.' | aro

Running and checking

aro run ./MyApp                     # interpret
aro run ./MyApp -- --port 8080      # arguments after -- reach the application
aro check ./MyApp                   # errors, warnings, and per-route body analysis
aro check ./MyApp --no-warnings     # errors only
aro test ./MyApp --filter pricing   # run the tests whose name matches
aro test ./MyApp --compiled         # run the same tests through a native binary

Arguments the application reads

Application-Start declares the positionals it reads with the same takes clause user-defined actions use (ARO-0047), so a tool does not have to be invoked entirely in flags:

(Application-Start: Crawler takes <url> <depth>) {
    Extract the <site>  from the <parameter: url>.
    Extract the <args>  from the <parameter: arguments>.   # the whole list
    Return an <OK: status> for the <startup>.
}
./crawler https://example.com 3     # positional
./crawler --url https://example.com # a flag of the same name wins

One trap, and it predates positionals

--key value consumes the token after it, so --verbose https://x binds verbose to the URL. Write --verbose=true, or put -- before the positionals, to mean two things.

Building a binary

aro build ./MyApp                   # native binary, static Swift runtime
aro build ./MyApp --release         # optimize + size + strip
aro build ./MyApp --emit-llvm       # LLVM IR text instead of a binary
aro build ./MyApp --dynamic         # ship libswift*.so beside the binary (rpath=$ORIGIN)
aro build ./MyApp --sign '-' --hardened-runtime

--static is the default and produces one self-contained file. On Linux, Foundation still links dynamically.

Comparing two revisions

aro diff compares the feature graph — nodes are feature sets, wires are events, Application.<Name> calls and repository observers — rather than lines of text. It is derived with the runtime's own matching rules, so what it shows is what the event bus will actually wire up:

aro diff --graph main..my-branch
aro diff --graph main..my-branch --html report.html

Plugins

aro new plugin my-csv --lang rust --actions --qualifiers
aro new plugin my-workflows --lang aro
aro add github:org/repo
aro plugins
aro remove my-csv

--lang is required: swift, rust, c, cpp, python or aro.

Interactive and notebook

aro repl                 # terminal REPL
aro repl --json          # line-delimited JSON on stdio, for front-ends
aro kernel install       # register the native Jupyter kernel (ZMQ, no Python)

Editor and assistant integration

aro lsp                  # Language Server over stdio
aro mcp                  # MCP server for LLM tooling
aro ask "add a rate limit to createOrder"
aro ui ./MyApp           # open Solaro at this project

aro lsp, aro mcp, aro ask and aro kernel are available on macOS and Linux; they are not built for Windows.

Discovering the language from the CLI

aro actions                    # all 71 built-in actions, with roles and prepositions
aro actions --qualifiers       # and every registered Compute qualifier
aro actions Retrieve           # one action in detail
aro actions --format json      # machine-readable, for tooling

Learn More

Each command's own --help is authoritative and always current. For the step debugger see The ARO Debugging Guide; for notebooks see Jupyter Notebooks.