DiagramKit(dsh-tool-diagram):结构化示意图的排版量尺与自检器

前言

在 DeepSeek Harness(DSH)里让智能体画流程图、数据流图或 UML 示意图,常见瓶颈不是「能不能出一张 PNG」,而是改坐标之前不知道对不对:框够不够宽、标签是否压线、箭头是否穿框,往往要渲染、肉眼检查、再改一轮。DiagramKit(npm 包名 dsh-tool-diagram)面向这类场景:用声明式 spec 画图,同时量真实字宽、做布局自检,并在报告中为每条问题附带可执行的修法。它不是自动排版引擎——你给了 at 就按绝对定位画,工具只负责量准和验准。

这是什么

DiagramKit 是维护者 erzhe-lume 发布的 DSH 工作流类插件(GitHub 仓库 erzhe-lume/dsh-tool-diagram,当前 package 版本 0.1.0,MIT 许可证)。官方简介概括为:结构化示意图的排版量尺与自检器——量真实字宽、查溢出/重叠/穿框,每次调用返回「图 + 可执行的修法」。

README 说明单张图约 13 种图元、300 dpi 下约 80 ms 量级;覆盖流程图、N-S 图与 PAD 图、分层 DFD、E-R 图、UML 用例图与类图、判定树、事故树、组织架构图等离散元素 + 连线的示意图类型。

核心功能

三个 DSH 工具

工具 作用
diagram_create 按 spec 画图,返回内联图、自检报告、画布尺寸
diagram_patch 增量改图:move / moveby / resize / set / add / remove / canvas,无需重发整个 spec
diagram_measure 只测量与自检,不渲染,适合先判断「这行字放不放得下」

排版量尺

插件自行解析 TTF/OTF 的 head / hhea / hmtx / cmap 取 advance width,不依赖外部字体度量库。README 特别强调中文场景:弯引号、()《》,。 等符号在常见字体里常按全角 1 em 计宽,若按半角估算会导致框宽明显偏小。

此外支持中文折行与禁则(避免行首出现 ,。、)】 等)、未给 size 时按文字与内边距自动算框、缺字时报告 glyph_missing 而非静默画方框。

自检报告

文档列出 10 类检查项,每条带修法建议,例如文字溢出、折行后高度装不下、节点重叠、连线穿第三个框、超出画布、标签碰撞、箭头落点压住框内文字等;级别分为 error(必须改)、warn(能看但欠佳)、info(如连线交叉数,供参考)。

图元、连线与输出

13 种 shape(含 rect、round_rect、store、ellipse、class_box、actor、事故树与/或门,以及 N-S/PAD 用的 box_span、line_h、line_v、chevron 等)。连线可从自动求交到 fromSide/toSide、fromPoint/toPoint、waypoints 四档精度;标签可用 labelAt 控制位置。

坐标与尺寸以厘米为单位,便于对照 Word 插图;默认 PNG 300 dpi(可配置至 600),并可导出 SVG。支持 containers 画系统边界或泳道类外框。

安装与启用

插件在 DSH 进程内以当前用户权限运行,安装前建议阅读仓库源码与 MIT 许可证。官方 README 给出的安装步骤如下。

1、进入 desktop profile 目录并添加依赖:

cd $env:USERPROFILE\.dsh\profiles\desktop
pnpm add github:erzhe-lume/dsh-tool-diagram

2、在同一目录的 package.json 里,把 dsh-tool-diagram 加入 dsh.profile.bundles 数组,然后重启 dsh:

"dsh": { "profile": { "bundles": [
  "@deepseek-ai/dsh-base",
  "@deepseek-ai/dsh-web-app",
  "dshmarket",
  "dsh-tool-diagram"
] } }

首次安装可能出现 [ERR_PNPM_IGNORED_BUILDS] Ignored build scripts: sharp@0.34.0,README 写明可忽略;需要时可执行 pnpm approve-builds。包自带 dsh.bundle.patch,一般不必改 profile 的 cordis.patch.yml;若要覆盖默认参数,可按 README 示例配置 dpi、maxDpi、maxDiagrams 等。

运行环境要求 Node.js >=20(见 package.json engines)。

典型用法

最小 spec 示例

下面这段来自 README,画两个 DFD 风格加工与一个数据存储,并连两条边:

{
  "canvas": { "w_cm": 12.0, "h_cm": 5.0 },
  "nodes": [
    { "id": "p1", "shape": "round_rect", "num": "1", "text": "读卡与验证密码",
      "at": [3.0, 1.4], "size": [3.4, 1.1] },
    { "id": "p2", "shape": "round_rect", "num": "2", "text": "取款处理",
      "at": [8.6, 1.4], "size": [3.0, 1.1] },
    { "id": "db", "shape": "store", "num": "D1", "text": "中央数据库",
      "at": [6.0, 3.9], "size": [4.0, 0.85] }
  ],
  "edges": [
    { "id": "e1", "from": "p1", "to": "p2", "arrow": "open", "label": "验证通过" },
    { "id": "e2", "from": "p1", "to": "db", "arrow": "both", "label": "读 / 写" }
  ]
}

调用 diagram_create 后,除 PNG 外还可拿到 sizeCm、供后续 diagram_patch / diagram_measure 使用的 diagramId,以及结构化自检结果。

按报告打补丁

自检若建议挪框或改标签位置,可用 diagram_patch 发送操作数组,例如:

[
  { "op": "move",   "node": "db", "to": [6.0, 4.2] },
  { "op": "resize", "node": "p2", "size": [3.4, 1.1] },
  { "op": "set",    "edge": "e2", "label": "读 / 写", "labelAt": "left" }
]

不装 DSH 时的 CLI

仓库提供 lib/cli.js,可在本机直接渲染或只测量:

node lib/cli.js examples\usecase.json --out usecase.png --dpi 300
node lib/cli.js examples\broken.json --measure
node lib/cli.js examples\lib-dfd-l1.json --patch examples\patch-labels.json --out out.png
node lib/cli.js examples\usecase.json --out a.png --svg

样式可通过 style.preset 使用 se-textbook、uml、dfd 等预设;字体默认指向 Windows 黑体路径,可换成任意 TTF/OTF/TTC 文件路径。

适用场景与注意

README 给出的判断标准:离散元素 + 关系连线、有容器或层级、正确性主要看「连对没有、摆开没有」——适合程序流程图、DFD、E-R、UML 示意图、事故树、泳道图等。不适合折线柱状等数据可视化、电路与机械制图等以实物外形为准的图种。

N-S 图、PAD 图等学科布局仍由作者用 at 与专用图元(如 line_v、chevron)手工划分;可用 "structural": true 标记版面骨架元素,避免被重叠检测误报。折行与禁则针对中文优化;纯英文按空格断词,无连字符断词。

社区目录页:https://www.skillhub.cn/plugins/erzhe-lume/dsh-tool-diagram(独立站点,与 DeepSeek / 幻方无官方从属关系)。源码与完整设计见 GitHub:https://github.com/erzhe-lume/dsh-tool-diagram,另有 docs/DESIGN.md、docs/DEVELOPMENT.md 供深入阅读。

结尾

若你的工作流里需要智能体反复画教材式示意图,并希望在改坐标前就知道框宽、穿框和标签问题,DiagramKit 把「渲染 + 自检 + 修法」收成一次(或增量 patch)调用,和「只出图、对错靠人眼」的做法相比,迭代成本更可控。安装与 bundle 配置以 README 为准;细节以仓库当前文档为准。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜