Install
openclaw skills install ec-pm-visualizerVisualizes Product Manager thoughts (Why, What, How, User Journey) into an editable Excalidraw diagram. Use when the user asks to "visualize specs", "create a PM diagram", or "map out product thoughts".
openclaw skills install ec-pm-visualizerThis skill converts unstructured Product Manager thoughts into a structured Excalidraw visualization.
Analyze Request: Extract the following sections from the user's prompt or context:
Prepare Data: Create a JSON file (e.g., temp_visual_data.json) with this structure:
{
"title": "Feature Name",
"why": ["Reason 1", "Reason 2"],
"what": ["Feature 1", "Feature 2"],
"how": ["Tech 1", "Tech 2"],
"journey": ["Step 1", "Step 2", "Step 3"]
}
Generate Diagram: Run the python script to generate the .excalidraw file.
python3 ~/clawd/skills/thought-to-excalidraw/scripts/layout_diagram.py /tmp/visual_data.json /tmp/diagram.excalidraw
Render to PNG: Convert to image for delivery.
node ~/clawd/skills/excalidraw/scripts/render.js /tmp/diagram.excalidraw /tmp/diagram.png
Deliver Based on Context:
message(action="send", filePath="/tmp/diagram.png")Cleanup: Delete temporary files.
NEVER just create a .excalidraw file and tell the user to open it. Always render to PNG and send inline.
User: "Visualize a new 'Login with Google' feature. Why? Reduce friction. What? Google button on login page. How? OAuth2. Journey: User clicks button -> Google Popup -> Redirect to Dashboard."
Workflow:
/tmp/login_spec.json:
{
"title": "Login with Google",
"why": ["Reduce friction", "Increase conversion"],
"what": ["Google Sign-in Button", "Profile Sync"],
"how": ["OAuth 2.0 Flow", "Google Identity SDK"],
"journey": ["User clicks 'Sign in with Google'", "Google permissions popup appears", "User approves access", "System verifies token", "User redirected to Dashboard"]
}
python3 ~/clawd/skills/thought-to-excalidraw/scripts/layout_diagram.py /tmp/login_spec.json /tmp/login.excalidrawnode ~/clawd/skills/excalidraw/scripts/render.js /tmp/login.excalidraw /tmp/login.pngmessage(action="send", filePath="/tmp/login.png", caption="Login with Google - PM Visualization")