Community图像github.com

jpmanson/pele-skill

将 Mermaid 12 源码渲染为 SVG 或 HTML 文件,无需浏览器。支持 32 种图表类型,包括流程图、时序图、类图、甘特图、思维导图等。

pele-skill 是什么?

这是一个基于 Pele 库的 Mermaid 渲染技能,能够在 Node.js 环境中同步将 Mermaid 源码转换为 SVG 或 HTML 文件,无需依赖 Puppeteer、mermaid-cli 或 MCP 服务器。该技能的核心接口是 `scripts/render.mjs` 脚本,支持 32 种图表类型,包括常见的流程图、时序图、类图、状态图、ER 图、甘特图、Git 图、思维导图、饼图、Journey 图、时间线、象限图、XY 图表、C4 图、区块图、架构图、需求图、桑基图、数据包图、雷达图、树图、看板图、铁路图、Wardley 地图、石川/鱼骨图、泳道图、韦恩图、用例图、文件树、Cynefin 图、事件建模图和智能体流程图。该技能特别适合需要将 Mermaid 图表保存为文件的场景,支持检查渲染结果、诊断语法错误,并提供详细的 JSON 收据。安装前提是 Node.js 20+ 和 npm,依赖安装在技能根目录而非用户项目中。该技能已在 Claude Code、Hermes 和 OpenCode 中测试通过。

兼容平台✓Claude Code~Codex CLI~Cursor✓OpenCode
npx skills add https://github.com/jpmanson/pele-skill/tree/HEAD/skills/pele

Installed? Explore more 图像 skills: steipete/songsee, affaan-m/frontend-design, mattpocock/improve-codebase-architecture · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

Pele

使用 Pele 将 Mermaid 源码渲染为 SVG。Pele 是一个同步库:无需 Puppeteer、mermaid-cli 或 MCP 服务器。该技能的接口是 scripts/render.mjs。

技能根目录是包含此文件的目录。以下所有路径均相对于该目录。在将技能安装到 Claude Code、Hermes 或 OpenCode 后,该规则依然有效。

使用时机

  • 用户希望将 Mermaid 图表保存为 SVG、HTML 或图片文件。
  • 需要渲染并检查 .mmd 文件或 ```mermaid 代码块。
  • 用户请求绘制 32 种支持的图表类型之一,并希望得到文件而非聊天中的代码块。包括不太常见的类型:Wardley 地图、鱼骨图、韦恩图、泳道图、雷达图、树图、桑基图、铁路图、文件树、Cynefin 图、事件模型。参见下方图表类型。

请勿使用的情况:

  • Mermaid 代码块应保留在 Markdown 中,由 GitHub、Obsidian 或其他查看器自行渲染。
  • 请求的制品不是 Mermaid(如手绘 Excalidraw JSON、自定义架构页面、截图标注)。
  • 用户需要像素级一致的 mermaid.js 输出。Pele 有自己的布局引擎。

请勿将其包装在 MCP 服务器中。一次脚本调用即可完成全部功能。

前置条件

  • Node.js 20 或更新版本,且 npm 在 PATH 环境变量中。
  • 依赖安装在技能根目录(此文件旁边的 package.json),绝不会安装在用户项目中。

如果缺少 node_modules/pele,脚本会自动运行 npm install。你也可以手动执行:

npm install --no-fund --no-audit

验证:node scripts/render.mjs --check 应退出码为 0,且 stderr 的 JSON 中包含 "ok": true 和 pele 版本号。

图表类型

了解完整列表后再做选择。Pele 可渲染 32 种类型,其中三分之一需要 -beta 头部,且该头部可能与用户通常所说的名称不同。

node scripts/render.mjs --types

该命令会输出 JSON,包含:type、确切的第一行 header、用途说明以及可正常运行的 example 路径。references/diagram-types.md 中有相同的表格、失败的头部以及如何选择类型。

  • 选择最能展示读者所需内容的类型,而非最先想到的类型。按步骤划分归属 → swimlane。单一问题的多种原因 → ishikawa。带日期任务 → gantt。文件夹布局 → treeView。比例流量 → sankey。
  • 如果请求不符合任何类型(自由布局、图片、未列出的图表类型),请如实告知,不要强行归入流程图。
  • 如果用户指出的特定图表类型不在列表中,请先告知,然后提供最接近的支持类型。不要默默近似。

操作步骤

  1. 从 --types 中选择类型及其确切头部。对于任何 -beta 类型,或你不确定其语法的类型,请先阅读其 example 文件并模仿其结构。
  2. 将 Mermaid 源码写入 .mmd 文件。不要将多行图表作为 shell 参数传递。
  3. 渲染:
node scripts/render.mjs INPUT.mmd OUTPUT.svg
  1. 读取 stderr 上的 JSON 收据。完成条件:退出码为 0、"ok": true、收据中的 type 与你选择的类型一致、输出文件以 <svg 开头。
  2. 如果 "ok": false:
    • unsupported-diagram:第一行不是已知头部。如果存在 suggest[0].header,则使用它,否则从 --types 中选择一个。
    • syntax 或 semantic:使用 snippet 在 line / column 处修复源码,与类型示例进行对比,然后重新渲染。
    • 不要切换到 mermaid-cli、无头浏览器或手写 SVG。
  3. 报告输出文件的绝对路径。除非用户要求获得标记内容,否则不要将 SVG 粘贴到聊天中。非零退出码时不要声称成功。

当用户需要可在浏览器中打开的文件时,使用 --html,或输出路径以 .html 结尾。HTML 会内嵌 SVG 并设置 Pele 的 CSS 颜色变量。

node scripts/render.mjs --html INPUT.mmd OUTPUT.html

收据

成功时 stderr 输出:

{"ok":true,"type":"flowchart","width":180,"height":80,"bytes":1200,"output":"/abs/OUTPUT.svg","html":false,"pele":"1.6.0"}

失败时 stderr 输出,退出码为 1(如果 Pele 无法安装则退出码为 2):

{"ok":false,"code":"syntax","message":"...","type":"flowchart","line":2,"column":5,"snippet":"..."}

code 可以是 syntax、semantic、unsupported-diagram、limit、usage、install-failed 或 render-failed。请将 message 作为文本展示。它可能包含图表源码。

unsupported-diagram 收据还包含 hint 和 suggest:

{"ok":false,"code":"unsupported-diagram","hint":"将第一行替换为下方的头部。许多类型需要 -beta 后缀。","suggest":[{"type":"radar","header":"radar-beta","example":"/abs/examples/types/radar.mmd"}]}

标志

标志用途
--check加载 Pele,打印版本,不执行渲染
--types在 stdout 上以 JSON 格式打印支持的图表类型、头部和示例路径
--html生成独立的 HTML 而非原始 SVG
--fixed固定像素尺寸。.svg 文件的默认值
--responsiveSVG 可随容器缩小。stdout 和 HTML 的默认值
--max-width <px>要求 Pele 调整布局。可使宽度较大的 LR 流程图在 640px 以下变为垂直布局
--font-size <px>基础字号
--font <family>标签字体
--id-prefix <str>当多个 SVG 共享一个页面时的唯一前缀

Stdout 仍然是 SVG(或 HTML)。收据始终是 stderr 上最后一行 JSON。

周围的 ```mermaid 代码块会被剥离。Mermaid 自身的前置元数据不会被剥离。

陷阱

  • 文件 SVG 默认 responsive: false。仅在 SVG 将被嵌入并需要缩小时才传递 --responsive。
  • Node 没有 Canvas 度量器。标签宽度可能不同于浏览器渲染结果。这是预期的行为。
  • 除非用户要求窄布局,否则不要传递 --max-width。它可能改变排列方向。
  • 头部必须精确。radar、venn、wardley、swimlane、treeView、usecase、cynefin、railroad、agentflow 都需要 -beta;architecture 也需要 -beta。没有 fishbone 头部;请使用 ishikawa-beta。
  • 图标名称(fa:fa-user、除 cloud、database、disk、internet、server 之外的架构图标)会渲染为空白槽位,不会报错。此脚本不提供图标回调。请移除图标或替换为文字。
  • 源码限制为 50,000 个字符。输出限制为 4,000,000。流程图边限制为 5,000。
  • 在用户仓库中执行 npm install 无法满足此脚本的需求。依赖包位于技能根目录。
  • 如果 node_modules 存在但 Pele 加载失败,请删除该 node_modules 并在技能根目录中运行 npm install。
  • 已打开的智能体会话无法看到在会话中途安装的技能。这是加载器缓存问题,并非安装失败。

验证

在技能根目录中执行:

npm run smoke

完成条件:退出码为 0,stdout JSON 包含 "ok": true、pele 版本、"types": 32、包含所有目录类型的 rendered 列表,以及一个 code: "syntax" 且 line 不为零的 syntaxError。如果 scripts/catalog.mjs 与 Pele 自身的类型列表不一致,或某个头部不再能检测为其类型,烟雾测试也会失败。examples/broken.mmd 必须保持失败。烟雾测试通过并不代表新图表是正确的;每个新图表仍需要其自身的收据。

相关技能