svugy-cli 0.2.0

Command line for svugy: text in, an isometric SVG you can click into
# svugy model JSON

The shape `svugy import FILE -o model.json` writes and `render`, `validate` and `import` read. It says what the Markdown says, with every REF resolved to a whole path.

```json
{
  "view": "top",
  "elements": {
    "web": { "label": "Web app" },
    "shop": { "label": "Shop backend" },
    "shop.api": { "label": "api", "caption": "REST" }
  },
  "workflows": [
    {
      "id": "checkout",
      "title": "A customer pays",
      "subtitle": "from cart to charged card",
      "description": "What happens between [the web app](#web) …",
      "overrides": {
        "shop": { "child_placement": "row" },
        "web": { "position": { "x": 0.0, "y": 40.0 } }
      },
      "edges": [
        { "from": "web", "to": "shop.api", "ordinal": 0, "label": "places order", "traveler": "envelope" }
      ],
      "steps": [
        {
          "id": "order",
          "title": "The shop takes the order",
          "description": "[The API](#shop.api) saves the cart …",
          "items": [
            { "edge": { "from": "web", "to": "shop.api", "ordinal": 0 } },
            { "element": "shop" }
          ]
        }
      ]
    }
  ]
}
```

- Root keys: `view` (optional), `elements`, `workflows` (≥ 1, in display order).
- `elements`: keyed by path; fields as v3, without `position` and `child_placement`.
- Workflow: `id`, `title`, `steps` (≥ 1) required; `subtitle`, `description`, `overrides`, `edges` optional.
- `overrides`: keyed by path; any of `caption`, `shape`, `height`, `style`, `child_placement`, `position`, `link`, `code`, `metadata`. `style` and `metadata` merge entry by entry over the element's.
- `edges`: v3 edge objects, `{from, to, ordinal}` unique within the workflow. Every edge is listed by at least one step.
- Step: `id`, `title`, `items` (≥ 1) required; `description` optional. An item is `{"edge": {from, to, ordinal}}`, naming an edge of the workflow, or `{"element": PATH}`.
- `span` fields are optional byte ranges into the source an importer read.
- Errors naming their fix: root `title`, `subtitle`, `description`, `legend` or `edges`; element `position` or `child_placement`.