Communityコーディング&開発github.com

AnisAbdellatif/d2

D2(d2lang.com)で図を作成、編集、デバッグ、スタイル設定、レンダリングするためのスキルです。ユーザーが図、フローチャート、アーキテクチャ図、システム図、ネットワーク図、クラウド図、シーケンス図、ER図、データベーススキーマ、UMLクラス図、C4モデル、状態遷移図、組織図、グリッド・表・行列レイアウト、またはソフトウェアやプロセス構造の「描く・可視化する・マッピングする・スケッチする」といったリクエストをした場合、またD2、d2lang、.d2ファイル、`d2` CLIに言及した場合にこのスキルを使用します。D2のコンパイルエラーの修正、D2図のテーマ変更、マルチボード図(レイヤー、シナリオ、ステップ)の作成、Mermaid/PlantUML/GraphvizからD2への変換、SVG/PNG/PDF/GIF/PPTX/ASCIIへのエクスポートも行います。ユーザーが保存・編集・レンダリングしたい可能性のある図には、アドホックなASCIIアートや手書きSVGよりもD2を優先します。

d2 とは?

このスキルは、テキストから図を生成する宣言型言語D2(d2lang.com)の完全なワークフローを提供します。ユーザーがソフトウェアやシステムの構造を図示したいときに、フローチャート、アーキテクチャ図、シーケンス図、ER図、UMLクラス図、C4モデル、組織図など、あらゆる種類の図をD2で記述し、レンダリングできます。D2のメリットは、手動で座標を指定する必要がなく、宣言的に形状と接続を記述するだけで、レイアウトエンジンが自動的に配置を決定することです。そのため図は短く、diffが取りやすく、後で編集しやすいという特徴があります。 このスキルは、Claude CodeやCursorなどのAIエージェント向けに設計されており、d2 CLIのバージョンチェック、.d2ファイルの作成、コンパイルとレンダリング(SVG/PNG/PDF/PPTX/GIF)、プレビュー画像の確認、エラー修正、そして最終的な成果物の提供という一連の流れをサポートします。組み込みのスクリプト`scripts/d2check.sh`を使用することで、コンパイルとレンダリングを自動化し、バリデーションだけでは検出できないレイアウトエンジンの制約やスタイルの範囲外エラーを事前にチェックできます。 また、このスキルはD2の高度な機能もカバーしています。レイアウトエンジン(dagre、elk、tala)の選択、テーマの適用、マルチボード図(レイヤー、シナリオ、ステップ)、Mermaid/PlantUML/Graphvizからの変換、クラスや変数による再利用、クォーティングに関する詳細なトラブルシューティングなど、実践的な知識を提供します。D2のコンパイルエラーは、構文エラーではなく、クォーティングの誤りやレイアウトエンジンの制限に起因することが多いため、それらの注意点を重点的に解説します。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/AnisAbdellatif/skills/tree/main/skills/d2

Installed? Explore more コーディング&開発 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

D2 図

D2 は宣言型言語です。つまり、形状とそれらの間の接続を記述すると、レイアウトエンジンがすべての配置を自動的に決定します。座標を手動で指定する必要は一切ありません。そのため、D2 の図は短く、diff が取りやすく、後で編集しやすいのです。また、ほとんどのエラーはデザインではなく、構文とレイアウトエンジンの癖 に起因します。

このスキルは、実際のコンパイラで検証された、D2 v0.9.x の完全な実践的知識を提供します。references/ と assets/templates/ にあるすべての例はコンパイル可能です。

ワークフロー

  1. ツールを確認する d2 --version(または scripts/d2check.sh --version)を実行します。d2 がない場合はユーザーに伝え、brew install d2 または curl -fsSL https://d2lang.com/install.sh | sh -s -- を提案します。サイレントインストールは行わないでください。
  2. 図の種類を選択し、対応するリファレンスを読んでください(下の表)。該当するテンプレートが assets/templates/ にある場合は、そこから始めてください。
  3. .d2 ファイルを作成します(ユーザーが希望する場所。デフォルト: diagrams/<name>.d2)。
  4. scripts/d2check.sh <file.d2> [outdir] [pdf|pptx|gif] でコンパイルおよびレンダリングします(フォーマット、コンパイル、SVG レンダリング、outdir/preview/ に PNG プレビュー、およびその他の追加フォーマットを生成します)。d2 validate だけに依存しないでください。これは構文しか解析しません。不正な形状名、範囲外のスタイル、サポートされていないレイアウト機能、欠落したインポートはすべて validate を通過し、コンパイル時に失敗します。
  5. 画像を確認します。 preview/ 内の PNG を開き(.png ファイルに Read ツールを使用)、ラベルの重なり、エッジのもつれ、フロー方向の誤り、不均衡なレイアウトなどを評価します。修正して再レンダリングします。コンパイルできても読めない図は完成ではありません。
  6. 成果物を納品します(.d2 ソースファイルとレンダリングされたファイル)。使用したレイアウトエンジン、テーマ、方向も併せて伝え、ユーザーが変更できるようにします。

ファイルを作成しない簡単な一回限りの場合: echo 'a -> b' | d2 - out.svg

ひと目でわかる構文

direction: right                    # up | down | right | left(ルートレベル。TALA のみコンテナごとに指定可能)

# 形状: キー、オプションのラベル、オプションの属性
web: Web App {shape: rectangle}     # キー `web`、ラベル "Web App"
db: Postgres {shape: cylinder}
user: Customer {shape: person}

# 接続: -> <- <-> --  (常にキーを参照し、ラベルは参照しない)
user -> web: uses
web -> db: SQL {style.stroke-dash: 3}
web -> cache: reads              # 宣言されていないキーはその場で作成される

# コンテナ: ドットまたはネストされたマップ
backend: {
  api -> worker: enqueue
  worker -> _.db: writes         # _ = 親スコープ
}
web -> backend.api: HTTPS

# スタイルは属性に記述する
db.style.fill: "#e6f2ff"         # # で始まるものは引用符で囲む
(web -> db)[0].style.stroke: red # インデックスで接続をスタイル指定

# 再利用: クラス、変数、グロブ
classes: {
  store: {shape: cylinder; style.fill: "#e6f2ff"}
}
cache.class: store
vars: {env: prod}
note: Running in ${env}
*.style.border-radius: 8

セミコロンは1行内の項目を区切ります。# はコメント、""" ... """ はブロックコメントです。キーは大文字小文字を区別せず、繰り返し宣言はマージされます(API、api、Api: Gateway は1つの形状で、ラベルは "Gateway" になります)。

クォーティング: エラーの最大の原因

引用符なしの文字列は便利ですが、いくつかの文字には特別な意味があります。ラベルに以下の文字が含まれる場合は、ラベル全体を引用符で囲んでください("..." または '...')。そうしないと、コンパイラがエラーを出すか、さらに悪いことに、ラベルを静かに切り詰めてしまいます。

文字引用符なしでの動作修正例
# (どこでも)行の残りがコメントになる: a: C# language は "C" とレンダリングされるa: "C# language"
[ (先頭)配列として解析される: a: [JSON/HTTPS] は "a" だけをレンダリングするa: "[JSON/HTTPS]"
. (キー内)コンテナを作成する: svc v1.2 は svc v1 > 2 になる"svc v1.2"
& または [ ] (キー内)解析エラー(& はグロブフィルターマーカー)"R&D", "svc[0]"
$ ({ 以外に続く場合)"substitutions must begin on {"シングルクォート: 'costs $5'
{ } `` (ラベル先頭)マップまたはブロック文字列を開始する
予約語を形状キーとして使用 (label, link, class, top, style, shape, icon, near, direction, vars ...)"reserved keywords are prohibited in edges""link" -> b、または別のキーを選ぶ
エッジラベル内の -> または :実際には問題ない (a -> b: Time: 10s は動作する)引用符は不要
:(全角コロン)などの非ASCII句読点コロンとして認識されないASCIIの : ; . を使用する

16進数カラーは引用符で囲む必要があります("#fff")。# がコメントを開始するためです。シングルクォートは ${...} 置換も無効にします。

ラベル内の改行: 引用符あり/なしのラベル内での \n、またはリッチテキスト用のブロック文字列 |md ... |。

注意すべき点(デバッグ前に読むこと)

  • デフォルトのレイアウトエンジン Dagre は、コンテナとその子孫との接続を描画できません (a -> a.b)。コンテナのサイズを変更できません(width/height)。また、near: <object> を使用できません。コンパイル時にエラーになります。図を書き直す代わりに、--layout=elk(または vars.d2-config.layout-engine: elk)に切り替えてください。
  • 予約語は大文字小文字を区別せずに照合されます。 Shape、Label、Class、Style、Link、Icon... という名前の形状やUMLクラスはキーワードと衝突します(reserved field shape does not accept composite)。名前を変更してください。
  • キーで接続し、ラベルでは接続しないでください。 be: Backend の後で Backend -> x とすると、新しい 形状 "Backend" が作成されます。be -> x を使用してください。
  • 繰り返しの接続はマージされません。 a -> b を2回記述すると、2本の矢印が描画されます。(a -> b)[0]、(a -> b)[1] のように指定します。
  • d2-legend は変数であり、形状ではありません。 vars: { d2-legend: { ... } } の中に配置します。トップレベルの d2-legend: "" は、単に "d2-legend" という名前の通常の形状になります。
  • シーケンス図: 宣言の順序が画面上の順序になります。アクターは最初に宣言し、グループ内ではトップレベルに存在するアクターのみを参照できます。
  • SQLテーブルとUMLクラス: 行 を接続します(orders.user_id -> users.id)。ELK または TALA を使用して、エッジが正確な行に着地するようにします。
  • 矢印の形状は、矢印がある端点にのみレンダリングされます。 A -> B で source-arrowhead.shape: diamond としても、A には何も描画されません(-- はまったく形状を描画しません)。形状をターゲットに配置するようにエッジを反転するか、<-> を使用します。
  • d2 fmt は予約語のラベルを書き換えます(lnk: Link は lnk: link になります)。scripts/d2check.sh はファイルをその場で fmt します。そのようなラベルは引用符で囲んでください(lnk: "Link")。
  • ブロック文字列 |md ... | は次の | で終了します。内部にリテラルのパイプ記号が必要な場合は、より長い区切り文字を使用します: |md ... | または ||md ... ||。
  • 数値スタイルの範囲が強制されます: stroke-width 0-15、opacity 0-1、font-size 8-100。text-transform は none|uppercase|lowercase|capitalize を取ります(ウェブサイトには title とありますが、コンパイラは拒否します)。3d は rectangle、square、hexagon でのみ機能します。
  • animated: true や dark-theme-id は、要求がない限り追加しないでください。 アニメーションはランタイムデータフローを意味します。ダークテーマは、OSがダークモードの閲覧者のために色をサイレントに反転させます。
  • 形状の塗りつぶし色はテーマを上書きします。 テーマと少数の classes を優先し、色が意味を持つ場合(その場合は凡例を追加する)にのみ明示的な色を使用します。
  • PNG/PDF/PPTX/GIF は v0.9+ ではブラウザなしでレンダリングされます。 古いバージョン(<0.8)では Playwright/Chromium が必要で、初回使用時にダウンロードされます。d2 --version を確認してください。
  • TALA は v0.9 にバンドルされています(--layout=tala)が、非決定的です。小さなラベルの変更でレイアウトが再シャッフルされる可能性があります。再現性が重要な場合は、data.tala-seeds で固定します。
  • マルチボードファイル(layers/scenarios/steps) は、SVG と PNG を ディレクトリ としてエクスポートします(x/index.svg、x/layers/a.svg)。同じ名前の PNG をレンダリングすると、SVG ディレクトリが置き換えられます。フォーマットは別々のフォルダに保持します(スクリプトはそのようにします)。ドリルダウン可能な成果物には PDF を使用します(1ページに1ボード、クリック可能な link: layers.x)。「戻る」形状を手書きしないでください。エクスポーターが自動的にパンくずリストバーを追加します。references/composition.md を参照してください。
  • 出力ファイルが存在しても成功を意味しません。 D2 はエラー時に部分的なレンダリングを書き込む可能性があります。終了コードを確認してください(スクリプトは確認します)。

レイアウト、方向、テーマの選択

  • レイアウトエンジン: dagre(デフォルト、高速、曲線エッジ)→ elk(直交ルーティング、アーキテクチャ図、SQLテーブル、コンテナ間エッジに最適)→ tala(対称性、コンテナごとの direction、near: object、固定 top/left)。コンテナやテーブルがある場合は、デフォルトで ELK を使用します。
  • 方向: パイプライン、リクエストフロー、ワイドスクリーンには right。階層や組織図には down。ボード全体で1つを選択します。
  • テーマ: theme-id: 0 デフォルト。4 Cool classics と 3 Flagship Terrastruct はモダンな見た目。1 Neutral grey は落ち着いたドキュメント向け。8 は色盲セーフ。300/301 はターミナル。303 は C4。200/201 はダーク。完全なテーブルは references/cli-and-rendering.md にあります。
  • レンダリング設定はファイルに記述すると、ファイルと一緒に持ち運べます:
vars: {
  d2-config: {
    layout-engine: elk
    theme-id: 4
    pad: 40
  }
}

(CLI フラグと D2_* 環境変数はこのブロックを上書きします。)

デザインガイダンス

  • 1ボードあたり 3 ~ 12 個の形状。 それを超える場合は、layers(ズームイン)、scenarios(バリエーション)、steps(段階的表示)で分割するか、コンテナを使用してグループ化します。
  • キーで名前を付け、ラベルは人間のために: 短く安定したキー(pg、auth)、読みやすいラベル(pg: PostgreSQL)。
  • エッジラベルは動詞またはプロトコルにします(reads、publishes、HTTPS)。文やターゲットの名前ではありません。
  • 形状を意味に合わせます: cylinder はストア、queue、person、cloud は外部、diamond は決定、hexagon はサービス、document/page、package、step。すべてを rectangle のままにしないでください。
  • 色は意味をコード化するか、何もしません。 多くても約5カテゴリまでにし、classes を通じて適用します。色がラベルが伝えない情報を伝える場合にのみ d2-legend を使用します。
  • 1つのボードには1つの抽象度レベル。
  • D2 は、ホワイトボード規模(最大数百個の形状)でソフトウェアとシステムを文書化するためのものです。ガントチャート、マインドマップ、ベン図、サンキー図、円グラフ/棒グラフ、地理的マップは意図的にサポートしていません。また、1つのオブジェクトが2つのコンテナに存在することはできません。D2 を無理に使うのではなく、その旨を伝えて別のツールを提案してください。

リファレンスマップ

タスクに必要なものだけを読んでください。

タスク読むもの
構文の疑問: キー、ラベル、接続、コンテナ、文字列、エスケープ、コメント、予約語references/language.md
形状、すべてのスタイルキーとその範囲、矢印、テキスト/マークダウン/LaTeX/コード、アイコン、near による配置、サイズ、テーマreferences/shapes-and-styling.md
シーケンス図、SQLテーブル(ERD)、UMLクラス、グリッド、凡例、ツールチップ/リンク、C4references/diagram-types.md
クラス、変数、グロブとフィルター、オーバーライドと null、インポート、suspend モデルreferences/reuse-and-globs.md
レイヤー、シナリオ、ステップ、ボードのリンク、大規模図のインポート、マルチボードエクスポートreferences/composition.md
CLI フラグ、レイアウトエンジン、テーマテーブル、エクスポート形式、d2-config、ドキュメント/CI への埋め込み、D2.jsreferences/cli-and-rendering.md
図ファミリーごとの既製パターン(アーキテクチャ、フローチャート、状態、ERD、C4、組織図...)references/recipes.md + assets/templates/*.d2
Mermaid / PlantUML / Graphviz からの変換references/recipes.md(変換セクション)
エラーメッセージや誤ってレンダリングされる図references/troubleshooting.md

コンパイルが失敗した場合

scripts/d2check.sh file.d2 を実行します。エラーは file:LINE:COL: message の形式で出力されます。references/troubleshooting.md でメッセージを調べてください。よくある原因は、クォーティング(上記)、レイアウトエンジンの制限(ELK に切り替え)、未知の形状や範囲外のスタイル、ブロック文字列のインデントです。一度に1つのエラーを修正して再実行してください。後のエラーは最初のエラーの結果であることが多いです。

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

関連スキル