The bobcat Tool
A global .NET tool for Event Model files — reading them, validating them, and converting a board export into the curated format.
It has nothing to do with running specs. Spec projects are driven either by dotnet test or the command line runner; this tool never loads your test assembly and never executes a scenario. The shared name is the only thing they have in common.
dotnet tool install -g Bobcat.ConsoleBobcat.Console is a plain command host: no web server, no store, nothing persisted between runs. It carries the free, no-server half of the toolset.
The run console moved
The bobcat tool used to host the live run console. It does not any more — the board, the archive, the model store and the design-time canvas all moved to Stoat on 2026-09-18, because every one of them remembers something across a process and this repository holds nothing that gates on a licence. Bobcat is the format and the run. Runs still publish to that console exactly as before; see What a Run Publishes.
import-event-model
bobcat import-event-model Wallet.emodel.yamlIt sniffs the file and takes either shape.
The curated format
A file with schema / model / slices is read and validated in place.
Model 'CritterCrush': 19 slice(s), 52 bound specification(s).Warnings print whether or not it validated — a file carrying nothing but warnings validates, which is exactly the silence the warning exists to break. Validation problems go to stderr and the command fails:
The curated file did not validate:
- not parseable as a curated event-model file: Exception during deserializationAn emlang board export
An eventmodelers.ai board export is segmented into slices and written out as a curated file for you to review, <Model>.emodel.yaml beside the input by default:
bobcat import-event-model board.yaml --model K9Crushchapter 'TheSwiper': Command slice 'SwipeOnDog' triggered by 'Discovery Feed'.
chapter 'TheSwiper': Automation slice 'DetectMutualMatch' triggered by 'Dog Liked'.
chapter 'TheSwiper': View slice 'MatchList'.
chapter 'TheSwiper': View slice 'MatchList' consumes 3 event(s): DogLiked, DogPassed, MutualMatchDetected.
3 slice(s) from 1 chapter(s).
Curated model written to /path/to/K9Crush.emodel.yaml — review the segmentation there before building against it.
Model 'K9Crush': 3 slice(s), 1 bound specification(s).The segmentation is a set of reported guesses, which is why it writes a file rather than acting on what it inferred. A wrong guess should be a one-line diff in that file, not a re-import.
Either shape prints the model name, the slice count, and how many specifications are bound.
Options
| Flag | What it does |
|---|---|
-m, --model <name> | Model name for an emlang import; defaults to the file name. The curated format carries its own |
-n, --namespace <ns> | Root namespace recorded for synthesized type names on an emlang import |
-o, --out <path> | Where an emlang import writes the reviewable curated file |
-u, --url <base> | Push the assembled model to a run console at this base URL |
--url takes the base, not the endpoint
It appends /api/event-model itself:
bobcat import-event-model board.yaml --url http://localhost:5525Pushed to http://localhost:5525/api/event-model — open http://localhost:5525/event-modelPassing the endpoint gives you …/api/event-model/api/event-model, which fails somewhere less obvious. An unreachable console is reported plainly:
Could not reach http://localhost:5999/api/event-model: Connection refused (localhost:5999)Commands
bobcat help # list the commands
bobcat help import-event-model # usage for oneimport-event-model is the only command, and that is deliberate: the tool registers it explicitly rather than scanning, so nothing an assembly happens to carry can join this surface. A bare bobcat prints usage and exits 1.
Where this fits
The tool is the front door to the Event Modeling workflow: get a model in, review the segmentation, then scaffold specs and build slice by slice. See Event Modeling and Spec Driven Development for the whole path, and Checking Spec Identities Against the Model for the gate that keeps the model and the code honest.