ridl-cli 0.2.0

The `ridl` command-line toolchain: check, build, fmt, lock, diff, lsp, and mcp, over the shared compiler crates.
ridl-cli-0.2.0 is not a library.

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.