feat(excalidraw): improve board tabs and canvas controls · zai-org/zcode-plugins@4acdd7f · GitHub
Skip to content

Commit 4acdd7f

Browse files
author
ZCode Marketplace Bot
committed
feat(excalidraw): improve board tabs and canvas controls
Source-Commit: 7b29664ded703fbc52446d2545dd835b629fe6b4
1 parent 660ca28 commit 4acdd7f

20 files changed

Lines changed: 884 additions & 78 deletions

File tree

‎external_plugins/excalidraw/.zcode-plugin/plugin.json‎

Lines changed: 1 addition & 1 deletion

‎external_plugins/excalidraw/README.md‎

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,23 @@ pnpm install --frozen-lockfile
1515
pnpm build
1616
```
1717

18-
在 ZCode 插件商店添加 `dist/local-marketplace` 的绝对路径作为本地 marketplace 来源,安装并启用 `excalidraw`。不要添加仓库根目录,其官方来源名称属于保留名称。源码更新后重新构建、刷新来源、重新安装插件,并在新会话测试。发布时使用 `dist/external_plugins/excalidraw/<version>/plugin.zip`。MCP 与编辑器已打包,运行时无需安装 npm 依赖。当前交互面板支持桌面本地工作区;其他平台使用宿主普通 MCP 记录回退。
18+
在 ZCode 插件商店添加 `dist/local-marketplace` 的绝对路径作为本地 marketplace 来源,安装并启用 `excalidraw`。不要添加仓库根目录,其官方来源名称属于保留名称。源码更新后重新构建、刷新来源、重新安装插件,并在新会话测试。发布时使用 `dist/plugins/excalidraw/<version>/plugin.zip`。MCP 与编辑器已打包,运行时无需安装 npm 依赖。当前交互面板支持桌面本地工作区;其他平台使用宿主普通 MCP 记录回退。
1919

2020
启用后可发送:“用 Excalidraw 画一个 API、缓存和数据库的架构图”。生成结果会打开侧栏。手工修改自动保存;选中元素后右键“引用选区到对话”,再发送指令,Agent 可以按稳定元素 ID 修改。未选中元素时可引用整图,文档菜单中也提供引用入口。
2121

22-
点击顶部画板标题可新建、导入或切换文档;“导出”打开格式与文件路径对话框,支持 `.excalidraw`、PNG、SVG。导出路径相对于当前工作区,覆盖已有文件需勾选“覆盖同名文件”。画布下方只保留 Excalidraw 自身的缩放、撤销/重做控件。
22+
顶部左侧的三横线图标是「菜单」,可新建、导入、重命名或切换文档;旁边「+」可直接新建,右侧向下箭头图标可导出。这三个按钮使用统一的圆角方形样式,悬停可查看名称。画板名称统一显示在标签页中,只有 1 张画板时也显示;最近打开的最多 8 张画板在顶部同一行显示,位于「+」与保存状态之间。空间不足时,鼠标停在标签区域滚动滚轮即可左右移动,触控板横向滚动也可使用;点击标签切换画板。双击当前标签名称可重命名,也可从菜单选择重命名或在当前标签按 F2。名称在保存确认后同步更新,保留画板 ID、内容和当前撤销历史。空画板以 100% 缩放打开。
23+
24+
标签右侧「×」只关闭标签,不删除画板,可随时从菜单重新打开。关闭当前标签时先等待保存,再切到相邻标签;关闭最后一个标签后显示空画布。保存失败时保留标签和草稿。关闭状态随标签列表在会话内恢复,旧工具结果不会自动重新打开已关闭的标签。
25+
26+
打开、切换或重命名画板后,插件通过 `updateModelContext` 将当前画板 ID、名称、版本加入当前会话的对话输入框,替换本面板之前的引用;手动“引用选区”再补充元素 ID。关闭最后一个标签时发送 `documentId: null`,表示没有当前画板。下一次发送时模型能读到目标画板,修改前仍需重新读取最新版本。切换标签不会改变已经发出的模型请求。用户移除输入框上下文后,可再次引用当前画板。最近标签和当前选择由宿主 `widgetState` 在会话内恢复,不保证应用重启后恢复标签列表。
27+
28+
“导出”打开格式与文件路径对话框,支持 `.excalidraw`、PNG、SVG。导出路径相对于当前工作区,覆盖已有文件需勾选“覆盖同名文件”。画布下方保留 Excalidraw 自身的缩放、撤销/重做控件。
2329

2430
## 保存与恢复
2531

2632
文档存放在宿主分配的插件数据目录 `ZCODE_PLUGIN_DATA`(ZCode 下为 `~/.zcode/cli/plugins/data/<plugin-id>`,卸载插件时默认一并删除)的 `<workspace-key-hash>/documents.sqlite`;脱离宿主单独运行时退到 `~/.zcode/plugin-data/excalidraw`。`ZCODE_WORKSPACE_ROOT` 指定工作区文件路径;可信启动方可提供 `ZCODE_WORKSPACE_IDENTITY` 隔离同路径的工作区身份。
2733

28-
显示“已保存”表示后端已确认。强制关闭时仅保证已确认内容恢复。多窗口同时改图时,版本冲突会保留本页草稿,可以另存副本或放弃草稿后重载。
34+
右上角圆点表示保存状态:绿色为已保存(后端已确认),黄色为保存中,红色为保存失败,灰色为未打开画板;悬停可查看文字,读屏也会播报状态。强制关闭时仅保证已确认内容恢复。多窗口同时改图时,版本冲突会保留本页草稿,可以另存副本或放弃草稿后重载。
2935

3036
手工修改与工具修改共用当前画板的撤销/重做,撤销后的内容照常保存为新版本。同一文档的新内容更新保留已有历史和视角;切换文档、关闭重开或放弃草稿重载后重新开始历史。撤销栈不跨窗口或重启持久化。升级时移除旧的独立 AI 恢复字段和工具,保留既有画板内容、版本与幂等记录。
3137

‎external_plugins/excalidraw/skills/excalidraw/SKILL.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ description: 生成与编辑 Excalidraw 架构图、流程图、关系图,在
88
用户要画图、使用 Excalidraw 或引用画板选区时使用本插件工具。生成的是可编辑元素,不是截图。
99

1010
1. 新图调用 create_diagram(title, elements)。元素使用稳定的短 id;形状支持 rectangle/ellipse/diamond、x/y/width/height、backgroundColor、strokeColor。容器文字使用 label: {text},会生成 `<id>-label` 的绑定文本。箭头用 type: arrow、points: [[0,0],[dx,dy]],并提供匹配的 width/height。
11-
2. 修改前 read_scene(id, elementIds?),拿到当前 revision、元素 ID、绑定文字与箭头。用户的选区引用包含文档 id、revision、elementIds;引用可能过期,仍然先读。
11+
2. 修改前 read_scene(id, elementIds?),拿到当前 revision、元素 ID、绑定文字与箭头。面板打开、切换或改名时会提供 `kind: active-diagram` 的上下文,含 documentId、title、revision;“当前画板”以本轮最新上下文的 documentId 为准,不从名称或旧工具结果猜测。关闭最后一个标签后 documentId 为 null,表示没有当前画板;关闭标签不删除文档。用户的选区引用另含 elementIds;引用可能过期,仍然先读。一次编辑固定该文档 ID,不因后续切换标签改写另一张画板;没有明确目标时先确认。
1212
3. apply_operations(id, expectedRevision, operationId, operations):使用 add / update / delete,按元素 ID 局部修改。文字修改作用于 text 元素;不要用全量重建覆盖用户布局。位置调整保留未选中元素。
1313
4. revision_conflict 时重新读取后重新规划;重试同一已发送操作时保留 operationId 和全部参数,避免重复提交。不要把已有文档 revision 当作元素 version。
1414
5. 工具修改和手工修改使用画板内同一套撤销/重做。一次 apply_operations 应包含一个完整的编辑动作;不要为每个字段拆成独立提交。撤销产生新 revision,后续仍需重新读取。

‎marketplace.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -817,7 +817,7 @@
817817
"en": "Excalidraw",
818818
"zh-CN": "Excalidraw"
819819
},
820-
"version": "0.2.3",
820+
"version": "0.3.4",
821821
"source": "./external_plugins/excalidraw",
822822
"description": "让 Agent 生成图形,在对话侧栏用 Excalidraw 编辑、引用选区、继续修改并导出。",
823823
"description_i18n": {

‎ui-plugins/excalidraw/package.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@zcode/plugin-excalidraw",
3-
"version": "0.2.3",
3+
"version": "0.3.4",
44
"private": true,
55
"license": "MIT",
66
"type": "module",

‎ui-plugins/excalidraw/scripts/browser-fixture.mjs‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,15 @@ export async function startFixture() {
7979
const value = await response.json(); if(!response.ok) throw Error(value.error); return value;
8080
}
8181
window.__contexts = [];
82+
window.__activeContexts = [];
8283
window.__pluginClient = {
8384
theme: 'light', locale: 'zh-CN', toolCancelled: null, ...${JSON.stringify(bootstrap)},
8485
readResource: (uri) => rpc('readResource', {uri}),
8586
callTool: (name, args) => rpc('callTool', {name, arguments:args}),
86-
updateModelContext: async (value) => { window.__contexts.push(value); },
87+
updateModelContext: async (value) => {
88+
window.__latestContext = value;
89+
(value.structuredContent.kind === 'active-diagram' ? window.__activeContexts : window.__contexts).push(value);
90+
},
8791
setWidgetState: async (value) => { window.__pluginClient.widgetState = value; },
8892
notifyIntrinsicHeight: () => {},
8993
};

‎ui-plugins/excalidraw/scripts/e2e.mjs‎

Lines changed: 148 additions & 2 deletions

0 commit comments

Comments
 (0)