Every authoring command is non-interactive, takes --env <name>, and accepts --json for machine-readable output. All of them exit non-zero on failure.
Invoke it as npx @burn0/silo. An unrelated package named silo exists on the public registry, so npx silo can fetch and run that instead.
Environments
init also writes .silo/tsconfig.json if you do not already have one. It never overwrites an existing config.
See Templates for what each one contains, and Validation for reading validate’s findings.
Data
Raw facts, stored as data/<name>.json.
More in Data.
Tasks
Objectives, stored as tasks/<id>.json.
More in Tasks.
TypeScript the agent can call.
A snake_case tool name becomes a kebab-case file and a camelCase export. --state overrides the detected state type name, which is only needed if you did not keep it as State.
More in Tools.
Verifiers
TypeScript that decides success.
More in Verifiers.
Running
--runs repeats the same task from a fresh world each time and reports the pass rate, which is the only honest way to read a non-deterministic agent.
More in Running a Simulation.
Scaffolding never writes logic
tool add and verifier add generate a compiling stub and register it in the barrel. They never write business logic — the stub throws or fails on purpose, so an unimplemented resource can never look like a working one.
Implement the TODO they leave behind, then run env validate.
Exit codes and --json
Every command exits non-zero on failure and prints a stable error code alongside its message:
--json works on all authoring commands, which is what makes the CLI drivable by a script or a coding agent:
See Error Codes for the full list.