「アーキテクチャ図を描いて」とAIに頼むと、たいてい角丸の四角が均等に並んだ、どこの資料にも属さない図が返ってくる。cathrynlavery/diagram-design(MIT・2026-08-14時点★16,028)は、この問題を汎用の作図AIではなく 27種の型と機械強制されたスタイル規約 で解こうとしたエージェントスキルだ。Claude Code/Codex/Pi のいずれにもプラグインとして入る。運用の全体像はClaude Code|2026年版・インストールからCLAUDE.md・Hooks・本番運用までの実装手引きにまとめてある。
30秒でわかる diagram-design
- ・型は27種、コードで固定。
references/type-*.mdはちょうど27ファイル(GitHubの説明文の29は数え方の違い) - ・自己完結の境界を実測。同梱HTML 103枚で
<img>0件・@import0件、scriptは4枚のみ。ただし103枚すべてが Google Fonts のCSSを1本読む - ・規約は文章でなくCIで強制。CIの19ステップのうち図の品質に直接効く8本を回し全合格
- ・壊した図は6通りすべて差し戻された(同梱
self_check.pyが exit 1) - ・既存Mermaidは「変換」でなく「描き直し」。日本語フローチャートを11ノード11エッジと解析し「上限9を超過」「style 5個破棄」と報告
diagram-designとは——類似の作図スキルとの棲み分け
本稿の実測は2026-08-14時点のスナップショット
- ・2026-09-10 時点では
references/type-*.mdは40ファイル(説明文は「38 editorial diagram types」)、同梱アセットHTMLは162枚、スターは37,007 - ・型27種・同梱103枚は2026-08-14に実際に走らせた結果。設計の考え方(型をコードで固定・規約をCIで強制・異常系を差し戻す)は変わっていないが、個数を引用するなら最新の
mainで数え直す
2026年4月16日作成のリポジトリで、Internet Archive のスナップショットでは 2026-08-13 05:53 UTC でスター11,497・フォーク728・ウォッチャー43、約28時間後の 2026-08-14 09:32 UTC でスター16,028・フォーク961・ウォッチャー64 と、1日で4,500以上増えていた。.claude-plugin/plugin.json のバージョンは 2.3.3。
中身は素朴で、スキル本体はMarkdownの集合体だ。SKILL.md が振る舞いと選定ルールを、references/ が型ごとの仕様書を持ち、描くのはエージェント自身でレンダラは介在しない。だから規約を言葉で決め、機械で検査する構成になる。
| diagram-design | Archify | oh-my-mermaid | 素のMermaid | |
|---|---|---|---|---|
| 主な入力 | 自然文/draw.io/Mermaid | 自然文 | 既存コードベース | 手書きのDSL |
| 出力 | 自己完結HTML+インラインSVG(PNG/SVG書き出し可) | 自己完結HTML(PNG/JPEG/WebP/SVG) | .mmd + Markdown文書 |
描画結果 |
| 型の数 | 27種(+primitive 4種) | 5種 | Mermaidの図種に準拠 | Mermaidの図種に準拠 |
| ブランド適用 | サイトURLからトークン抽出+WCAG AA検査 | ダーク/ライト自動切替 | テーマ設定に依存 | テーマ設定に依存 |
| 規約の強制 | CI 19ステップ+同梱 self_check.py | — | — | — |
| 配布 | Claude Code/Codex/Pi のマーケットプレース | zip配布 | npm + 各ツールへの setup | ライブラリ |
| 向いている用途 | 公開する記事・スライド・提案書の版面 | 手早く技術図を1枚 | コードベースの構造文書化 | 開発内のやり取り |
oh-my-mermaid は「コードから図を起こす」、Archify は「言葉から手早く1枚」、diagram-design は 「出した図をそのまま公開できる版面にする」 に重心がある。本文に埋め込むだけなら素のMermaidで足りるが、提案書の図を毎回Figmaで整えているなら置き換えの候補になる。
「27」という単位——数え方と、型を増やさない工夫
references/type-*.md は ちょうど27ファイルで、README本文の3か所も「27 visual types」、verify-semantic-motion.py も「7つの意味パターンが27種の視覚型へ独立にルーティングされる」ことを検査する。数え方による違いは次のとおり。
| 数え方 | 数 | 何を数えたか |
|---|---|---|
references/type-*.md |
27 | 型ごとの仕様書。スキルが「型」として扱う単位 |
| README本文の記述 | 27 | 本文3か所すべてで一致 |
assets/index.html のギャラリー項目 |
36 | <span class="eyebrow"> の数。縦組み・ターミナル装飾・取り込み例・モーション例を個別に数える |
| GitHubリポジトリの説明文 | 29 | 「29 editorial diagram types for Claude Code」。Internet Archive の2026-08-13スナップショットで確認。リリースタグは未作成でひも付け先が無い |
references/ には注釈・アイコン・手描き風・ターミナル装飾の primitive が4種 あり、型を増やさず既存の型に重ねる装飾として扱われる。v2.3で入った 意味パターン も同じ発想で、ファンインするキュー、ステージ枠、非構造入力の変換、対になるポリシートレース、安全な舗装道路(paved road)、ガバナンスのカタログ、多層の防御の7つは「振る舞い」として semantic-patterns.md に定義され、発火条件・部品・要素数の予算・アンチパターン・最も近い視覚型が決まっている。キューを描くときも型を新設せず既存の型へ寄せる。
モーションも none/reveal/step/loop の4モードで 既定は none。静止first frameを必ず持ち、タイミングは決定論的で、OSの「視差効果を減らす」が有効なら静止フレームだけを見せる。許されるスクリプトは template-motion.html の正規コントローラのみだ。
HOW IT DRAWS依頼から1枚まで
型を選び、描き直し、最後に自分で検査する
-
型を選ぶ
7パターン→27の型
-
描く・描き直す
既存の図は4ダイヤルで
-
HTMLを書き出す
既定は静止・scriptなし
-
self_check.py
差し戻しなら exit 1
diagram-designの主張は実測に耐えるか——自己完結性・CI・異常系
規約がREADMEのポエムで終わっていないかを、2026-08-14時点の main で実際に走らせて確かめた。
MEASURED回して確かめた
規約は文章ではなく、走るコードで守られていた
0件
同梱103枚の img タグ
外部ホストは Google Fonts の1本だけ
8/8
CIゲートを再実行して合格
ci.yml の19ステップから選んだ8本
6/6
壊した図を差し戻し
self_check.py が exit 1。対照群のみ exit 0
同梱103枚——外部依存は書体1本だけ
READMEの「ビルド手順も、JavaScriptも、外部画像への依存も無い」を、skills/diagram-design/assets/*.html 103枚で数えた。
| 項目 | 実測値(103枚) | 何を意味するか |
|---|---|---|
<img> タグ |
0件 | 図はすべてインラインSVG |
CSS @import |
0件 | スタイルシートの連鎖読み込みが無い |
インライン <script> |
4枚のみ | ギャラリーの index.html・モーション例2枚・モーションテンプレート1枚。静止99枚はscriptゼロ |
| 外部ホスト | 1つ(fonts.googleapis.com) |
書体のみ。ホスト名完全一致でlintが検査 |
| 書体フォールバック | 全変数にあり | オフラインでは劣化するが破綻しない |
| 最小テンプレのサイズ | 3,253バイト | template.html。実例(example-*.html 96枚)は5,080〜30,457バイト |
103枚すべてが https://fonts.googleapis.com/css2?... を1本読むが、原文は “no build step, JavaScript, or external image dependency” で、README自身もSVGエクスポート時のGoogle Fonts注入を明記している。--font-sans は 'Geist', system-ui, sans-serif のようにフォールバックを持つので、エアギャップ環境では書体が差し替わるだけで版面は崩れない。
CIのゲート8本を回す
ci.yml がPythonスクリプトを走らせるステップは19本あり、図の品質に直接効く8本をローカルで再実行した(verify-semantic-motion.py だけは、CIが --markdown-only と --example-only に分けて呼ぶところを引数なしで通した。他の7本はCIと同じ引数)。
git clone --depth 1 https://github.com/cathrynlavery/diagram-design.git
cd diagram-design
python3 scripts/verify-docs-sync.py # 説明文・ギャラリー到達性・READMEツリーの同期
python3 scripts/verify-geometry.py --all # 4pxグリッド等の幾何検査
python3 scripts/lint-skin.py --all --baseline # 配色・外部資源・a11y契約
python3 scripts/verify-motion.py --shipped # 出荷済みモーションHTML
python3 scripts/verify-semantic-motion.py # 意味パターン→型のルーティング
python3 scripts/verify-mermaid-import.py # Mermaid取り込みの文法・上限・異常系
python3 scripts/verify-drawio-import.py # draw.io取り込み(DTD拒否含む)
python3 scripts/verify-sequence-oauth.py # シーケンス型のALT構造
8本すべて終了コード0。verify-geometry.py --all は103ファイルで指摘0、lint-skin.py は101検査20除外で指摘0、verify-mermaid-import.py は敵対的ラベルの不活性化や文書化されたexit 2経路の発火まで見ている。lint-skin は配色以外に、純黒 rgb(0,0,0)、CSS @import、外部HTTP(S)の <link>/src、フラグメント以外の CSS url()、<svg> 上の実行可能属性を拒否し、<svg> の先頭子要素に非空の <title> と <desc>、それを順に指す aria-labelledby、図ごとに接頭辞のあるID(id="title" のような裸のIDは不可)を要求する。モーションのコントローラは template-motion.html と完全一致でないと通らない。
ただし --baseline を外すと終了コード1で46件——「パレットに無い色」36件と「許可色から派生していない色」10件で、指摘は11ファイル。scripts/lint-skin-baseline.txt には20ファイル名が並び、指摘の無い9ファイルも含む。教科書的なbaseline運用で欠陥ではないが、「全アセットがトークンだけで塗られている」とまでは言えない。取り込む前に一度外して見ておきたい。
壊した図を6通り食わせる
エージェントが自分の出力を検査する縮小版が scripts/self_check.py として同梱されている。無改変の example-architecture.html を対照群に、6通りの改ざんを食わせた。
cp skills/diagram-design/assets/example-architecture.html clean.html
python3 skills/diagram-design/scripts/self_check.py clean.html # → OK / exit 0
# 遠隔画像を注入
sed 's|<svg |<img src="https://evil.example.com/t.png"><svg |' clean.html > a.html
python3 skills/diagram-design/scripts/self_check.py a.html # → FAIL / exit 1
| 注入した改ざん | self_check の応答 |
|---|---|
遠隔 <img> を挿入 |
remote reference on <img>: https://evil.example.com/... |
インライン <script> を追加 |
script 1 must carry only the canonical data-diagram-controls attribute |
<svg> に onload を付与 |
executable attribute onload on <svg> |
SVGの <title> を削除 |
svg 1 title must be its first child ほか3件 |
<desc> を空にする |
svg 1 needs non-empty title and desc |
フォント配信元を fonts.googleapis.com.evil.example に |
remote stylesheet is not the approved Google Fonts /css2 URL |
許可ホストはホスト名の完全一致で判定され、類似ドメインでは抜けられない。HTMLの <head> の <title> を消しても exit 0 で通るのは、守る対象がSVGのアクセシブル名であってページタイトルではないからだ。
導入と運用——3系統への配布、常駐コスト、ブランド取り込み
配布は3系統のマーケットプレース経由で、いずれも skills/diagram-design/ を読む。
# Claude Code(マーケットプレース追加 → インストール)
/plugin marketplace add cathrynlavery/diagram-design
/plugin install diagram-design@diagram-design
# Codex
codex plugin marketplace add cathrynlavery/diagram-design
codex plugin add diagram-design@diagram-design
# Pi(Gitからの非固定インストール)
pi install https://github.com/cathrynlavery/diagram-design
Claude Codeはサードパーティ製マーケットプレースの自動更新を既定で無効にしており、/plugin → Marketplaces → diagram-design → Enable auto-update を一度有効にしないと更新が来ない。Piは自動更新が無く pi update --extensions を手で叩く。スタイルガイドを編集するなら、更新で references/style-guide.md が上書きされうるのでクローンしてシンボリックリンクを張る「editable install」が案内されている。組織のGitHubマーケットプレース(Cowork)はprivate/internalリポジトリを要求するので自組織へミラーする。リリースタグが未作成(plugin.json の 2.3.3 のみ、Releasesは空)なので、版の固定はコミットSHA頼みだ。
初回だけゲートがあり、style-guide.md が既定のままなら「オンボーディングを走らせるか、トークンを手で貼るか、既定で進めるか」を聞いて止まる。既定配色は「白(white-smoke)の紙・ジェットブラックの文字・アトミックタンジェリンのアクセント・ブルースレートの副次テキスト」。PNG書き出しは pip install playwright && playwright install chromium が前提(既定倍率2×)で、書き出したSVG/PNGは図だけで -full 版の編集カードやヘッダは含まない。
CONTEXT COST常駐するのはどこまでか
「37KBが常時」ではなく、作図のときだけ37KB+数KB
-
1段目
name と description
614バイト。スキル一覧として常時
常時
-
2段目
SKILL.md 本体
37,408バイト。作図系の依頼で起動したとき
起動時
-
3段目
選ばれた型の references/type-*.md 1本
中央値2,790バイト(最小991/最大29,984)
型が確定したとき
references/ 全体は429,282バイトだが、全部が載ることはまず無い。最大の primitive-icons.md(106,768バイト、全体の約4分の1)もアイコンを明示的に使うときしか読まれない。測り方はClaude Skillsとは|「スキル=フォルダ」の仕組みと作り方・使い方を徹底解説の構造をそのまま当てはめればよい。
「onboard diagram-design to https://yoursite.com」と頼むと、トップページのパレットとフォントスタックを役割に割り当てる。<body> の背景が paper、主な文字色が ink、副次テキストが muted、カード類が paper-2、最も使われるブランド色が accent。フォントは <h1> が title、<body> が node-name、<code> が sublabel だ。書き込み前に ink と paper のコントラストをWCAG AAで検査し、9〜12pxの図中サイズで基準を割る色は調整値と理由を出す。適用後は、サンプリングしたURL・色の対応・フォントと配信元・フォールバックの有無を並べた「忠実度レシート」が出る。以降の図は #eb6c36 のような生の値ではなく accent を参照するので、スタイルガイドの表を書き換えれば27種すべてに反映される。
既存資産の取り込み——日本語のMermaidで試した
既存資産は「変換」ではなく「描き直し」で、引き継ぐのは コンポーネント・関係・グルーピング・方向 だけ。元の座標・配色・フォント・draw.ioの斜め線・Mermaidの自動レイアウトは捨てる。当て先は4つのダイヤルで決まる。フォーマット(html/svg/png/html+png)、サイズ(doc-inline〜slide-16x9〜print-a4-landscape など9種、文字サイズのランプも変わる)、詳細度(faithful ≤24ノード/balanced ≤12/simplified ≤7)、読み手(engineer/mixed/executive。語彙が変わり、Auth Service / JWT · RS256 · :8443 が Sign-in になる)。詳細度の上限が実質の制約で、大きな図は必ずどこかを落とすが、何を統合し何を落としたかは「忠実度台帳」に出る。
前段の scripts/mermaid_extract.py は実行可能なパーサだ。当サイトの既存記事の日本語フローチャート——全角の判断ノード、<br/> の改行、style ... fill:#4CAF50 を含む実物——を投げた。
python3 skills/diagram-design/scripts/mermaid_extract.py jp-decision.mmd
# 1 diagram(s): [0] flowchart (11n/11e)
# - shapes: {'rect': 7, 'rhombus': 4}
# - budget: nodes OVER (max 9), edges ok (max 12)
# - discarded: 5 style directives, 0 click handlers
日本語ラベルはそのまま保持され、<br/> は digest 上で ⏎ になる(--json のIR側では \n のまま)。rect 7・rhombus 4で判断ノードを正しく識別し、budget: nodes OVER (max 9) で上限超過を描き直す前に警告し、discarded: 5 style directives で捨てた色指定の数を黙らずに出す。digest には「ハブ(注目候補)」「入口ノード」「終端ノード」も出て、当サイトの図では「チームで運用するか?」が次数4で最大のハブ、つまりアクセント色を当てる候補と判定された。draw.io側も .drawio / .drawio.xml / .drawio.png(埋め込み図)/ .drawio.svg と圧縮ペイロードに対応し、verify-drawio-import.py はDTD拒否・PNG境界・資源上限まで検査していた。
効くのは型の数より、その27を崩さないための検査が走るコードとして同梱されている点だ。一方で、baselineを外せば配色の逸脱が46件見え、詳細度の上限は大きな既存図を削り、版の固定はコミットSHA頼みになる。どれも「規約を機械で守る」設計と地続きの制約で、把握して使えば見積もりを外さない。
参照ソース
・cathrynlavery/diagram-design — GitHubリポジトリ(README・SKILL.md・scripts/・skills/diagram-design/)
・diagram-design 公式ギャラリー(cathrynlavery.github.io/diagram-design)
・Agent Skills — Anthropic 公式ドキュメント
・本稿の実測: 2026-08-14 時点のツリー(コミット e1d47bb0、plugin.json v2.3.3)を対象に検証した。同梱アセット103枚の集計、ci.yml が呼ぶゲート8本の再実行、self_check.py への異常系入力6件、mermaid_extract.py への日本語Mermaid入力(当サイトのプロンプトエンジニアリングとハーネスエンジニアリングの違いに載せている11ノードのフローチャート)はいずれも本稿のために実施した。本文の引用文字列・ファイル名・数値は2026-09-10に同ツリーへ再度突き合わせ済み。リポジトリのスター数等は Internet Archive のスナップショットで確認した





