图表即代码

指导 Agent 用声明式语法维护架构图、序列图与部署拓扑,使图表与代码一同走 PR 与历史追溯。

本页为 Agent 提供图表即代码的完整实践:Mermaid 5 种图类型示例、Markdown 嵌入与 CI 渲染配置、PlantUML vs Mermaid 的选择标准,以及版本控制友好的图表更新工作流。

在 SKILL 中约定首选 DSL(如 Mermaid 流程图/时序图、C4-PlantUML)及存放路径(docs/diagrams/);大型图拆分为子图或分层(C4 上下文→容器→组件);图表走 PR diff,不提交生成的二进制 PNG。

  • 语法校验:CI 调用 mmdc --input file.mmd,失败时输出错误行号。
  • 版本锁定:package.json 中锁定 @mermaid-js/mermaid-cli 版本。
  • 与 README/ADR 交叉引用:图源文件路径与嵌入方式写清楚。

Mermaid 5 种图类型示例

适合放在 Markdown/GitHub/GitLab 预览中的轻量图。SKILL 规定 ```mermaid 围栏内节点 ID 使用英文,禁止外链图片。

1. flowchart(流程图)

```mermaid
flowchart TD
  A([用户请求]) --> B{认证?}
  B -- 通过 --> C[业务处理]
  B -- 失败 --> D([返回 401])
  C --> E[(数据库)]
  E --> F([返回响应])
```

2. sequenceDiagram(时序图)

```mermaid
sequenceDiagram
  actor User
  participant API
  participant Auth
  participant DB

  User->>API: POST /login {email, password}
  API->>Auth: verifyCredentials()
  Auth->>DB: SELECT user WHERE email=?
  DB-->>Auth: User row
  Auth-->>API: JWT token
  API-->>User: 200 {token}
```

3. classDiagram(类图)

```mermaid
classDiagram
  class Order {
    +String id
    +OrderStatus status
    +List~Item~ items
    +calculateTotal() float
  }
  class Item {
    +String sku
    +int quantity
    +float price
  }
  class OrderStatus {
    <<enumeration>>
    PENDING
    PAID
    SHIPPED
  }
  Order "1" --> "*" Item : contains
  Order --> OrderStatus : has
```

4. gitGraph(Git 分支图)

```mermaid
gitGraph
  commit id: "init"
  branch feature/login
  checkout feature/login
  commit id: "add login form"
  commit id: "add auth service"
  checkout main
  merge feature/login id: "merge login"
  branch hotfix/token
  checkout hotfix/token
  commit id: "fix token expiry"
  checkout main
  merge hotfix/token id: "hotfix merged"
```

5. erDiagram(实体关系图)

```mermaid
erDiagram
  USER {
    uuid id PK
    string email UK
    string name
    timestamp created_at
  }
  ORDER {
    uuid id PK
    uuid user_id FK
    decimal total
    string status
  }
  ORDER_ITEM {
    uuid id PK
    uuid order_id FK
    string sku
    int quantity
    decimal price
  }
  USER ||--o{ ORDER : places
  ORDER ||--|{ ORDER_ITEM : contains
```

下方为页内实时渲染示例(仅本页加载 Mermaid;站点其余页面不依赖该脚本)。

flowchart LR subgraph src["源码"] A[".mmd / .md"] end subgraph pr["评审"] B["PR diff"] end subgraph ci["CI"] C["mmdc / 校验"] end A --> B --> C

PlantUML vs Mermaid 选择标准

适合 C4、复杂时序与部署图;通常经 Jar、Docker 或 Kroki 渲染。SKILL 写明是否允许 !include 与远程主题文件路径。

  Mermaid 优先场景                 PlantUML 优先场景
  ─────────────────                ────────────────────────
  GitHub/GitLab 原生渲染            C4 架构图(C4-PlantUML 库)
  Markdown 内嵌(README/ADR)       复杂部署/网络拓扑图
  简单流程图/时序图/类图            需要 !include 复用片段
  前端团队维护                      需要精细样式与主题控制
  快速迭代,diff 优先               架构委员会评审,精确度优先
  无服务器依赖                      已有 Kroki/PlantUML 服务
@startuml C4-Container
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml

Person(user, "用户", "使用 Web 浏览器")
System_Boundary(sys, "电商系统") {
  Container(web, "Web 应用", "React", "提供购物界面")
  Container(api, "API 服务", "Node.js/Express", "处理业务逻辑")
  ContainerDb(db, "数据库", "PostgreSQL", "存储订单与用户数据")
}
Rel(user, web, "使用", "HTTPS")
Rel(web, api, "调用", "REST/JSON")
Rel(api, db, "读写", "SQL")
@enduml

Mermaid CI 渲染配置(GitHub Actions):

# .github/workflows/diagrams.yml
name: Render Diagrams
on:
  pull_request:
    paths: ['docs/diagrams/**/*.mmd', 'docs/**/*.md']

jobs:
  validate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: '20' }
      - run: npm i -g @mermaid-js/mermaid-cli@10
      - name: Validate all .mmd files
        run: |
          find docs/diagrams -name '*.mmd' | while read f; do
            mmdc --input "$f" --output /tmp/out.svg || exit 1
          done

PR 与渲染流程

从改图到合入的常见路径;Agent 步骤里可对应「改源 → 本地校验 → 提交 → CI」。

     [ 编辑 .mmd / PlantUML / DOT ]
                 │
                 ▼
        [ 本地:mmdc / plantuml / dot ]
                 │
        ┌────────┴────────┐
        ▼                 ▼
   [ 语法通过 ]      [ 报错:定位行号 ]
        │                 │
        │                 └──► [ 修源再跑 ]
        ▼
   [ git diff 可读 ]
        │
        ▼
   [ 开 PR:附图或链接 docs/diagrams/ ]
        │
        ▼
   [ CI 同版本渲染器 / 可选产出 SVG ]
        │
        ├────► [ 通过 → merge ]
        └────► [ 失败 → 不提交二进制,只修文本 ]

页内工具:围栏 DSL 扫描

以下脚本仅在本页运行:粘贴 README 或设计文档草稿,列出闭合围栏中出现的 mermaidplantuml/pumldot/graphviz 块及起止行号,便于核对 SKILL 与 CI 是否覆盖。


            

SKILL 大纲

可直接复制为技能正文骨架,再替换为仓库真实路径与渲染命令。

---
name: diagram-as-code
description: 用 Mermaid/PlantUML 等维护可版本化的架构与流程图
---
# 规则
- 图表源文件存放在 docs/diagrams/,按类型子目录(flow/sequence/c4)
- Mermaid 优先用于 README/ADR 内嵌;C4/复杂部署图用 PlantUML
- 节点 ID 用英文;禁止外链图片;不提交生成的 PNG/SVG 二进制
- PR 必须同时改图表源文件,CI 验证语法(mmdc --input 或 plantuml -syntax)
- 版本锁定:package.json devDependencies 中注明 mermaid-cli 版本

# 步骤
1. 确认 SKILL 中的 DSL 选择(Mermaid vs PlantUML)与目录约定
2. 按场景选图类型:
   - 流程图 → flowchart TD/LR
   - API 交互 → sequenceDiagram
   - 数据模型 → erDiagram / classDiagram
   - Git 分支 → gitGraph
   - 架构分层 → C4-PlantUML(Context/Container/Component)
3. 大型图拆子图(subgraph)或分层文件,保持单文件可 diff
4. 本地验证:mmdc --input diagram.mmd --output /tmp/out.svg
5. CI 配置:在 PR checks 中加 validate-diagrams job
6. README 中用相对路径嵌入:![架构图](docs/diagrams/flow/auth.mmd)

返回技能库 更多技能入口