Include weekly report and other prototype sources with project tooling config. Co-authored-by: Cursor <cursoragent@cursor.com>
4.9 KiB
4.9 KiB
Excalidraw 元素模板
只记录 Agent 写画布时最常用的最小字段。不要复制过大的完整元素样例;优先沿用现有画布里的同类元素字段,再按这里补关键字段。
通用规则
- 每个元素必须有唯一
id,推荐<timestamp>-<random>。 - 新元素设置
version: 1、新的versionNonce、当前毫秒updated。 - 默认
roughness: 0、opacity: 100、strokeStyle: "solid"。 - 删除元素时直接从
elements移除,不新写isDeleted: true。 - 修改绑定、容器、分组时同步检查引用是否存在。
基础形状
矩形、椭圆、菱形共用这类结构:
{
"id": "<id>",
"type": "rectangle",
"x": 100,
"y": 100,
"width": 200,
"height": 100,
"strokeColor": "#1e1e1e",
"backgroundColor": "#a5d8ff",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"roundness": { "type": 3 },
"seed": 100001,
"version": 1,
"versionNonce": 1234567890,
"updated": 1778336862857,
"groupIds": [],
"frameId": null,
"boundElements": null,
"link": null,
"locked": false
}
把 type 改为 ellipse 或 diamond 即可。圆角:直角用 roundness: null,圆角用 { "type": 3 }。
文本
{
"id": "<id>",
"type": "text",
"x": 100,
"y": 100,
"width": 220,
"height": 28,
"text": "标题",
"originalText": "标题",
"fontSize": 20,
"fontFamily": 3,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"autoResize": true,
"lineHeight": 1.25,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"roughness": 0,
"opacity": 100,
"seed": 100002,
"version": 1,
"versionNonce": 1234567890,
"updated": 1778336862857,
"groupIds": [],
"frameId": null
}
text 和 originalText 保持一致,且只放纯文本。
箭头与线
{
"id": "<id>",
"type": "arrow",
"x": 300,
"y": 150,
"width": 200,
"height": 0,
"points": [[0, 0], [200, 0]],
"startBinding": null,
"endBinding": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"strokeColor": "#1e1e1e",
"strokeWidth": 2,
"roughness": 0,
"opacity": 100,
"seed": 100003,
"version": 1,
"versionNonce": 1234567890,
"updated": 1778336862857,
"groupIds": [],
"frameId": null
}
线条用 type: "line",并把 endArrowhead 设为 null。
绑定到元素时:
{
"startBinding": { "elementId": "<source-id>", "focus": 0, "gap": 1 },
"endBinding": { "elementId": "<target-id>", "focus": 0, "gap": 1 }
}
同时在被绑定元素的 boundElements 中添加箭头引用。
原型节点
{
"id": "<id>",
"type": "embeddable",
"x": 100,
"y": 100,
"width": 1440,
"height": 900,
"link": "/?resourceType=prototype&resourceId=<prototype-id>&view=demo&sidebar=collapsed",
"customData": {
"title": "原型标题",
"previewUrl": "http://localhost:<port>/prototypes/<prototype-id>",
"openUrl": "/?resourceType=prototype&resourceId=<prototype-id>&view=demo&sidebar=collapsed",
"previewKind": "web",
"resourceType": "prototype",
"resourceId": "<prototype-id>",
"embedViewMode": "link",
"embedSizePreset": "desktop"
},
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"roughness": 0,
"opacity": 100,
"roundness": { "type": 3 },
"seed": 200001,
"version": 1,
"versionNonce": 1234567890,
"updated": 1778336862857,
"groupIds": [],
"frameId": null,
"boundElements": null
}
截图字段由运行时维护。不要手写 screenshotUrl,除非正在修复已有截图缓存。
文档节点
{
"id": "<id>",
"type": "embeddable",
"x": 500,
"y": 100,
"width": 420,
"height": 640,
"link": "/api/markdown-file?path=<url-encoded-absolute-path>",
"customData": {
"type": "axhub-doc",
"title": "文档标题",
"previewUrl": "/api/markdown-file?path=<url-encoded-absolute-path>",
"previewKind": "doc",
"resourceType": "doc",
"resourceId": "<doc-id>",
"embedViewMode": "link"
},
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"roughness": 0,
"opacity": 100,
"roundness": { "type": 3 },
"seed": 300001,
"version": 1,
"versionNonce": 1234567890,
"updated": 1778336862857,
"groupIds": [],
"frameId": null,
"boundElements": null
}
path 参数必须 URL 编码。
Frame
{
"id": "<id>",
"type": "frame",
"x": 80,
"y": 80,
"width": 600,
"height": 400,
"name": "功能模块",
"strokeColor": "#bbb",
"backgroundColor": "transparent",
"roughness": 0,
"opacity": 100,
"seed": 400001,
"version": 1,
"versionNonce": 1234567890,
"updated": 1778336862857,
"groupIds": [],
"frameId": null
}
子元素通过 frameId 引用 frame 的 id。
批注
给任意元素补:
{
"customData": {
"annotation": "这里需要确认",
"annotationUpdatedAt": "2026-05-11T09:00:00.000Z"
}
}