openclaw 网盘下载
OpenClaw

技能详情(站内镜像,无评论)

首页 > 技能库 > Excalidraw Diagram Generator

Generate hand-drawn style diagrams, flowcharts, and architecture diagrams as PNG images from Excalidraw JSON

媒体与内容

许可证:MIT-0

MIT-0 ·免费使用、修改和重新分发。无需归因。

版本:v1.0.0

统计:⭐ 11 · 5.3k · 26 current installs · 30 all-time installs

11

安装量(当前) 30

🛡 VirusTotal :良性 · OpenClaw :可疑

Package:a-anand-91119/excalidraw

安全扫描(ClawHub)

  • VirusTotal :良性
  • OpenClaw :可疑

OpenClaw 评估

The skill appears to implement an Excalidraw→PNG renderer and contains reasonable rendering code, but the package metadata and runtime instructions are inconsistent (missing declared runtime/install requirements and an install script that fetches external assets), so the package should be reviewed before use.

目的

The code, package.json, and dependencies (@resvg/resvg-js, jsdom, roughjs) match the stated purpose (render Excalidraw JSON to PNG). However the registry metadata claims 'instruction-only / no install spec' and lists no required binaries, while the runtime instructions and included scripts clearly expect Node/npm and include a setup.sh — this mismatch is an incoherence (runtime requires node/npm but these are not declared).

说明范围

SKILL.md directs the agent to write JSON to /tmp and run the provided node renderer; that stays within the stated purpose. The SKILL.md does not instruct running the included setup.sh (which installs dependencies and downloads fonts), so the runtime instructions omit necessary setup steps — another inconsistency. The renderer reads input files you pass and local font files; it does not attempt network calls during render.js execution.

安装机制

There is no formal install spec in registry metadata, but a shipped setup.sh performs 'npm install' and downloads fonts from jsdelivr and GitHub releases. The network sources are standard public CDNs/GitHub (not a mysterious personal server), and npm packages are common rendering libs. Still, a missing install spec plus a script that downloads and extracts archives is an install-surface risk worth noting.

证书

The skill does not request any environment variables, credentials, or special config paths. The renderer reads files supplied as input and fonts from its own fonts directory — proportional to its purpose. There are no declared or used credentials.

持久

The skill does not request always:true, does not alter other skills, and only modifies files within its own directory (setup.sh creates fonts dir and makes render.js executable). It does not request elevated or persistent system-wide privileges.

安装(复制给龙虾 AI)

将下方整段复制到龙虾中文库对话中,由龙虾按 SKILL.md 完成安装。

请把本段交给龙虾中文库(龙虾 AI)执行:为本机安装 OpenClaw 技能「Excalidraw Diagram Generator」。简介:Generate hand-drawn style diagrams, flowcharts, and architecture diagrams as PN…。
请 fetch 以下地址读取 SKILL.md 并按文档完成安装:https://raw.githubusercontent.com/openclaw/skills/refs/heads/main/skills/a-anand-91119/excalidraw/SKILL.md
(来源:yingzhi8.cn 技能库)

SKILL.md

打开原始 SKILL.md(GitHub raw)

---
name: excalidraw
description: Generate hand-drawn style diagrams, flowcharts, and architecture diagrams as PNG images from Excalidraw JSON
---

# Excalidraw Diagram Generator

Generate beautiful hand-drawn style diagrams rendered as PNG images.

## Workflow

1. **Generate JSON** — Write Excalidraw element array based on what the user wants
2. **Save to file** — Write JSON to `/tmp/<name>.excalidraw`
3. **Render** — `node <skill_dir>/scripts/render.js /tmp/<name>.excalidraw /tmp/<name>.png`
4. **Send** — Send the PNG via message tool with `filePath`

## Quick Reference

```bash
node <skill_dir>/scripts/render.js input.excalidraw output.png
```

## Element Types

| Type | Shape | Key Props |
|------|-------|-----------|
| `rectangle` | Box | x, y, width, height |
| `ellipse` | Oval | x, y, width, height |
| `diamond` | Decision | x, y, width, height |
| `arrow` | Arrow | connects shapes (see Arrow Binding below) |
| `line` | Line | x, y, points: [[0,0],[dx,dy]] |
| `text` | Label | x, y, text, fontSize, fontFamily (1=hand, 2=sans, 3=code) |

### Styling (all shapes)

```json
{
  "strokeColor": "#1e1e1e",
  "backgroundColor": "#a5d8ff",
  "fillStyle": "hachure",
  "strokeWidth": 2,
  "roughness": 1,
  "strokeStyle": "solid"
}
```

**fillStyle**: `hachure` (diagonal lines), `cross-hatch`, `solid`
**roughness**: 0=clean, 1=hand-drawn (default), 2=very sketchy

## Arrow Binding (IMPORTANT)

**Always use `from`/`to` bindings for arrows.** The renderer auto-calculates edge intersection points — no manual coordinate math needed.

### Simple arrow (straight, between two shapes)
```json
{"type":"arrow","id":"a1","from":"box1","to":"box2","strokeColor":"#1e1e1e","strokeWidth":2,"roughness":1}
```
That's it. No x, y, or points needed. The renderer computes start/end at shape edges.

### Multi-segment arrow (routed path with waypoints)
For arrows that need to go around obstacles, use `absolutePoints` with intermediate waypoints:
```json
{
  "type":"arrow","id":"a2","from":"box3","to":"box1",
  "absolutePoints": true,
  "points": [[375,500],[30,500],[30,127],[60,127]],
  "strokeColor":"#1e1e1e","strokeWidth":2,"roughness":1
}
```
- First point = near source shape edge (will snap to actual edge)
- Last point = near target shape edge (will snap to actual edge)
- Middle points = absolute waypoint coordinates for routing

### Arrow labels
Place a separate text element near the arrow midpoint:
```json
{"type":"text","id":"label","x":215,"y":98,"width":85,"height":16,"text":"sends data","fontSize":10,"fontFamily":1,"strokeColor":"#868e96"}
```

### Arrow styles
- `"strokeStyle":"dashed"` — dashed line
- `"startArrowhead": true` — bidirectional arrow

## Template: Flowchart with Bindings

```json
{
  "type": "excalidraw",
  "version": 2,
  "elements": [
    {"type":"rectangle","id":"start","x":150,"y":50,"width":180,"height":60,"strokeColor":"#1e1e1e","backgroundColor":"#b2f2bb","fillStyle":"hachure","strokeWidth":2,"roughness":1},
    {"type":"text","id":"t1","x":200,"y":65,"width":80,"height":30,"text":"Start","fontSize":20,"fontFamily":1,"strokeColor":"#1e1e1e"},

    {"type":"arrow","id":"a1","from":"start","to":"decision","strokeColor":"#1e1e1e","strokeWidth":2,"roughness":1},

    {"type":"diamond","id":"decision","x":140,"y":170,"width":200,"height":120,"strokeColor":"#1e1e1e","backgroundColor":"#ffec99","fillStyle":"hachure","strokeWidth":2,"roughness":1},
    {"type":"text","id":"t2","x":185,"y":215,"width":110,"height":30,"text":"Condition?","fontSize":18,"fontFamily":1,"strokeColor":"#1e1e1e","textAlign":"center"},

    {"type":"arrow","id":"a2","from":"decision","to":"process","strokeColor":"#1e1e1e","strokeWidth":2,"roughness":1},

    {"type":"rectangle","id":"process","x":150,"y":350,"width":180,"height":60,"strokeColor":"#1e1e1e","backgroundColor":"#a5d8ff","fillStyle":"hachure","strokeWidth":2,"roughness":1},
    {"type":"text","id":"t3","x":190,"y":365,"width":100,"height":30,"text":"Process","fontSize":20,"fontFamily":1,"strokeColor":"#1e1e1e"}
  ]
}
```

## Layout Guidelines

- **Node size**: 140-200 × 50-70 px
- **Diamond**: 180-200 × 100-120 px (taller for text)
- **Vertical spacing**: 60-100 px between nodes
- **Horizontal spacing**: 80-120 px between nodes
- **Text**: Position inside shape manually (offset ~15-30px from top-left of shape)
- **Arrow labels**: Place as separate text elements near midpoint of arrow path

## Color Palette

**Fills**: `#a5d8ff` (blue), `#b2f2bb` (green), `#ffec99` (yellow), `#ffc9c9` (red), `#d0bfff` (purple), `#f3d9fa` (pink), `#fff4e6` (cream)
**Strokes**: `#1e1e1e` (dark), `#1971c2` (blue), `#2f9e44` (green), `#e8590c` (orange), `#862e9c` (purple)
**Labels**: `#868e96` (gray, for annotations)

## Tips

- Every element needs a unique `id` (required for binding!)
- Use `from`/`to` on arrows — don't calculate coordinates manually
- `roughness:0` for clean diagrams, `1` for sketchy feel
- Text `fontFamily:1` for hand-drawn, `3` for code
- Group related elements spatially, color-code by type
- For nested layouts, use a large background rectangle as a container