1实现原理 · 为什么它能做到
九类图共用一套“设计系统”:语义色板(按组件类别而非技术栈分配颜色)、字号层级、深色底 + 网格背景、三种箭头 marker,先定系统再排布局。
| Primary | `rgba(8, 51, 68, 0.4)` | `#22d3ee` (cyan) | Frontend, user-facing, inputs |
排版靠“固定绘制顺序 + 不透明遮罩矩形”解决 SVG 半透明叠加问题:先画箭头,再用同位置的不透明填充矩形盖住箭头,最后叠半透明组件框。
The opaque masking rect trick is essential — semi-transparent component fills will show arrows underneath without it:
用一组可直接抄的间距/边界硬规则代替审美判断:组件高 50-70px、垂直间距 ≥40px、水平 ≥30px、箭头标签离边 10px、viewBox 四周留 30px。
- **Minimum gap between components:** 40px vertical, 30px horizontal
每种图型另有一份布局算法参考,画前先读:分层、列/行分配、列间距、绕障 L 形路由、总线栏位等都有确定做法。
1. **Identify layers:** Group components by role (clients, gateways, services, data, infrastructure)
输出是单文件自包含 SVG:不设固定宽高、只给 viewBox,样式与 defs 全部内联,便于缩放嵌入。
2. Set `viewBox` to fit all content with 30px padding; do NOT set fixed `width`/`height` attributes (let the SVG scale responsively)
自带脚本把 SVG 转成 @2x PNG:解析 viewBox 算尺寸,用 sharp 以 density=72*scale 渲染并 resize 后落 PNG。
await sharp(svg, { density: 72 * opts.scale })
中文排版有专门处理:中文字符更宽,要求换字体族并加宽盒子,避免文字溢出。
**Chinese text support:** When labels contain Chinese characters, use `font-family: 'JetBrains Mono', 'Noto Sans SC', 'PingFang SC', sans-serif'` and increase box widths — CJK characters are wider
落盘位置有规则:输入是文件则存到 {inputFileDir}/diagram/,否则存 {projectDir}/diagram/{topic-slug}/,目录不存在就建。
**Save location:** If the input is a file, save to `{inputFileDir}/diagram/`.
2核心能力
3外部依赖
| 类型 | 依赖 |
|---|---|
| package | sharp(scripts/main.ts 动态 import,用于 SVG→PNG 光栅化) |
| cli | bun / npx(${BUN_X} 运行时) |
| network | Google Fonts(写入产物 SVG 的 @import,由查看端加载;非脚本外发) |
4风险提醒 风险提醒:蓝色 · 知晓即可
- 质量依赖模型写 SVG 的能力 — 复杂图(时序+激活条、嵌套区域、大量连线)容易出现坐标算错、文字溢出;skill 用间距清单与自检步骤缓解,但没有自动几何校验。
- 产物引用字体 CDN — 生成的 SVG 依赖 fonts.googleapis.com 的 JetBrains Mono;离线或内网环境打开时字体会回退,排版可能变化。这是产物侧行为(不判级),但交付给第三方时需知情。
- sharp 依赖需可解析 — 脚本动态 import sharp,skill 目录无 package.json;bare 环境需先装 sharp 或用仓库根依赖,否则 SVG→PNG 一步失败(SVG 本身仍可用)。[INFERENCE] 依赖运行环境解析。
- 复杂 SVG 进入本地解析器 — main.ts 把输入 SVG 交给 sharp/librsvg 解析;若 SVG 来自不可信来源,属于本地图像解析器攻击面(常规风险)。
- 九类图型的能力不均衡 — 只有四类有专门布局参考文件,思维导图/时间线/状态机/数据流靠 SKILL.md 的要点描述,复杂版式的一致性弱于架构图/流程图。
5第二遍独立确认
- [ok] 脚本仅本地行为 — main.ts 全文无 fetch/http/spawn/process.env;readFileSync(SVG) → sharp(density) → resize → png → toFile,另 mkdirSync 建目录。
- [ok] Google Fonts 外链的性质 — 两处命中均为写入产物 SVG 的 @import 文本与 Output Rules 自述 'no external dependencies except the Google Fonts import';脚本自身不请求该域名,按批4 口径不判级,已写入 risks。
- [ok] 绘制顺序与遮罩矩形确为强制 — SKILL.md 明写 'The opaque masking rect trick is essential',并给出 8 层绘制顺序与组件片段(遮罩 rect + 样式 rect 成对)。
- [ok] 间距规则为可检查数字 — 组件高 50-70px、垂直 ≥40px/水平 ≥30px、箭头标签 10px、区域边界内缩 20px、图例距最低元素 ≥20px、viewBox 30px padding,最后一并在流程第 5 步自检。
- [ok] 参考文件覆盖范围(是否夸大) — 4 份布局参考对应 architecture/flowchart/sequence/structural;思维导图/时间线/状态机/数据流/示意在图型表中给出要点但无专门文件,SKILL.md 用 'Read the reference file if one exists for that type' 表述,不构成夸大。
- [ok] meta 元数据 — GitHub API:MIT、25926 stars、pushed_at 2026-09-10T15:13:43Z;本地 HEAD 与 pin 1567581c26ec… 一致。
6结论
e4806bf926545ede…1567581c26