mcpField
D
diagram

diagram

github.com/312362115デザイン・UI10736 回インストール24 週間前に更新
リポジトリ

diagram について

Diagram Skill は、自然言語の要望から内容の構造を分析し、適切な図表を選んで Markdown に埋め込める PNG を生成または変換します。Mermaid と Graphviz の図を統一した形式に変換し、レンダリングと出力の手順も定めています。

主な機能

  1. 01内容の構造に応じた図表選択
  2. 02自然言語による図表生成
  3. 03Mermaid と Graphviz の画像変換
  4. 04Markdown 用 PNG の出力
  5. 05スクリプトによるレンダリングとキャプチャ

活用シーン

  1. 01文書用のフロー図やアーキテクチャ図を作成
  2. 02Mermaid 図を PNG に変換
  3. 03データ比較をチャート化
  4. 04読者や用途に応じて図表形式を選択

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/312362115/claude --skill diagram

インストール後、Claude Code で/diagramを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

CHANGELOG.md
references/
design-system.md
diagram-utils.md
references/diagrams/
architecture.md
bar-chart.md
c4.md
class.md
dataflow.md
decision-tree.md
er.md
fishbone.md
flowchart.md
gantt.md
heatmap.md
journey.md
line-chart.md
mindmap.md
network.md
orgchart.md
pie-chart.md
radar-chart.md
review-grade.md
sankey.md
scatter.md
sequence.md
state.md
swimlane.md
swot.md
timeline.md
treemap.md

詳細

図表作成スキル(Diagram Skill)

要件を自然言語で説明するだけで、プロフェッショナルな PNG 図表を自動生成し、Markdown ドキュメントに直接埋め込めます。


ステップ 1:コンテンツのトポロジーを分析し、表現方法を選ぶ

理念:コンテンツのトポロジー形状によって表現できる図表の種類が決まり、読者と利用シーンによってその中からどれを選ぶかが決まります。 いきなり「これはどの種類の図か」と考えるのではなく、まずコンテンツがどのような形をしているかを見てください。

1.1 コンテンツのトポロジーを識別する

コンテンツを構造形状に基づいて分類します。同じトポロジーが複数の図表タイプに対応することがあります。

トポロジー形状識別の手がかり表現できる図表タイプ
線形シーケンスA → B → C、単一路線、手順、段階、フローフローチャート(線形)、シーケンス図、タイムライン、ガントチャート
複数ソースの集約 / DAG複数の入口・出口、依存関係、リソースの流れフローチャート(DAG)、データフロー図、ネットワーク図、サンキーダイアグラム
階層構造階層、技術スタック、コンテナ化、抽象化レベルアーキテクチャ図、C4 図
役割間の連携複数の役割 / システム間 / サービス間のやり取りスイムレーン図、シーケンス図、C4 システムビュー
エンティティ間の関係データベーステーブル、オブジェクトの関係、フィールドのマッピングER 図、クラス図
状態遷移ステートマシン、ライフサイクル、並行処理、git ブランチ状態図、Git Graph
ツリー構造意思決定、組織、知識の階層、メニュー階層決定木、組織図、マインドマップ
マトリックス / 多次元評価多次元の比較、四象限分類、網羅関係ヒートマップ、レーダーチャート、SWOT、ベン図、ツリーマップ
数値比較個別の比較、割合、累積増減棒グラフ、円グラフ、ファネルチャート、ウォーターフォール図
トレンドの変化時系列、バージョンの変遷、推移折れ線グラフ、複合グラフ
分布関係散布、クラスタリング、相関散布図(バブルを含む)
段階的なタスク管理カンバン、ToDo、段階の進行カンバン、ガントチャート
根本原因分析複数要因への帰属、欠陥の追跡フィッシュボーン図
ユーザー体験のジャーニータッチポイント、感情曲線ジャーニーマップ
1.2 同じトポロジーの場合、どの図表を選ぶか?

同じトポロジーでも複数の表現方法があります。読者 + 利用シーン + 強調するポイントに基づいて最終的に選択します。

判断基準選択の傾向
読者が開発者DAG 型のコンテンツにはフローチャート / データフロー図を優先(情報密度が高い)。サンキーダイアグラムは使わない
読者がレビュー担当者 / 管理職フローを扱うコンテンツにはサンキーダイアグラム(視覚的インパクト)、階層にはC4 コンテナービューを選ぶ
スライドを使ったプレゼンテーション視覚的インパクトを重視:サンキーダイアグラム、レーダーチャート、タイムライン、マインドマップ
ドキュメントへの埋め込み情報密度を重視:フローチャート、ER 図、表形式の構造図
アクションの順序を強調シーケンス図 > フローチャート
コンテナ化 / 境界を強調C4 > アーキテクチャ図
層の関係を強調アーキテクチャ図 > C4
データ比較が主目的個別の値には棒グラフ、トレンドには折れ線グラフ、割合には円グラフまたはツリーマップ
データの次元が 3 以上レーダーチャート、ヒートマップ、または散布図
複数分岐の意思決定ロジック決定木 > フローチャート
単一分岐の線形フローフローチャート(線形)
1.3 Mermaid / Graphviz のマークアップ言語を変換する

Markdown に ```mermaid または ```dot のコードブロックがある場合:

  1. 図の構造(ノード、エッジ、ラベル、タイプ、グループなど)を解釈する
  2. 対応する図表タイプのテンプレートデータ構造にマッピングする
  3. 統一されたデザイン仕様で PNG にレンダリングする
  4. 元のテキストブロックを画像参照に置き換える

マッピングルール:

ソース形式キーワード / 構文マッピング先
Mermaid graph TD / flowchartノード + 矢印flowchart テンプレート
Mermaid sequenceDiagram参加者 + メッセージsequence テンプレート
Mermaid classDiagramクラス + 関係class テンプレート
Mermaid stateDiagram状態 + 遷移state テンプレート
Mermaid erDiagramエンティティ + 関係er テンプレート
Mermaid ganttタスク + 日付gantt テンプレート
Mermaid pieラベル + 数値pie テンプレート
Mermaid journey段階 + 評価journey テンプレート
DOT digraph有向グラフflowchart / state / class(構造に基づいて判断)
DOT graph無向グラフer / network(構造に基づいて判断)

注意:Mermaid / Graphviz ツールを呼び出してレンダリングするのではありません。Claude がマークアップ言語で記述された図の構造を理解し、独自のテンプレートデータに変換して、統一されたデザイン仕様でレンダリングします。これにより、すべての図表でスタイルが統一されます。

1.4 图表类型 → 布局/规范索引

1.1-1.2 决定用哪种图表后,下面这张表是布局策略和专属规范的检索入口——不是"内容→选类型"的决策表(决策已在 1.1-1.2 完成)。

图表类型典型场景布局策略专属规范
流程图(线性)工作流程、决策逻辑(单路径)手动布局references/diagrams/flowchart.md
流程图(DAG)多源汇聚、资源流转、关系图ELKjsreferences/diagrams/flowchart.md
泳道图多角色协作流程手动网格references/diagrams/swimlane.md
时序图API 调用、消息交互自定义顺序堆叠references/diagrams/sequence.md
架构图系统分层、技术栈手动层堆叠references/diagrams/architecture.md
ER 图数据库表结构ELKjsreferences/diagrams/er.md
类图面向对象设计ELKjsreferences/diagrams/class.md
状态图状态迁移ELKjsreferences/diagrams/state.md
网络图网络拓扑手动分层references/diagrams/network.md
决策树选型决策树形布局references/diagrams/decision-tree.md
数据流图数据管道手动分层references/diagrams/dataflow.md
C4 图C4 系统视图手动分层references/diagrams/c4.md
思维导图知识结构双侧树形references/diagrams/mindmap.md
甘特图项目排期日期轴网格references/diagrams/gantt.md
时间线发展历程纵向列表references/diagrams/timeline.md
组织结构图组织架构树形references/diagrams/orgchart.md
SWOT 图优劣势分析卡片四象限references/diagrams/swot.md
鱼骨图根因分析鱼骨骨架references/diagrams/fishbone.md
文氏图集合关系圆形交叠references/diagrams/venn.md
旅程图用户体验卡片横向references/diagrams/journey.md
柱状图离散对比笛卡尔坐标references/diagrams/bar-chart.md
折线图趋势变化笛卡尔坐标references/diagrams/line-chart.md
饼图占比构成径向references/diagrams/pie-chart.md
雷达图多维评估径向references/diagrams/radar-chart.md
热力图矩阵数据网格references/diagrams/heatmap.md
桑基图流量路径流带分层references/diagrams/sankey.md
散点图分布关系笛卡尔坐标references/diagrams/scatter.md
矩形树图数据占比/层级面积Squarifiedreferences/diagrams/treemap.md
柱线混合图柱状+折线混合笛卡尔双 Y 轴references/diagrams/combo.md
Kanban项目管理/任务看板竖列卡片references/diagrams/kanban.md
Git GraphGit 分支工作流横向分支线references/diagrams/git-graph.md

第二步:读取规范,生成图表

2.1 规范体系
  • 公共规范 references/design-system.md — 配色、字体、组件、间距
  • 公共工具 references/diagram-utils.md — SVG 工具函数、文字测量、碰撞检测
  • 专属规范 references/diagrams/<type>.md — 每种图表的数据结构、布局规则、渲染细节
2.2 布局策略

图表布局分两种:

ELKjs 自动布局(ER图、类图、状态图、流程图 DAG 模式):

  • 引用 lib/elk.bundled.js
  • 定义 ELK 图结构(nodes + edges)
  • elk.layout(graph).then(result => { /* 渲染 */ })
  • 注意:ELKjs 是异步的,所有渲染代码放在 .then() 回调里

手动布局(流程图、泳道图、架构图、时序图等):

  • 根据图表类型的领域规则计算坐标
  • 流程图:主路径向下,"否"分支向右
  • 泳道图:列 × 行网格,泳道固定行序
  • 架构图:预定义层级从上到下堆叠
  • 时序图:参与者横排等距,消息纵向堆叠
2.3 生成流程
1. 读取专属规范 → 了解数据结构和布局规则
2. 定义数据(nodes/edges/steps/tables 等)
3. 计算布局坐标(ELKjs 或手动)
4. 渲染 SVG(节点 → 连线 → 标签,按层级顺序)
5. 写入 HTML 文件(含内联 JS + CSS)
6. 用 capture.py 截图 → PNG(禁止手动调用 Playwright)
2.4 HTML 模板结构

所有模板遵循统一结构:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<style>
  * { margin: 0; padding: 0; box-sizing: border-box; }
  body {
    font-family: -apple-system, system-ui, 'PingFang SC', sans-serif;
    background: #ffffff;
    padding: 24px;
    display: inline-block;  /* 关键:画布收缩包裹内容 */
  }
</style>

<script src="lib/elk.bundled.js"></script>
</head>
<body>
<svg id="canvas"></svg>
<script>
(function() {
  // 1. 数据定义(title, subtitle, nodes, edges 等)
  // 2. 主题定义(colors, fonts, spacing)
  // 3. 工具函数(el, measureText)
  // 4. 布局计算(ELKjs 或手动)
  // 5. 渲染(背景层 → 连线层 → 节点层 → 标签层)
})();
</script>
</body>
</html>
2.5 标题规范

标题默认行为取决于调用场景——但记住:标题、副标题、顶部标签条、底部图例、节点 icon 等都是可叠加的独立组件,不是"评审级必备"。完整组件清单和触发条件见 references/diagrams/review-grade.md。

调用场景默认行为
用户直接请求画图标题 + 副标题(普通尺寸)
deep-research 报告配图不带标题,章节标题承担
writing skill 嵌入文档的配图不带标题,章节标题承担
writing skill 路演 / 评审 HTML 配图大字标题 + 副标题默认开,其他叠加组件按内容评估(见 review-grade.md)
用户明确说"画评审版 / 路演图"进入 review-grade 评估流程,逐组件判断是否叠加
用户明确说"不要标题"跳过标题渲染

渲染参数:

  • title 为空字符串或 null 时跳过标题渲染,标题区高度设为 0
  • 普通标题:左上角(x=0, y=18),16px bold,颜色 #1a1a2e,标题区 52px
  • 普通副标题:12px,颜色 #888888,y=36
  • 大字标题(review-grade.md 二.1):22px Bold(投屏远距离可读),标题区 ≥ 70px
  • 大字副标题(review-grade.md 二.2):14px Regular

重要原则:被 writing 路演 HTML 调用 ≠ 必须开全部叠加组件。仍要按内容形态逐项评估,简单图就该简单画。

// 标题可选的标准写法
var TITLE_AREA_H = title ? 52 : 0;

// 渲染时条件判断
if (title) {
  nodeGroup.appendChild(el('text', { ... })).textContent = title;
  if (subtitle) nodeGroup.appendChild(el('text', { ... })).textContent = subtitle;
}

第三步:输出规范

3.1 ファイル形式

PNG(デフォルト) — Markdown ドキュメントの図版用:

  • 背景:白色 #FFFFFF
  • 周囲のパディング:最低 24px
  • 拡大縮小:デバイスのネイティブ DPI(Retina デバイスでは自動的に 2x の高精細画像を出力)

HTML(任意) — リッチドキュメントへの埋め込み、インタラクティブな表示用:

  • 自己完結型:すべての CSS/JS をインライン化し、外部依存なし。単一ファイルをブラウザーで直接開けます
  • ベクター:SVG は劣化なく拡大縮小でき、テキストを選択/検索できます
  • 適した用途:HTML レポートへの埋め込み、インタラクティブなアーキテクチャドキュメントの作成、後から編集する図表
  • 生成方法:python scripts/capture.py input.html -f html

DSL(任意) — Markdown ドキュメントへの埋め込み用。テキストで差分確認でき、バージョン管理できます:

  • 構造図と一部の統計図は Mermaid DSL で出力できます
  • Mermaid 構文のプレーンテキストとして出力します
  • 適した用途:MD ドキュメントの図版に PNG ファイルを管理したくない場合、preview-md でリアルタイムにレンダリングする必要がある場合、GitHub/GitLab のネイティブレンダリングを使う場合
  • 生成方法:テキストを直接出力し、ユーザーが MD ファイルのコードブロックにコピーします

DSL の選択ルール:

図表タイプDSLコードブロックのマーカー
flowchart / sequence / class / state / erMermaid```mermaid
gantt / mindmap / timeline / c4 / sankey / journeyMermaid```mermaid
architecture / swimlane / network / dataflow / orgchart / decision-treeMermaid(flowchart + subgraph)```mermaid
bar / line(棒グラフ、折れ線グラフ)Mermaid(xychart-beta)```mermaid
pie(円グラフ)Mermaid```mermaid
radar / heatmap / scatter / funnel / waterfall などDSL 非対応PNG を引き続き使用
quadrant / gitGraph / block現時点では非対応必要に応じて今後対応

DSL 出力形式の例:

用户:画一个用户登录的流程图,输出 mermaid

输出:
` ` `mermaid
flowchart TD
    A[用户访问登录页] --> B{已有账号?}
    B -->|是| C[输入用户名密码]
    B -->|否| D[跳转注册页]
    C --> E{验证通过?}
    E -->|是| F[跳转首页]
    E -->|否| G[提示错误]
    G --> C
` ` `
用户:画一个微服务架构图,输出 mermaid

输出:
` ` `mermaid
flowchart TD
    subgraph 网关层
        nginx[Nginx 负载均衡] --> api_gw[API Gateway]
    end
    subgraph 服务层
        user_svc[用户服务]
        order_svc[订单服务]
        pay_svc[支付服务]
    end
    subgraph 数据层
        mysql[(MySQL)]
        redis[(Redis)]
    end
    api_gw --> user_svc & order_svc & pay_svc
    user_svc --> mysql
    order_svc --> mysql
    pay_svc --> redis
` ` `
3.2 スクリーンショットの方法

必ず固定スクリプトを使用してください。Playwright MCP ツールを手動で呼び出してスクリーンショットを撮ることは禁止です。

# 结构图:HTML → PNG
python ~/.claude/skills/diagram/scripts/capture.py <HTML文件> <输出路径>.png

# 结构图:HTML → 自包含 HTML
python ~/.claude/skills/diagram/scripts/capture.py <HTML文件> <输出路径>.html -f html

# 统计图:JSON → PNG(bridge.py 内部自动截图)
python ~/.claude/skills/diagram/scripts/bridge.py -c <配置>.json -o <输出路径>.png

# 统计图:JSON → 自包含 HTML
python ~/.claude/skills/diagram/scripts/bridge.py -c <配置>.json -o <输出路径>.html -f html

手動でスクリーンショットを撮れないのはなぜですか? capture.py / bridge.py には、HTTP サービスの起動、ELKjs の非同期処理の待機、Retina 2x 出力、body 要素の特定などのロジックがあらかじめ組み込まれています。手動で browser_run_code / browser_take_screenshot を使用すると、待機処理が漏れて、スクリーンショットが空白になったりぼやけたりするおそれがあります。

3.3 ファイル名

<图表类型>-<描述>.png(英語の小文字 + ハイフン)

3.4 保存場所
  • デフォルト:呼び出し元の Markdown ファイルと同じ階層にある assets/ または images/ ディレクトリ
  • deep-research から呼び出す場合:docs/research/assets/

ツールの依存関係

ツール場所用途
capture.pyscripts/capture.py構造図 HTML → PNG/HTML(内部で Playwright を呼び出します)
bridge.pyscripts/bridge.py統計図 JSON → PNG/HTML(内部で Playwright を呼び出します)
ELKjslib/elk.bundled.js(インライン化済み)ER 図/クラス図/状態図/フローチャート DAG の自動レイアウト

Playwright は capture.py / bridge.py の内部実装としてのみ使用します。スクリーンショットの撮影に Playwright MCP ツール(browser_navigate、browser_take_screenshot、browser_run_code など)を直接呼び出さないでください。

ELKjs の使用方法

ELKjs は自由レイアウト(ノードとエッジの位置をアルゴリズムで最適化する必要がある場面)にのみ使用します。以下の図表タイプではELKjs を使用しません:

  • フローチャートの線形モード(ドメインルール:メインパスは下向き、否定分岐は右向き)
  • スイムレーン図(ドメインルール:レーンの行順は固定)
  • アーキテクチャ図(ドメインルール:階層は事前定義)
  • シーケンス図(ドメインルール:参加者は横並び、メッセージは縦方向)

理由:これらの図表には明確なドメインレイアウトルールがあり、ELKjs による自動最適化ではそのルールが崩れてしまいます(たとえば、レーンの順序が入れ替わったり、グループの位置が変わったりします)。

例外:フローチャートの DAG モード(複数の根ノード、合流、判断を伴わない分岐)では ELKjs を使用します。このようなトポロジーは、「メインパス + サイド分岐」の単純な手動レイアウトでは表現できないためです。詳しくは references/diagrams/flowchart.md を参照してください。

フローチャート DAG モードの注意事項
  • トポロジーを忠実に再現する:存在しない接続は絶対に追加せず、複数の独立した入口を無理に同じ根ノードにまとめないでください
  • ノードタイプは元の図に忠実にする:同じ階層/役割のノードには同じ type を使用します。highlight は、元の図で重要/中核と明示されているノードにのみ使用し、「異なるカテゴリ」を区別するためには使用しないでください。カテゴリの違いは process/external/datastore などの意味を表すタイプで示します

コメント