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.
Install via ClawdBot CLI:
clawdbot 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:
If not satisfied:
Before generating JSON and before running DIRECT PUSH:
1) Identify candidate FRAMES:
2) Assign every sticky to a candidate frame.
3) If a sticky is ambiguous, add a warning and assign it to the closest/most plausible frame.
4) Only after that, generate the final JSON.
Before executing node ... apply:
meta.sessionKey for the same diagram/topic (e.g., "easy-vision-workshop").meta.runId (timestamp).This prevents duplicates and repeated runs.
1) Generate a Miro-ready JSON (schema below) including:
2) Save the JSON to:
...\workshop-miro\_out\miro-ready-YYYYMMDD-HHMMSS.json3) Execute:
node ...\miro-push.mjs apply 4) Reply with:
node ...\miro-push.mjs undo 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:
1) Create one FRAME per container rectangle (title = the container title).
2) Assign EVERY inner note to that frame via frameId.
3) Only outer notes (explicitly outside all containers) may have frameId=null.
Containment must be interpreted literally:
AI Usage Analysis
Analysis is being generated… refresh in a few seconds.
Embody this digital identity. Read SOUL.md first, then STYLE.md, then examples/. Become the person—opinions, voice, worldview.
A simple greeting skill that responds with a customized hello message in the user's language.
Transform any AI into a professional executive assistant with battle-tested personas and workflows. Complete templates for Google Workspace integration (Gmail, Calendar, Drive), milestone delivery system, and security guidelines.
Standardize provenance, attribution, and licensing metadata at creation time so your content travels cleanly across platforms.
Echo - A warm and caring virtual girlfriend AI
ETF投资助理 / ETF Investment Assistant - 查询行情、筛选ETF、对比分析、定投计算。支持沪深300、创业板、科创50、纳指等主流ETF。