The ridl toolchain facade — the porcelain layer (concept note §8.1,
docs/ROADMAP.md epic E1.13). The cargo/deno-style front door with humane
defaults: PATH defaults to the current directory.
ridl check and ridl build delegate to the ridlc library face;
ridl fmt runs the ridl-fmt formatter over .typl files (E1.14). The exit
code is 0 clean, 1 on a diagnostic error (or, for fmt --check, a file that
would change), and 2 on an input/output or usage error.
ridl diff compares two IR snapshots or source trees through the
ridl-diff engine (E2.8a). It carries its own exit contract — 0 compatible
or identical, 1 breaking, 2 error (concept note §9.1, ADR-0008 decision 9) —
and never touches ridlc's source→IR boundary beyond compiling each side.
ridl test runs the property suite over a workspace (E2.11a): the range
self-corpora derived from the E1.18 generators, and satisfiability sampling
of every require clause. It carries the same 0/1/2 exit contract, with 1
reserved for a self-corpus failure or an evaluation error.
ridl baseline and ridl check --baseline are the desk-time half of that
engine (E2.9, general form §6.3): baseline publishes one .ir.json
snapshot per package, and check compares the workspace against those
snapshots and warns (RIDL-407) when an interaction's ordinal moved. Both live
here rather than in ridlc because reading a workspace-local baseline is not
part of the source→IR function the tool qualification argument covers
(ADR-0008 decision 9).
ridl lsp and ridl mcp are the two stdio servers this one binary hosts:
the language server an editor drives (ridl-lsp) and the Model Context
Protocol server an agent drives (ridl-mcp). Both delegate every behavior
to their library and only wire the transport here, so one installed binary
serves the editor, the agent, and the command line.
ridl lock writes a package's interfaces.lock (lock design §5): plain, it
allocates a number to every interface that has none; with --rename or
--retire, it rewrites one package's entries in place. It lives here
beside ridl baseline because it reads and writes a file in the workspace
that is not a source (ridlc gains no lock subcommand); the compile it
runs first is ridlc's own.