# diagramon **Repository Path**: westsource/diagramon ## Basic Information - **Project Name**: diagramon - **Description**: Diagramon 是一个多格式图表编辑器:编辑、实时预览和图片导出与复制,可以通过自然语言让AI助手生成图表。当前支持 Mermaid(.mmd / .mermaid),接下来将支持 Graphviz DOT、drawio 与 Excalidraw - **Primary Language**: C# - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 0 - **Created**: 2026-04-06 - **Last Updated**: 2026-11-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Diagramon - 多格式图表编辑器 [English](README_EN.md) 一个**本地优先**的多格式图表编辑器:**Mermaid**、**Graphviz DOT**、**D2**、**drawio**、 **Excalidraw** 五种格式在同一个窗口里编辑、实时预览、互相转换。AI 不另开一个网页另画一张图, 而是和你编辑**同一份源码** —— 它读的是你正在改的这份图,写回的是可 diff、可回滚、可评审的代码, 渲染失败时把出错的行列回灌给它自己修。渲染、校验、转换全部在本机完成,只有你主动使用 AI 时, 内容才会发往你自己选定的上游。 版本 **3.12.1** · 官网 ## 它解决的问题 AI 画图的现状是:**让它画一张很容易,和它一起把这张图维护下去很难。** **1. AI 交给你的是"一张图",不是"一份能改的图"。** 对话框里吐出一张 PNG、或者一段没人愿意读的 SVG;想挪一个节点得重新描述整张图,改完没法对比、没法回滚、没法进 git,评审只能发截图。 **2. 对话和图分居两地。** 图在你本地的文件里,对话在某个网页里;模型看不到你正在编辑的这份文档, 只能靠你复述重画一遍。上下文一断,前面几十轮的来回全部作废。 **3. 生成的语法经常跑不通,而且不告诉你哪一行。** 模型记的是过时的 Mermaid / DOT 语法,边方向反了、 节点名撞上关键字、D2 线宽越界;工具只回一句"渲染失败",剩下的排查全归你。 **4. 生成之后就很难继续协作。** 看不到"这一版改了什么",不能只接受一半,不能只改一个分支, 也没法让它按你的配色、流向、命名习惯来改 —— 每次合作都像第一次。 **5. 看不见发出去的是什么、花在了哪里。** 整份文档默认发往一个固定服务,密钥躺在浏览器里, token 花在哪个环节说不清;写着真实服务名和内网域名的架构图,根本不敢交给它。 ## 我们的做法 **1. 让 AI 的产物是源码,不是截图。** 五种格式落盘全是文本(`.mmd` / `.dot` / `.d2` / mxfile XML / 场景 JSON),AI 写出来的东西可 diff、可回滚、可进仓库、可评审 —— 这是"人和 AI 共同维护同一张图"的前提。 **2. AI 读的就是你正在编辑的这份图。** 同一文档只有一条按时间排序的对话,生图 / 识图 / 改图 / 解图 共用它;改图把当前完整源码上行、要求返回完整源码,应用时取最后一个非空代码围栏 —— 不会只剩半张图, 也不会把对话和图拆成两个世界。 **3. 生成即校验,错误回灌给它自己修。** 问题由图形引擎本身解析后报出,精确到行(Mermaid 还带列), 同一份定位直接喂回模型做修正;渲染失败自动修一次,最多 3 轮,连续两轮同样错误就止损。 引擎不可用或文档超大时明确标注"降级",绝不把"没校验"当"通过"。 **4. 人保留最终决定权。** AI 只改它自己写的那一版 —— 你手改出的语法错不会被悄悄覆盖;应用、重试、 编辑重发都是显式动作;转换有损就逐条列出没迁移什么,并核对两侧节点与连线数量,少了就说少了多少。 **5. 边界、成本、风格都归你。** 会员走官方网关、或 BYOK 直连自己的模型(OpenAI 兼容 / Ollama / 自建端点),密钥只存在 Rust 进程内(Windows DPAPI),前端拿不到;只有你主动用 AI 时内容才发往你选定 的上游,首次外发前先告诉你要发什么;用量只计供应商实报的 token。想让它按你的习惯画,就把偏好存进 长期记忆(你确认后才生效)。配色也不靠模型随手挑色值:它只标「这是主链路 / 判断 / 数据 / 外部 / 异常」, 色值由应用的色系表落地 —— 换色系不改一个字的正文。要落地成能继续拖的图,AI 产物可直接进五种格式之一,drawio / Excalidraw 由承载页现场转换 —— 生成的终点是可编辑的画布,不是一张静态图。 ## 界面截图 ![主界面](screenshots/01-main-light.png) ![AI 识图](screenshots/02-ai-vision.png) ![drawio 画布](screenshots/03-drawio-canvas.png) ![Excalidraw 画布](screenshots/04-excalidraw-canvas.png) ![深色主题](screenshots/05-dark-preview.png) ![云端文档](screenshots/06-cloud-docs.png) ![账户与 AI 额度](screenshots/07-cloud-account.png) ![D2 预览](screenshots/08-d2-preview.png) ## 功能特性 ### 编辑 - **五种格式、多标签**:`Mermaid`(`.mmd` / `.mermaid`)、`Graphviz DOT`(`.dot` / `.gv`)、`D2`(`.d2`)、 `drawio`(`.drawio`)、`Excalidraw`(`.excalidraw`)并排编辑;标签溢出时滚入视野、滚轮横滚、两端渐隐, `Ctrl+Tab` / `Ctrl+PgUp` 循环切换 - **泳道图**:Mermaid 12 的 `swimlane-beta` 头部直接可用 —— 顶层 `subgraph` 就是泳道,节点/连线仍是 flowchart 语法;泳道图固定用 `swimlane` 布局(顶栏不会给一个切不动的布局按钮),可转 DOT / D2 / Excalidraw(泳道落成 cluster / 容器);drawio 随包的导入器不认这个头部,转换对话框会明确说明, 不会静默失败 - **引擎级语法校验**:问题由图形引擎自己解析后报出,给真实行号(Mermaid 还带列号);点问题跳到源码 对应位置,出错行画红线;D2 走随包 wasm 真编译,drawio / Excalidraw 做结构校验;引擎缺失或文档超大时 明确标注**降级**,绝不把"没校验"当"通过" - **大纲与当前作用域**:从正文解出节点与 `subgraph` / `cluster` / D2 容器树,点击跳到源码并滚到可见处; drawio / Excalidraw 有分组与图形节点大纲,点击直接在画布上选中定位;状态栏显示光标所在容器 - **配色在源码里也看得见**:会被上色的节点,在它首次出现的那一行左侧点一个色块 —— 颜色就是渲染时 真会染上的色;带手写颜色(会被跳过)的节点画虚框,悬停显示角色与色值。可选的「行底色」把整行铺一层 极淡的角色色(默认关,源码窗格顶栏与设置里都能切) - **查找替换、撤销重做、右键菜单、命令面板**(`Ctrl+Shift+P` / `F1`) - **Tab 与主流编辑器一致**:空选区补空格到下一个制表位,选区整块缩进、`Shift+Tab` 反缩进,一次按键一步撤销 - **大文档护栏**:超过 400 KB / 5000 行的图在打开、保存、渲染前各确认一次,不静默把引擎拖死 ### 预览与导出 - **源码 / 分屏 / 预览三态**(`Ctrl+1/2/3`),源码窗格可整块隐藏 - **统一手势**:滚轮平移、`Shift+滚轮` 横向平移、`Ctrl+滚轮` 以光标为锚缩放、拖拽平移、双击适应视图 - **适应视图适配的是内容**:按图自身包围盒两维适配并居中(有意忽略 drawio 的页面框);窗口或面板尺寸 变化后自动重新适配(可在设置里关掉);状态栏只显示当前视图的缩放值 - **布局与外观随选随切**:DOT 六种布局、D2 三种(`dagre` / `elk` / `tala`)、Mermaid `dagre` 与 `elk`(默认 `elk`); Mermaid 外观 `classic` / `neo` / `handDrawn`。选项就在预览顶栏,**按文件记住**,点完立即重渲染 - **自动配色(AI 只标角色,色值本地落地)**:六种色系(松绿 / 黛蓝 / 藕紫 / 橄榄 / 赭石 / 钨灰) × 七个角色(主链路 / 入口 / 判断 / 数据 / 外部 / 异常 / 说明)。AI 画图时只写角色、不写色值, 所以同一句话两次生成不会出现两套颜色;连线一起跟随色系(可在设置里关掉)。颜色是**预览期**效果, 换色系、换主题都不改正文 —— 要固化给别人看,用「写入正文」 - **打开即挑选**:文件没记过色系时,按图里的角色占比与标签本地挑一个(数据/存储多→黛蓝、 异常多→赭石、外部接口多→橄榄、界面词→藕紫,否则松绿);新建文档默认**无** - **「无」= 清除**:清掉正文里程序生成的配色;配置了模型时,连手写颜色一起清(只删颜色, 结构一改就放弃这次清理) - **导出**:PNG(倍率可选)或复制到剪贴板;位图带着与预览一致的底色,粘贴到白底文档里不会像一片空白; 图大到越过浏览器画布上限时自动压倍率并说明,而不是给一张空图 - **渲染产物先消毒再挂载**,主界面文档带禁止内联脚本的 CSP ### 画布编辑(drawio / Excalidraw) - **画布就是编辑器**:直接拖、直接连,不提供源码/分屏三态 - **改动自动回写**正文并打脏标,保存前先向画布取一次最新内容,不会输给画布自己的 autosave 去抖窗口 - **撤销历史不丢**:切换标签不会销毁承载页 - **离线自带**:两个运行时都随安装包分发,零外部请求 ### 格式转换 - **可转方向**:`Mermaid → DOT` / `Mermaid → D2` / `DOT → D2` / `Mermaid → drawio` / `Mermaid → Excalidraw` / `D2 → drawio`(保几何,转出来还能继续拖拽编辑) - **单向语义**:产物另开标签页,原文件字节不变 - **有损逐条说明**:结果附 `notes` 列出哪类信息没迁移,对话框直接显示 - **转换后数量对账**:自动数两侧节点与连线,少了就报"少 N 个节点、M 条连线";数不出来就明说对不了账 - **AI 增强转换**(可选,默认关):结果有损或校验失败时出现入口,一次初改 + 最多 3 轮校正,连续两轮 同样错误提前止损,首次使用先提示将外发什么 - **`Mermaid → drawio` 可选 ELK 重排**;不可用方向照样列出并写明原因 - **兜住以前会转坏的细节**:边端点标记、DOT 关键字同名节点、D2 线宽范围、圆角标签里的括号等 ### 工作区与文件 - **打开文件夹**:资源管理器树(只收本应用认识的扩展名,跳过 `.git` / `node_modules` / `target`), 可按名称或修改时间正/倒序、文件夹优先;中文名按拼音排序、数字按数值比较(「图 2」在「图 10」前) - **全工作区搜索**(`Ctrl+Shift+H` / `Alt+2`):流式返回结果、带行列号、可跳转、可取消 - **文件监视**:外部改动自动跟上;与本地未保存内容冲突时给一条横幅让你选「用磁盘版本 / 保留我的」 - **单实例 + 文件关联**:双击图表文件由已有窗口打开,不新起进程 - **拖拽打开**:把图表文件拖进窗口即开成标签页(拖动时整窗提示;不认识的扩展名如实挡下)。 拖到右侧 AI 面板上仍然当"对话上下文",两种行为按落点分工 - **自动保存默认关闭**,可在设置里开启(500–60000 ms 可调);未落盘内容有草稿仓,坏一份不连累其它 - **路径守卫**:工作区内的新建/重命名/删除永远经根目录校验,拒绝 `..` 与绝对路径;可开「只允许在 工作区内读写文件」 ### AI 助手 - **一条时间线,四种意图**:生图、识图、改图、解图共用一条按时间排序的对话;每条消息带意图, 发送前用四档滑块明示,点任意一档手动覆盖,发送后自动清掉 - **意图自动判定**:设置里可选 `自动 / 官方 / 自定义 / 关闭`,失败或低置信回退本地规则,绝不阻塞发送; 判定期间发送按钮锁定,双击不会重复计费 - **输出格式下拉**:跟随当前 / Mermaid / DOT / D2 / drawio / Excalidraw;目标格式不同则新建对应标签页 - **两种凭据,界面上分开**:会员云网关(凭据是登录令牌)与本地 BYOK(OpenAI 兼容 / Ollama / 自定义) - **识图四种入口**:选图片文件、弹窗里按 `Ctrl+V` 粘贴、把文件拖进弹窗,或**框选屏幕一块区域**; 最多两张图对比,只在内存里压到 ≤1568px,不落盘、不进会话记录 - **外部文件当上下文**:最多 8 份、单份 256 KiB、仅 UTF-8 文本;参考文件与"当前图表源码"在提示词里 分开措辞,模型不会把参考资料当成要重写的正文 - **改图按整篇走**:上行完整源码、要求返回完整源码,「应用」不会只剩半张图;取最后一个非空代码围栏 - **AI 只改它自己写的那一版**:渲染失败自动修正只在正文仍是 AI 刚落的那版时触发,你手改出的错不会被覆盖 - **解图只读且按排版显示**:Markdown 渲染、流式边写边渲染、可切预览/源码;模型输出当纯文本处理, 不执行内联 HTML/脚本,`javascript:` 链接不可点 - **单条消息可操作**:重新生成 / 编辑后重发 / 删除 / 拷贝,不用清空整段对话 - **真的记得上文**:对话轮次带进下一次请求(自动裁剪,最新一轮永远保留) - **会话历史按文档持久化**:本机存储、重启还在;「全部」页签按 文档 / 草稿 / 已失联 三种归属列出所有 会话(未保存文档的也在内),可搜索、导出 Markdown、清理 30 天前的失联会话;草稿与失联不会自动删除 - **思考过程可见可收**:思考型模型的推理实时显示、收尾自动收起、可展开读全文,并随会话一起落盘 - **长期记忆(可选)**:AI 提议记住你的偏好与术语,先落「待确认」,确认后才生效,全部存本机 - **受控工具循环(试验)**:AI 回答前可"读文档 → 查语法 → 校验 → 查配色",最多 5 步,只作用于内存文档模型, 不接触文件系统、shell 或网络 - **用量如实标注**:只累计供应商实报的 token,未回报显示 `—`,不显示 0,也不掺本地估算 - **密钥永不进前端**:Key 只存在 Rust 进程内(Windows DPAPI 按用户加密),前端只拿 `has_key` 与掩码 ### 云端 - **登录令牌只进凭据库**(DPAPI),过期静默续期,重启不再要求重新登录 - **账户视图**:邮箱、昵称、套餐、角色、存储用量,以及 AI 权益与信用点额度 - **云端文档**:目录树(空目录也在)、筛选、打开;保存到云端可挑目录、可新建子目录 - **网关 auto 档位**:由服务端按能力与图片输入需求路由 - **`base_url` 留空 = 云端整体关闭**,一切照旧离线工作 - **不做假数据**:未配置就写"去配置",未登录就写"未登录",余额从不伪造 ### 设置与更新 - **明暗双主题 + 多套强调色**,全部颜色走 CSS 变量 - **面板状态记住**:侧栏 / AI / 底部面板的开合与宽度、源码窗格比例、最近文件,重启即还原 - **中英双语**(`zh-CN` / `en-US`),两侧词条键集完全一致 - **内置自动更新**:minisign 签名校验;"已最新 / 有新版本 / 出错"三种结果如实呈现,检查失败绝不说成 "已是最新" - **关闭到托盘(可选)**:✕ 只隐藏窗口,托盘图标可唤回或退出 - **Mermaid 默认外观**:文档没选外观时的全局兜底 ## 技术栈 - **语言 / 框架**:Rust(2021 版次)+ Tauri 2,界面跑在系统 WebView(Windows 上是 WebView2) - **前端**:无框架、无构建链、零 CDN;编辑器是随包的 CodeMirror 6 - **渲染**:Mermaid(打包 JS)· Graphviz(WASM)· D2(官方 wasm 构建)· drawio(裁剪运行时)· Excalidraw(本地打包)—— 全部随安装包分发,本地运行 - **AI**:Rust 侧 `reqwest` + SSE 流式,凭据走 DPAPI - **打包**:NSIS 安装包,渲染运行时与前端资源一并入包 架构与设计决策(同源承载页与自定义协议、运行时分工、阈值来历、转换语义、AI 架构、发版纪律) 不在 README 展开,随内部设计文档与仓库规则文件维护。 ## 运行环境 - Windows 10 / 11 64 位,需要 WebView2 运行时(Win10/11 通常已预装) - **不需要** VC++ 运行库:release 已静态链接 CRT - 渲染与画布运行时(约 110 MB)和前端资源都在安装包里,装完即用,无需额外下载 ## 许可 Apache-2.0,见 [`LICENSE`](LICENSE);第三方组件与许可见 [`NOTICE`](NOTICE)。 ## 致谢 - [Tauri](https://tauri.app/) - 桌面应用框架(Rust + 系统 WebView) - [CodeMirror](https://codemirror.net/) - 代码编辑器 - [Mermaid](https://mermaid.js.org/) - Mermaid 图表渲染引擎 - [Graphviz](https://graphviz.org/) / [@hpcc-js/wasm-graphviz](https://github.com/hpcc-systems/wasm-graphviz) - DOT 渲染(WASM) - [D2](https://d2lang.com/) - `.d2` 图表(随包的官方浏览器 wasm 构建,MPL-2.0) - [drawio](https://github.com/jgraph/drawio) - `.drawio` 画布(随包裁剪运行时,Apache-2.0) - [Excalidraw](https://github.com/excalidraw/excalidraw) - `.excalidraw` 手绘风格画布(MIT) - [OpenAI 兼容 API](https://platform.openai.com/docs/api-reference) - BYOK 与云网关的对话协议 - [Ollama](https://ollama.com/) - 本地大模型