TheDocumentation Index
Fetch the complete documentation index at: https://docs.cerulion.com/llms.txt
Use this file to discover all available pages before exploring further.
cerulion binary groups all functionality under top-level commands: workspace, node, graph, topic, schema, tui, trace, and clean.
Synopsis notation uses <required>, [optional], {a|b} (choice), and ... (repeatable). Synopsis lines are not directly runnable; each command includes a separate runnable example.
Global
| Flag | Long | Type | Default | Meaning |
|---|---|---|---|---|
| verbose | --verbose | bool | false | Enable debug-level logging. Long form only — there is no -v. Applies to every subcommand. |
cerulion prints Error: <msg> to stderr and exits with a failure code.
Most commands require a workspace, discovered by walking upward for a Cargo.toml containing [workspace] plus a graphs/ directory. workspace create/init, tui, trace, and clean do not require discovery. topic * uses iceoryx2 discovery and needs no workspace.
workspace
cerulion workspace create
cerulion workspace create
| Arg / flag | Value name | Type | Default | Meaning |
|---|---|---|---|---|
| name (positional) | <name> | String | — | Required. Workspace directory to create at ./<name>/. |
./<name>/ with graphs/, nodes/, schemas/, Cargo.toml ([workspace], members=["nodes/*"], resolver="2", workspace dependencies for cerulion_core and native_ros2_messages), and .cargo/config.toml. Errors if ./<name> already exists. Prints Created workspace at <path>.cerulion workspace init
cerulion workspace init
| Arg / flag | Value name | Type | Default | Meaning |
|---|---|---|---|---|
| location (positional) | [location] | String | . | Directory to initialize in place (defaults to the current directory). |
location. Errors if a Cargo.toml with [workspace] already exists there. The workspace name is the directory’s file name (fallback cerulion_ws). Prints Initialized workspace at <path>.node
Subcommands:create, delete, modify, build, stage, run, list, info. All require workspace discovery.
cerulion node create
cerulion node create
| Flag | Short/Long | Value names | Type | Default | Meaning |
|---|---|---|---|---|---|
| node type | (positional) | <node_type> | String | — | Required. Becomes folder nodes/<node_type>/ and (PascalCased) the struct name. Validated: non-empty, alphanumeric/underscore, must not start with a digit. |
| output port | -o / --output | SCHEMA NAME | 2 values | — | Add one output port. Both SCHEMA and NAME required. At most one -o per create. |
| input port | -i / --input | SCHEMA NAME | 2 values | — | Add one regular input. Both required. At most one -i per create. |
| trigger input | -T / --trigger-input | SCHEMA NAME | 2 values | — | Add a trigger input → field emitted as #[input(trigger)], policy set to data_trigger=<NAME>. Both required. At most one -T per node. |
| policy | --policy | SPEC | String | (defaulting rules) | Trigger policy. See Trigger policies. |
| raw FFI | --raw-ffi | — | bool | false | Generate the raw extern "C" FFI template instead of the #[cerulion_node] macro template. |
sensor_msgs/Image (slash, canonical) and sensor_msgs::Image (colon) forms; canonicalized to slash. Output prints Created node type '<node_type>'.Generated files: nodes/<type>/Cargo.toml (cdylib, cdylib feature default) and nodes/<type>/src/lib.rs (macro or raw-FFI). Nothing is added to the workspace Cargo.toml if it already uses the "nodes/*" glob (the default).Validation errors (clean messages, no panic): passing a flag twice; -T name colliding with -i name; --policy data_trigger=NAME not matching a declared input; a source-only node (no -i/-T) without an explicit non-data --policy.cerulion node delete
cerulion node delete
| Arg | Value name | Type | Meaning |
|---|---|---|---|
| node type (positional) | <node_type> | String | Required. Node type to delete. |
nodes/<node_type>/ (recursive) and the workspace member entry. Errors NodeNotFound if absent. Prints Deleted node type '<node_type>'.cerulion node modify
cerulion node modify
| Flag | Short/Long | Value names | Notes |
|---|---|---|---|
| node type | (positional) | <node_type> | Required. Node type to modify. |
| input port | -i / --input | SCHEMA NAME | Add a regular input. At most one per call. |
| trigger input | -T / --trigger-input | SCHEMA NAME | Add a trigger input (#[input(trigger)]) and set policy data_trigger=<NAME>, clearing conflicting node-level policy args. At most one per call. |
| output port | -o / --output | SCHEMA NAME | Add an output. At most one per call. |
| policy | --policy | SPEC | Set/replace the trigger policy. data_trigger=NAME requires NAME to be an existing input or one added in the same call. |
src/lib.rs in place (preserves the tick body, comments, and other fields). -T and --policy data_trigger=NAME are equivalent; supplying both requires they agree. Prints per-action lines, e.g. Added input 'image' to 'detector' as the data trigger, Set policy=period_ms=33 on 'detector', Promoted existing input 'x' to data trigger on 'detector'.--ext-trigger flag and no --no-trigger flag. The only user surface for setting external triggering is --policy external.cerulion node build
cerulion node build
| Flag | Long | Type | Default | Meaning |
|---|---|---|---|---|
| node type | (positional) | <node_type> | — | Required. Node type to build. |
| release | --release | bool | false | Build in release mode. |
cargo build -p <node_type> (adds --release if set) in the workspace root. Errors BuildFailed (with cargo stderr) on failure. Prints Built '<node_type>'.cerulion node stage
cerulion node stage
| Flag | Short/Long | Value names | Type | Default | Meaning |
|---|---|---|---|---|---|
| node type | (positional) | <node_type> | String | — | Required. Node type to stage. |
| id | -i / --id | — | Option<String> | node_type | Node instance ID (defaults to the node type). |
| graph | -g / --graph | — | Option<String> | auto | Target graph. If omitted: auto-selects the sole graph; errors if 0 or more than 1 exist. |
| prefix | -p / --prefix | — | Option<String> | — | Parsed but currently ignored in the handler. Topic prefix resolution lives on the graph, not here. |
| input binding | -I | NAME SOURCE | 2 values, repeatable | — | Wire input NAME to SOURCE. [node,port] form → node/port; node/port passes through. |
Staged '<type>' into graph '<graph>'.cerulion node run
cerulion node run
| Flag | Short/Long | Type | Default | Meaning |
|---|---|---|---|---|
| node type | (positional) | String | — | Required. Node type to run. |
| prefix | -p / --prefix | Option<String> | standalone | Topic prefix. |
| id | -i / --id | Option<String> | node_type | Instance ID. |
__temp_<type>, stages the node, runs it (not real-time, validation skipped), and deletes the temp graph YAML on exit. Ctrl+C stops it.cerulion node list
cerulion node list
TYPE INPUTS OUTPUTS POLICY (counts plus a short policy label). Empty workspace prints No nodes found.cerulion node info
cerulion node info
| Arg | Value name | Type | Meaning |
|---|---|---|---|
| node type (positional) | <node_type> | String | Required. Node type to inspect. |
Node type, Policy, and Inputs:/Outputs: (name plus schema or (untyped)). Metadata is parsed from src/lib.rs — the source is the single source of truth; there is no sidecar YAML.Policy short labels: period <N>ms, deadline <N>ms, sync <N>ms, sync ∞ (unbounded), external, trigger:<input>, - (none).graph
Subcommands:create, run, validate, list.
cerulion graph create
cerulion graph create
| Flag | Short/Long | Type | Default | Meaning |
|---|---|---|---|---|
| name | (positional) | String | — | Required. Graph name → graphs/<name>.yaml. |
| prefix | -n / --prefix | Option<String> | — | Topic prefix. If omitted, the prefix: line is omitted from the file and resolved to the hostname (without .local) at load time. |
graphs/<name>.yaml. Errors if the graph already exists. Prints Created graph '<name>'.cerulion graph run
cerulion graph run
| Flag | Form | Type | Default | Meaning |
|---|---|---|---|---|
| name | (positional) | String | — | Required. Graph to run. |
| real-time | --real-time, --real-time true, --real-time false | bool | true | Drive the sim clock from wall time with a ~1 ms sleep cadence. Bare --real-time is equivalent to --real-time true. Default ON. |
| no real-time | --no-real-time | bool | false | Full-speed, no 1 ms pacing (benches/replay). Wins if both passed. Equivalent to --real-time false. |
| no validate | --no-validate | bool | false | Skip pre-run workspace validation. |
run. The environment variable CERULION_CPU_DMA_LOCK=1 acquires a CPU DMA latency lock for the run (best-effort; warns on failure). graph run also runs an iceoryx2 dead-node cleanup at start.cerulion graph validate
cerulion graph validate
| Arg | Value name | Type | Meaning |
|---|---|---|---|
| name (positional) | <name> | String | Required. Graph to validate. |
cerulion graph list
cerulion graph list
*.yaml), sorted. Empty prints No graphs found.topic
Uses iceoryx2 service discovery — enumerates services ending in/data (Cerulion creates {topic}/data and {topic}/event per topic). No workspace required.
cerulion topic list
cerulion topic list
TOPIC. Empty prints No active topics.cerulion topic info
cerulion topic info
| Arg | Value name | Type | Meaning |
|---|---|---|---|
| topic (positional) | <topic> | String | Required. Topic to inspect. |
cerulion topic echo
cerulion topic echo
| Arg | Value name | Type | Meaning |
|---|---|---|---|
| topic (positional) | <topic> | String | Required. Topic to subscribe to. |
std_msgs/String and sensor_msgs/Image (by FNV-1a schema hash); hex preview otherwise.cerulion topic hz
cerulion topic hz
| Arg | Value name | Type | Meaning |
|---|---|---|---|
| topic (positional) | <topic> | String | Required. Topic to measure. |
schema
Subcommands:create, delete, info.
cerulion schema create
cerulion schema create
| Arg | Value name | Type | Meaning |
|---|---|---|---|
| name (positional) | <name> | String | Required. Schema name → schemas/<PascalName>.yaml. |
schemas/<PascalName>.yaml with a schemas: skeleton (description plus a fields: comment). Errors if the schema exists. Prints Created schema '<name>'.cerulion schema delete
cerulion schema delete
| Arg | Value name | Type | Meaning |
|---|---|---|---|
| name (positional) | <name> | String | Required. Schema to delete. |
schemas/<name>.yaml. Errors SchemaNotFound. Prints Deleted schema '<name>'.cerulion schema info
cerulion schema info
| Arg | Value name | Type | Meaning |
|---|---|---|---|
| name (positional) | <name> | String | Required. Schema name. Accepts qualified ROS2 names like sensor_msgs::Image. |
.msg lookup at ../native_ros2_messages/msg/<pkg>/<Type>.msg (for qualified names); prints fields, Rust types, and min wire size. Falls back to a workspace YAML schema (prints Schema, Description, Fields, Hash: 0x...).tui
trace inspect
| Flag | Short/Long | Value name | Type | Default | Meaning |
|---|---|---|---|---|---|
| dir | (positional) | <dir> | String | — | Required. Directory of trace_*.jsonl bag files. |
| filter | -t / --filter | TOPIC | Option<String> | — | Filter by exact topic. |
| limit | -n / --limit | N | Option<usize> | — | Limit the number of records. |
| reverse | -r / --reverse | — | bool | false | Reverse order (most-recent first). |
trace_*.jsonl bag files (lexicographic order) and prints <topic> seq=<N> t=<ts>ns schema=0x<HASH> per record.