Install
openclaw skills install @simoneferrario/miro-workshop-assistantWorkshop photos/notes -> an editable Miro diagram (real FRAMES as containers + stickies + connectors) with idempotent dedupe, rollback, undo and change commands, using the local script miro-push.mjs and env vars.
openclaw skills install @simoneferrario/miro-workshop-assistantProduce a workshop output on Miro that is:
A “workshop container” must be a FRAME when:
Do NOT create a frame if:
If the image contains >=2 titled containers:
Before generating JSON and before running DIRECT PUSH:
Before executing node ... apply:
meta.sessionKey for the same diagram/topic (e.g., "easy-vision-workshop").meta.runId (timestamp)....\workshop-miro\_out\miro-ready-YYYYMMDD-HHMMSS.jsonnode ...\miro-push.mjs apply <PATH_JSON>node ...\miro-push.mjs undo <sessionKey>Note: fine-grained edits (delete/update a single sticky) are a next step if the script supports them. Otherwise, recommended: full regeneration with the same sessionKey (cleaner and usually faster).
Create a connector when:
Default connector shape: "elbowed" (more readable for architecture diagrams).
Goal: avoid connectors crossing over stickies/notes.
{ "meta": { "title": "string", "source": "photo|notes", "language": "it|de|en", "createdAt": "ISO-8601", "sessionKey": "string (stable)", "runId": "string (unique)" }, "frames": [ { "id": "F1", "title": "string", "x": 0, "y": 0, "w": 1400, "h": 900 } ], "stickies": [ { "id": "S1", "frameId": "F1|null", "text": "string", "color": "light_yellow|light_blue|light_green|light_pink|gray", "x": 0, "y": 0, "unclear": false } ], "connectors": [ { "from": "S1", "to": "S2", "label": "string|null", "shape": "straight|elbowed|curved" } ], "warnings": [ "string" ] }
A "container" is a large rectangle that encloses other notes and has a title (e.g. "Product A", "Product B").
You MUST do this:
Containment must be interpreted literally: