@shibayama/pdgkit 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,709 @@
1
+ # pdgkit
2
+
3
+ pdgkit は、特許図面記述言語 PatentDSL(`.pdg`)から特許図面を生成する、ブラウザ非依存のライブラリおよびコマンドラインツールです。
4
+
5
+ `.pdg` は **P**atent **D**iagram **G**rammar の略で、特許図面に必要な符号、包含関係、接続関係を記述するための専用記法を指します。PatentDSL の記法をそのまま用い、ブロック図、フローチャート、シーケンス図、状態遷移図を、定義・包含・接続の 3 種類の文で記述します。入力内容から図種を自動判定し、SVG、PNG、JPEG、PDF、PPTX、編集可能 PPTX、符号表 Markdown、符号表 CSV を出力します。
6
+
7
+ pdgkit は、本家 PatentDSL がブラウザ上の単一 HTML ツールであるのに対し、その構文解析・自動レイアウト・描画エンジンを Node から、あるいは任意の言語から呼び出せる部品として再実装したものです。AI による明細書作成ツールに組み込み、AI に特許図面を描かせることを主な目的とします。
8
+
9
+ ## 目次
10
+
11
+ 1. [概要](#概要)
12
+ 2. [PatentDSL との関係](#patentdsl-との関係)
13
+ 3. [設計方針](#設計方針)
14
+ 4. [主な機能](#主な機能)
15
+ 5. [インストール](#インストール)
16
+ 6. [使い方](#使い方)
17
+ - [ライブラリとして(Node / TypeScript)](#ライブラリとしてnode--typescript)
18
+ - [コマンドラインとして](#コマンドラインとして)
19
+ - [ChatGPT / Claude などの Web チャットと併用する](#chatgpt--claude-などの-web-チャットと併用する)
20
+ - [Claude Code / Codex などのコーディングエージェントと併用する](#claude-code--codex-などのコーディングエージェントと併用する)
21
+ - [各種 LLM API に組み込む](#各種-llm-api-に組み込む)
22
+ - [MCP サーバとして](#mcp-サーバとして)
23
+ 7. [AI に図を描かせるワークフロー](#ai-に図を描かせるワークフロー)
24
+ 8. [基本記法](#基本記法)
25
+ 9. [ライブラリ API](#ライブラリ-api)
26
+ 10. [CLI リファレンス](#cli-リファレンス)
27
+ 11. [出力形式](#出力形式)
28
+ 12. [アーキテクチャ](#アーキテクチャ)
29
+ 13. [本家との忠実性](#本家との忠実性)
30
+ 14. [開発](#開発)
31
+ 15. [プライバシー](#プライバシー)
32
+ 16. [ライセンス](#ライセンス)
33
+ 17. [クレジット](#クレジット)
34
+
35
+ ## 概要
36
+
37
+ pdgkit は次の 3 つの経路で、あらゆるホストに組み込めます。
38
+
39
+ - npm ライブラリとして直接 import する(Node / TypeScript)
40
+ - コマンドラインツールを子プロセスとして起動する(Python その他、言語を問わない)
41
+ - MCP サーバとして公開する(LLM エージェント)
42
+
43
+ 知能(自然言語から良い `.pdg` を書く判断)はホスト側の AI が担い、pdgkit は決定論的な検証と描画に徹します。同じ入力からは常に同じ出力が得られ、乱数・時刻・フォント実測には依存しません。
44
+
45
+ ## PatentDSL との関係
46
+
47
+ | 項目 | PatentDSL(本家) | pdgkit |
48
+ |---|---|---|
49
+ | 形態 | 単一 HTML(ブラウザ GUI) | npm ライブラリ + CLI(ヘッドレス) |
50
+ | 実行環境 | ブラウザ | Node 18 以上 / 任意言語から子プロセス |
51
+ | 主な用途 | 人が手で図を描く | プログラムや AI が図を生成・検証・描画する |
52
+ | 入力 | エディタへの手入力 | `.pdg` テキスト(API 引数・ファイル・標準入力) |
53
+ | 記法 | `.pdg` | 同一(同じ構文解析・レイアウト・描画を移植) |
54
+
55
+ `.pdg` ソースは本家と pdgkit で完全に相互運用できます。記法の詳細は [docs/spec.md](docs/spec.md) を参照してください。本家リポジトリは [shibayamalicht/patent_dsl](https://github.com/shibayamalicht/patent_dsl) です。
56
+
57
+ ## 設計方針
58
+
59
+ - 1 行 = 1 文。改行が文の終わり。
60
+ - 文要素は定義・包含・接続の 3 種類のみ。キーワードを持たない。
61
+ - 図種は構造から自動推論される。
62
+ - 符号(reference numerals)を直接 ID として扱い、明細書本文と照合できる。
63
+ - 座標指定・色指定を持たない。レイアウトは自動のみ。特許図面の慣習に従い黒線のみで描画する。
64
+
65
+ ## 主な機能
66
+
67
+ - テキストから SVG 図面を生成
68
+ - PNG / JPEG の高解像度出力(8 倍、白背景)
69
+ - A4 PDF 出力(日本語フォント埋め込み、ベクタ。失敗時はラスタにフォールバック)
70
+ - PPTX 出力(画像配置)および編集可能 PPTX 出力(図形変換)
71
+ - 符号表の Markdown / CSV 出力
72
+ - 構文検証と図種アサーション(AI 生成物の自己修正に利用)
73
+ - 日本語・英語・日英併記の表示切替
74
+ - MCP サーバ(検証・描画ツールの提供)
75
+ - コアは外部依存なし、SVG 出力はブラウザも jsdom も不要
76
+
77
+ ## インストール
78
+
79
+ pdgkit は **Node.js 18 以上**で動きます。
80
+
81
+ ### Node.js を用意する(まだの方へ)
82
+
83
+ すでに Node.js が入っている場合は次の「pdgkit を入れる」へ。まだの場合は先に入れます。
84
+
85
+ - **共通(推奨)**: [nodejs.org](https://nodejs.org/) から **LTS 版**のインストーラをダウンロードして実行。
86
+ - **macOS**: 上のインストーラ、または [Homebrew](https://brew.sh/) で `brew install node`。
87
+ - **Windows**: 上のインストーラ(`.msi`)、または PowerShell で `winget install OpenJS.NodeJS.LTS`。
88
+
89
+ 入れたら、ターミナル(Windows は PowerShell かコマンドプロンプト)で次を実行し、バージョンが表示されれば準備完了です。
90
+
91
+ ```bash
92
+ node -v # v18 以上であること
93
+ npm -v
94
+ ```
95
+
96
+ ### pdgkit を入れる
97
+
98
+ npm のパッケージ名は **`@shibayama/pdgkit`** です(`pdgkit` は既存パッケージと名前が近いためスコープ付きで公開しています)。インストール後に使えるコマンド名は **`pdgkit`** / **`pdgkit-mcp`** で、`import` するモジュール名は `@shibayama/pdgkit` です。
99
+
100
+ ```bash
101
+ npm install @shibayama/pdgkit
102
+ ```
103
+
104
+ CLI を単発で使うだけなら、インストール不要で `npx @shibayama/pdgkit` も使えます。
105
+
106
+ ```bash
107
+ npx @shibayama/pdgkit render fig1.pdg -o fig1.svg
108
+ ```
109
+
110
+ ソースから使う場合:
111
+
112
+ ```bash
113
+ git clone https://github.com/shibayamalicht/pdgkit
114
+ cd pdgkit
115
+ npm install
116
+ npm run build
117
+ ```
118
+
119
+ ラスタ・PDF・PPTX 出力に用いる依存(`@resvg/resvg-js`、`jspdf`、`jsdom` など)は遅延読み込みされます。SVG と検証だけを使う場合は読み込まれません。
120
+
121
+ ## 使い方
122
+
123
+ pdgkit の主な使い方は、AI に日本語で頼んで図を作らせることです。まず代表的な頼み方を示し、続いて各実行環境への接続方法を説明します。
124
+
125
+ ### AI に自然文で頼む
126
+
127
+ いちばん手軽な使い方です。**コードを実行できる AI** に、最初に一度だけ「セットアップ依頼」を貼り付ければ、あとは日本語で「〜の図を描いて」と頼むだけで、図のファイルまで作ってくれます。
128
+
129
+ 使える AI(どれか 1 つ):
130
+
131
+ - **ChatGPT**(コードインタープリタが使えるもの)
132
+ - **Claude Code / Codex** などのコーディングエージェント
133
+ - pdgkit を登録した **Claude(MCP)** … この場合はセットアップ不要。[MCP サーバとして](#mcp-サーバとして) を参照
134
+
135
+ > ふつうのチャット(コードを実行できない ChatGPT / Claude)でも使えますが、その場合 AI は `.pdg` テキストを書くところまでで、図にするのは手元で行います。後述の「C. コードを実行できない素のチャット」を参照してください。
136
+
137
+ #### ステップ 1: 最初に一度だけ、セットアップを頼む
138
+
139
+ 新しいチャットを開き、次の文をそのまま貼り付けます。pdgkit の導入(`npm install @shibayama/pdgkit`)と記法の読み込みまで AI が行います。
140
+
141
+ ```text
142
+ これから特許図面を作ります。次の準備をしてください。
143
+ 1. npm install @shibayama/pdgkit を実行する。
144
+ 2. npx @shibayama/pdgkit guide を実行し、表示された PatentDSL(.pdg)の記法に厳密に従う。
145
+ 3. 以降、私が日本語で図の内容を伝えます。あなたは .pdg を書いて fig.pdg に保存し、
146
+ npx @shibayama/pdgkit validate fig.pdg でエラーが無いことを確認してから、
147
+ npx @shibayama/pdgkit render fig.pdg(既定は SVG。指定があれば --to png / jpeg / pdf / pptx)
148
+ で図のファイルを作り、私がダウンロードできるようにしてください。
149
+ 図種(ブロック図・フローチャートなど)や出力形式は、私が指定しなければ
150
+ 内容から最適なものを選んで構いません。準備ができたら「準備完了」とだけ返してください。
151
+ ```
152
+
153
+ `fig.pdg` はファイルの名前です(中身は AI が書きます)。**ファイルの作成・保存・実行はすべて AI が行うので、あなたはファイル名を気にする必要はありません。** 上の文をそのまま貼り付ければ大丈夫です。
154
+
155
+ #### ステップ 2: あとは日本語で頼むだけ
156
+
157
+ 「準備完了」と返ってきたら、作りたい図を言葉で伝えるだけです。図種も出力形式も、指定しなければ AI が内容から選びます。
158
+
159
+ 構成・装置(ブロック図になりやすい):
160
+
161
+ ```text
162
+ 制御装置が CPU、メモリ、I/O インターフェースを内蔵し、I/O インターフェースが外部機器へ信号を送る図を描いて
163
+ センサ端末の構成図を描いて。検出部(温度センサと加速度センサ)、処理部(取得部と判定部)、通信部を備え、検出部→処理部→通信部の順にデータが流れ、通信部からゲートウェイへ無線送信する。日英併記で
164
+ 制御部・駆動部・センサ部・対象装置から成る制御ループの図。指令で駆動し、センサが状態を検出して制御部へフィードバック
165
+ ```
166
+
167
+ 処理・方法(フローチャートになりやすい):
168
+
169
+ ```text
170
+ 画像取得→前処理→特徴抽出→欠陥あり?(Yes/No)→警告出力/正常記録→終了 のフローチャートにして
171
+ ログイン処理のフローを描いて。入力→認証成功?で分岐、失敗ならリトライ、成功ならホームへ
172
+ ```
173
+
174
+ 状態・やりとり:
175
+
176
+ ```text
177
+ 待機・動作中・エラーの状態遷移図。起動で動作中、停止で待機、異常でエラー、リセットで待機に戻る
178
+ クライアントとサーバの、認証からリソース取得までのシーケンス図
179
+ ```
180
+
181
+ クレーム文からの変換:
182
+
183
+ ```text
184
+ 次の装置クレームを構成図にして: 撮像部と、前記撮像部が取得した画像を処理する画像処理部と、処理結果を表示する表示部と、を備える撮像装置。
185
+ この方法クレームをフローチャートにして: 画像を取得するステップと、特徴量を抽出するステップと、欠陥の有無を判定するステップと、…を含む検査方法。
186
+ ```
187
+
188
+ 出力形式の指定(続けて頼める):
189
+
190
+ ```text
191
+ さっきの図を PDF にして(出願用)
192
+ 編集できる PPTX にして
193
+ PowerPoint のスライドにして
194
+ PNG で出して
195
+ 日英併記で出して
196
+ 符号表(符号の説明)も Markdown で出して
197
+ ```
198
+
199
+ > うまくいかないときは、AI に「`npx @shibayama/pdgkit guide` をもう一度読んで、`npx @shibayama/pdgkit validate` のエラーが無くなるまで直して」と伝えてください。PNG / PDF / PPTX は環境により失敗することがありますが、SVG は確実に出ます。
200
+
201
+ ### ライブラリとして(Node / TypeScript)
202
+
203
+ pdgkit はコンパイル済みの JavaScript と型定義(`.d.ts`)を同梱しています。**TypeScript のインストールは不要**で、素の JavaScript からも TypeScript からもそのまま使えます(下の例は TypeScript ですが、JavaScript でも同じ `import` で動きます)。
204
+
205
+ ```ts
206
+ import { validate, renderToSvg, renderToPng } from '@shibayama/pdgkit';
207
+
208
+ const source = `#! kind: block
209
+ 10 = 制御装置 / control device
210
+ 11 = CPU
211
+ 12 = メモリ / memory
212
+ 13 = "I/O インターフェース" / "I/O interface"
213
+ 20 = 外部機器 / external device
214
+ 10 : 11 12 13
215
+ 11 - 12
216
+ 13 -> 20 : 信号 / signal`;
217
+
218
+ // 1. まず検証する(AI 生成物は必ず通す)
219
+ const result = validate(source);
220
+ if (!result.ok) {
221
+ console.error(result.diagnostics); // 修正のためホスト AI に返す
222
+ }
223
+
224
+ // 2. 描画する
225
+ const { svg } = renderToSvg(source, { lang: 'ja' });
226
+ const png = await renderToPng(source, { lang: 'ja' }); // Uint8Array
227
+ ```
228
+
229
+ 依存ゼロの構文解析・レイアウト・描画だけが必要なら `pdgkit/core` から import します。
230
+
231
+ ```ts
232
+ import { parse, layout, render } from '@shibayama/pdgkit/core';
233
+ ```
234
+
235
+ ### コマンドラインとして
236
+
237
+ ```bash
238
+ pdgkit render fig1.pdg -o fig1.svg
239
+ pdgkit render fig1.pdg --to png -o fig1.png
240
+ pdgkit render fig1.pdg --to pdf -o fig1.pdf
241
+ pdgkit render fig1.pdg --to pptx --editable -o fig1.pptx
242
+ pdgkit render --sample block --lang both -o block.svg
243
+
244
+ cat fig1.pdg | pdgkit validate -
245
+ pdgkit refs fig1.pdg --format csv -o signs.csv
246
+ pdgkit samples
247
+ ```
248
+
249
+ `<入力>` はファイルパス、`-`(標準入力)、または `--sample <id>` で省略します。
250
+
251
+ ### ChatGPT / Claude などの Web チャットと併用する
252
+
253
+ 使い方は、そのチャットが「コードを実行できるか」で 3 通りに分かれます。コードを実行できるチャットなら、チャット内だけで完結します。
254
+
255
+ #### A. コードを実行できるチャット(推奨)
256
+
257
+ ChatGPT のコードインタープリタは、2026 年初頭以降 Node.js と `npm install` に対応しています(一般的なネット接続はオフですが、パッケージのインストールは可能です)。このようなチャットでは、pdgkit を導入して図の生成・ダウンロードまでチャット内で完結できます。**記法ガイドはパッケージに同梱されているので、プロンプトに貼り付ける必要はありません**(`npx @shibayama/pdgkit guide` で読めます)。**図種(ブロック図など)も指定不要で、AI が発明内容から選びます**。次のように依頼するだけです。
258
+
259
+ ```text
260
+ pdgkit を使って特許図面を描いてください。
261
+
262
+ 1. npm install @shibayama/pdgkit
263
+ 2. npx @shibayama/pdgkit guide を実行し、表示された記法ガイドに従う
264
+ 3. 下の発明について .pdg を書いて fig.pdg に保存する(図種は内容から最適なものを選ぶ。私が指定したらそれに従う)
265
+ 4. npx @shibayama/pdgkit validate fig.pdg がエラーなしになるまで直す
266
+ 5. npx @shibayama/pdgkit render fig.pdg -o fig.svg(PNG なら --to png、PDF なら --to pdf)で図を作り、
267
+ ダウンロードできるようにする
268
+
269
+ 発明:
270
+ 撮像装置に関する。本装置は、被写体を撮像して画像信号を出力する撮像部と、
271
+ 撮像部からの画像信号にノイズ低減とエッジ強調を行う画像処理部と、
272
+ 画像処理部が処理した画像データを格納する記憶部と、
273
+ 画像データを外部サーバへ送信する通信部と、これらを制御する制御部と、を備える。
274
+ 画像は撮像部から画像処理部、画像処理部から記憶部の順に処理され、
275
+ 記憶部の画像は制御部の指示で通信部を介して外部サーバへ送信される。
276
+ ```
277
+
278
+ 注: PNG / JPEG / PDF / PPTX はネイティブ依存(`@resvg/resvg-js`)などを使うため、コンテナ環境に依存します。確実に動くのは依存ゼロの SVG です。Node が使える環境なら全形式が動きます。
279
+
280
+ #### B. ブラウザ内 JavaScript だけ実行できるチャット(Claude.ai の分析ツールなど)
281
+
282
+ `npm install` は使えませんが、ブラウザ用のグローバルバンドル `dist/pdgkit.global.js`(依存ゼロ・約 48KB の IIFE)を貼り付ければ、SVG の生成と検証ができます。PNG / PDF / PPTX はネイティブ依存のためこの環境では作れません。バンドルは描画器であって記法の説明は含まないので、AI に `.pdg` を書かせる場合は下の C のチートシート(または `pdgkit guide` の全文)も一緒に渡してください。
283
+
284
+ このバンドルは、本物の `document` がある環境でも内部の SVG シリアライザだけで動作し、ページの `document` を書き換えません。
285
+
286
+ 使い方:
287
+
288
+ 1. `https://unpkg.com/@shibayama/pdgkit`(= 同梱の `dist/pdgkit.global.js`)の中身を実行欄に貼り付ける。グローバル変数 `pdgkit` が定義される。
289
+ 2. 続けて pdgkit を呼ぶ。
290
+
291
+ ```js
292
+ // pdgkit.global.js を貼った後で:
293
+ const src = `#! kind: block
294
+ 10 = 制御装置 / control device
295
+ 11 = CPU
296
+ 12 = メモリ / memory
297
+ 10 : 11 12
298
+ 11 -> 12 : 信号 / signal`;
299
+
300
+ const v = pdgkit.validate(src); // { ok, kind, diagnostics, ... }
301
+ const { svg } = pdgkit.renderToSvg(src, { lang: 'ja' });
302
+ // svg を画面に表示する、またはファイルとして出力する
303
+ ```
304
+
305
+ ページに組み込む場合は CDN から読み込むこともできます。
306
+
307
+ ```html
308
+ <script src="https://unpkg.com/@shibayama/pdgkit"></script>
309
+ <script>
310
+ const { svg } = pdgkit.renderToSvg("10 = A\n11 = B\n10 : 11");
311
+ </script>
312
+ ```
313
+
314
+ グローバル `pdgkit` には `renderToSvg` / `toSvgString` / `validate` / `parse` / `layout` / `render` / `refsToMarkdown` / `refsToCsv` などが含まれます。ビルドは `npm run build` で `dist/pdgkit.global.js` を生成します。
315
+
316
+ #### C. コードを実行できない素のチャット
317
+
318
+ このケースだけはパッケージを使えないため、AI に記法を伝える必要があります。とはいえ全文を貼らなくても、次の短いチートシートで簡単な図は十分に書けます。AI には `.pdg` テキストだけを書かせ、その出力を手元の pdgkit(または本家 PatentDSL の HTML)で図にします。図種は指定しなくても、AI が発明内容から選びます。
319
+
320
+ ```text
321
+ あなたは特許図面を PatentDSL(.pdg)で書くアシスタントです。次の記法で
322
+ .pdg のコードブロックだけを出力してください。
323
+
324
+ - 1 行 1 文。3 種類: 定義「10 = 名称 / name」、包含「親 : 子 子」、
325
+ 接続「A -> B : ラベル」(演算子の前後は半角スペース。連鎖 A -> B -> C は不可、1 行 1 本)。
326
+ - 1 行目に図種を宣言: #! kind: block | flow | state | seq。
327
+ - 図種は内容から選ぶ: 構成・〜を備える = block、処理の流れ = flow(末尾「?」で
328
+ 条件分岐の菱形)、状態と遷移 = state(初期・終端は *)、主体間の往復 = seq。
329
+ - ラベルは「日本語 / english」。
330
+
331
+ 発明:
332
+ (ここに発明の構成を、できるだけ具体的に書く。例: どの部が何を含み、
333
+  どの部からどの部へ何が渡されるか、外部機器との関係はどうか、など)
334
+ ```
335
+
336
+ より複雑な図や高い確実性が必要なときは、`npx @shibayama/pdgkit guide`(または同梱の [docs/ai-authoring-guide.md](docs/ai-authoring-guide.md))の全文を貼ると精度が上がります。
337
+
338
+ 得られた出力を保存して描画します。
339
+
340
+ ```bash
341
+ pbpaste > fig1.pdg # クリップボードから保存(macOS の例)
342
+ pdgkit validate fig1.pdg # 検証(エラーがあればチャットに戻して直させる)
343
+ pdgkit render fig1.pdg -o fig1.svg
344
+ ```
345
+
346
+ ### Claude Code / Codex などのコーディングエージェントと併用する
347
+
348
+ シェルを実行できるエージェントは、pdgkit を直接呼び出せます。
349
+
350
+ 1. プロジェクトに pdgkit を導入する(`npm install @shibayama/pdgkit`)。
351
+ 2. エージェントに記法ガイドを読ませる(例: 「`npx @shibayama/pdgkit guide` を実行してその記法に従い、`.pdg` を書いて、`pdgkit validate` が通るまで直してから `pdgkit render` で図にして」)。ガイドは同梱なので貼り付け不要。図種も指定不要で、内容から選ばせてよい。
352
+ 3. エージェントは `.pdg` を生成し、`pdgkit validate` で自己検証し、`pdgkit render` で図を書き出す。
353
+
354
+ さらに [MCP サーバ](#mcp-サーバとして)を登録すると、エージェントは `pdg_render`(`format: png`)で図を画像として受け取り、レイアウトを目で確認して直すループを回せます。
355
+
356
+ ### 各種 LLM API に組み込む
357
+
358
+ 明細書作成ツールに組み込む基本形は「ガイドを system に入れて `.pdg` を生成 → `validate()` で検証 → 通れば描画」です。
359
+
360
+ Node(Anthropic SDK の例。任意のチャット API で同様に書けます):
361
+
362
+ ```ts
363
+ import Anthropic from '@anthropic-ai/sdk';
364
+ import { loadAuthoringGuide, validate, renderToPng } from '@shibayama/pdgkit';
365
+
366
+ // 記法ガイドはパッケージ同梱。これを system プロンプトに入れるだけ(貼り付け不要)。
367
+ const guide = loadAuthoringGuide();
368
+
369
+ const client = new Anthropic();
370
+
371
+ async function draw(description: string): Promise<Uint8Array> {
372
+ const messages: Anthropic.MessageParam[] = [{ role: 'user', content: description }];
373
+ for (let attempt = 0; attempt < 3; attempt++) {
374
+ const res = await client.messages.create({
375
+ model: 'claude-opus-4-8',
376
+ max_tokens: 2000,
377
+ system: guide,
378
+ messages,
379
+ });
380
+ const text = res.content.map((b) => (b.type === 'text' ? b.text : '')).join('');
381
+ const pdg = extractCodeBlock(text);
382
+ const v = validate(pdg);
383
+ if (v.ok) return renderToPng(pdg, { lang: 'ja' });
384
+ // 検証エラーを返して修正させる
385
+ messages.push({ role: 'assistant', content: text });
386
+ messages.push({ role: 'user', content: `次の診断を直して .pdg を再出力してください:\n${JSON.stringify(v.diagnostics)}` });
387
+ }
388
+ throw new Error('valid な .pdg を生成できませんでした');
389
+ }
390
+
391
+ function extractCodeBlock(text: string): string {
392
+ const m = text.match(/```(?:pdg)?\n([\s\S]*?)```/);
393
+ return (m ? m[1] : text).trim();
394
+ }
395
+ ```
396
+
397
+ Python(API で `.pdg` を得て、CLI を子プロセスで描画する例):
398
+
399
+ ```python
400
+ import subprocess
401
+
402
+ def render_pdg(pdg_source: str, to: str = "svg", out: str = "fig.svg") -> None:
403
+ # まず検証
404
+ v = subprocess.run(["pdgkit", "validate", "-"], input=pdg_source,
405
+ text=True, capture_output=True)
406
+ if v.returncode != 0:
407
+ raise RuntimeError(v.stderr) # 診断を LLM に戻して再生成する
408
+ # 描画
409
+ subprocess.run(["pdgkit", "render", "-", "--to", to, "-o", out],
410
+ input=pdg_source, text=True, check=True)
411
+ ```
412
+
413
+ ガイド本文は、インストール後 `node_modules/@shibayama/pdgkit/docs/ai-authoring-guide.md` にあります。
414
+
415
+ ### MCP サーバとして
416
+
417
+ MCP(Model Context Protocol)に対応した AI クライアント(Claude Desktop / Claude Code / Codex CLI など)に pdgkit を **一度だけ登録**しておくと、以後は**どの会話でも**「〜の図を描いて」と頼むだけで、AI が pdgkit を呼び出して図を作ります。「AI に自然文で頼む」のようにセットアップ依頼を毎回貼る必要がなくなり、図の確認・修正・出力までその場で完結します。
418
+
419
+ **用意するもの**: Node.js 18 以上(`pdgkit-mcp` の実行に必要。導入は[インストール](#インストール)を参照)と、Claude Desktop / Claude Code / Codex CLI のいずれか。
420
+
421
+ #### 1. pdgkit を入れる
422
+
423
+ ```bash
424
+ npm install -g @shibayama/pdgkit
425
+ ```
426
+
427
+ これで MCP サーバの起動コマンド `pdgkit-mcp` が使えるようになります。グローバル導入したくない場合は、次の登録で `npx` を使う形にできます。
428
+
429
+ #### 2. AI クライアントに登録する
430
+
431
+ **Claude Desktop の場合**
432
+
433
+ 設定 → 開発者 →「構成を編集(Edit Config)」から、次の設定ファイルを開きます(直接編集してもOK)。
434
+
435
+ - macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
436
+ - Windows: `%APPDATA%\Claude\claude_desktop_config.json`
437
+
438
+ `mcpServers` に pdgkit を追加して保存します。
439
+
440
+ ```json
441
+ {
442
+ "mcpServers": {
443
+ "pdgkit": { "command": "pdgkit-mcp" }
444
+ }
445
+ }
446
+ ```
447
+
448
+ グローバル導入していない場合は、`npx` 経由にします(事前インストール不要)。
449
+
450
+ ```json
451
+ {
452
+ "mcpServers": {
453
+ "pdgkit": { "command": "npx", "args": ["-y", "--package", "pdgkit", "pdgkit-mcp"] }
454
+ }
455
+ }
456
+ ```
457
+
458
+ 保存したら、**Claude Desktop を完全に終了して再起動**してください(再起動しないと反映されません)。
459
+
460
+ **Claude Code の場合**
461
+
462
+ ターミナルで 1 コマンドです。
463
+
464
+ ```bash
465
+ claude mcp add pdgkit -- pdgkit-mcp
466
+ # グローバル導入していない場合:
467
+ claude mcp add pdgkit -- npx -y --package @shibayama/pdgkit pdgkit-mcp
468
+ ```
469
+
470
+ `claude mcp list` に pdgkit が表示されれば登録完了です。
471
+
472
+ **Codex CLI(OpenAI)の場合**
473
+
474
+ Codex CLI を入れていなければ入れます。MCP 対応版が必要です(`codex mcp` サブコマンドがあれば対応しています)。
475
+
476
+ ```bash
477
+ npm install -g @openai/codex # 既に入っている場合は最新へ更新
478
+ codex --version # バージョン確認
479
+ ```
480
+
481
+ 登録はターミナルで 1 コマンドです。
482
+
483
+ ```bash
484
+ codex mcp add pdgkit -- pdgkit-mcp
485
+ # グローバル導入していない場合:
486
+ codex mcp add pdgkit -- npx -y --package @shibayama/pdgkit pdgkit-mcp
487
+ ```
488
+
489
+ または設定ファイル `~/.codex/config.toml` に直接書きます。
490
+
491
+ ```toml
492
+ [mcp_servers.pdgkit]
493
+ command = "pdgkit-mcp"
494
+ # グローバル導入していない場合は command/args を次のようにする:
495
+ # command = "npx"
496
+ # args = ["-y", "--package", "pdgkit", "pdgkit-mcp"]
497
+ ```
498
+
499
+ `codex mcp list` に pdgkit が表示されれば登録完了です。
500
+
501
+ #### 3. 使う
502
+
503
+ あとは普通に日本語で頼むだけです。例:
504
+
505
+ ```text
506
+ 制御装置が CPU、メモリ、I/O インターフェースを内蔵し、I/O インターフェースが外部機器へ信号を送るブロック図を描いて
507
+ さっきの図を PNG で見せて
508
+ 編集できる PPTX にして
509
+ ```
510
+
511
+ Claude は内容に応じて次のツールを使い分けます(あなたが意識する必要はありません)。
512
+
513
+ | ツール | 内容 |
514
+ |---|---|
515
+ | `pdg_validate` | `.pdg` を検証し、推論図種・宣言図種・診断を返す |
516
+ | `pdg_render` | `.pdg` を描画。`format` で svg / png / jpeg / pdf / pptx を選択(`editable: true` で編集可能 PPTX) |
517
+ | `pdg_refs` | 符号表(Markdown / CSV) |
518
+
519
+ **出力の受け取り方**:
520
+
521
+ - SVG はテキスト、PNG / JPEG は**画像としてその場に表示**されます。
522
+ - PDF / PPTX は**ファイルに保存**され、保存先のフルパスが返されます。保存先は `pdgkit-mcp` の作業ディレクトリです。**Claude Code では、開いているワークスペース(作業ディレクトリ)にそのまま保存されます**(`figure.pptx` など)。Claude Desktop はサーバの起動場所によって作業ディレクトリが変わるため、置き場所を決めたいときだけ「〜に保存して」と保存先を伝えてください。
523
+
524
+ #### うまくいかないとき
525
+
526
+ - ツールが出てこない → Claude Desktop を**完全に再起動**。Claude Code は `claude mcp list`、Codex は `codex mcp list` で登録を確認。
527
+ - `pdgkit-mcp` が見つからない → `npm install -g @shibayama/pdgkit` を実行、または npx 形式の登録に変更。**Claude Desktop(GUI アプリ)はターミナルと PATH が異なり、グローバル導入しても見つからないことがあります**。その場合は `which pdgkit-mcp`(macOS / Linux)で表示される**フルパス**を `command` に指定してください。
528
+ - Node が無い → Node.js 18 以上をインストール。
529
+ - `npm run mcp` は pdgkit のソースを clone して pdgkit 自体を開発する人向けのショートカットで、通常の利用では使いません。
530
+
531
+ ## AI に図を描かせるワークフロー
532
+
533
+ 組み込み先では次のループを推奨します。
534
+
535
+ ```text
536
+ ホスト AI が .pdg を生成
537
+ -> validate() で検証
538
+ -> エラーがあれば診断をホスト AI に返して修正させる(繰り返す)
539
+ -> ok になったら renderToSvg / renderToPng などで描画
540
+ -> 必要なら描画結果を AI に見せて、構造を直させる
541
+ ```
542
+
543
+ 要点は次の 3 つです。
544
+
545
+ 1. 生成した `.pdg` は必ず `validate()` を通す。構文ミスは機械的に検出・修正できる。
546
+ 2. 図種は宣言ではなく構造の結果である。包含 `:` が 1 つでもあればブロック図、ラベル末尾 `?` でフローチャート、符号 `*` で状態遷移図、`<->` や往復でシーケンス図に自動的に切り替わる。意図しない図種への変化を防ぐため、ソース冒頭に図種アサーション(`#! kind: block` など)を書かせる。
547
+ 3. 図をまたぐ符号の一貫性はホスト側で管理する。1 ファイル 1 図が原則。
548
+
549
+ AI に渡す詳細な記述ガイドは [docs/ai-authoring-guide.md](docs/ai-authoring-guide.md) にあります。ホストのシステムプロンプトへそのまま注入できます。
550
+
551
+ 自然文での具体的な指示例(構成図・フローチャート・状態遷移図・シーケンス図・クレーム文からの変換・出力形式の指定)は、[使い方 の「AI に自然文で頼む」](#ai-に自然文で頼む)を参照してください。
552
+
553
+ ## 基本記法
554
+
555
+ ```pdg
556
+ # 定義: 符号にラベル(日本語 / english)を付ける
557
+ 10 = 制御装置 / control device
558
+ 11 = CPU
559
+
560
+ # 包含: 親 : 子 子 ...(これがあるとブロック図になる)
561
+ 10 : 11 12
562
+
563
+ # 接続: 符号 演算子 符号 [ : ラベル ](演算子の前後は半角スペース必須)
564
+ 11 -> 12 : 信号 / signal
565
+ ```
566
+
567
+ 接続演算子は次のとおりです。
568
+
569
+ | 演算子 | 内容 | | 演算子 | 内容 |
570
+ |---|---|---|---|---|
571
+ | `-` | 単線 | | `..` | 破線 |
572
+ | `->` | 矢印 | | `.>` | 破線矢印 |
573
+ | `<-` | 逆矢印 | | `=>` | 太矢印 |
574
+ | `<->` | 双方向 | | | |
575
+
576
+ 完全な仕様は [docs/spec.md](docs/spec.md) を参照してください。
577
+
578
+ ## ライブラリ API
579
+
580
+ すべて `import { ... } from '@shibayama/pdgkit'` で利用できます。型定義を同梱します。
581
+
582
+ | 関数 | 種別 | 内容 |
583
+ |---|---|---|
584
+ | `renderToSvg(source, opts?)` | 同期 | SVG 文字列を含む結果を返す |
585
+ | `renderToPng(source, opts?)` | 非同期 | PNG(`Uint8Array`) |
586
+ | `renderToJpeg(source, opts?)` | 非同期 | JPEG(`Uint8Array`) |
587
+ | `renderToPdf(source, opts?)` | 非同期 | A4 PDF(`Uint8Array`) |
588
+ | `renderToPptx(source, opts?)` | 非同期 | PPTX(`Uint8Array`、`editable: true` で編集可能版) |
589
+ | `validate(source)` | 同期 | 検証結果(`ok`、`kind`、`diagnostics` ほか) |
590
+ | `refsToMarkdown(parse(source))` | 同期 | 符号表 Markdown |
591
+ | `refsToCsv(parse(source))` | 同期 | 符号表 CSV |
592
+ | `toSvgString(source, lang?)` | 同期 | SVG 文字列のみ |
593
+ | `loadAuthoringGuide()` | 同期 | 同梱の AI 記法ガイドを文字列で返す(system プロンプト注入用) |
594
+
595
+ 主なオプション:
596
+
597
+ - `renderToSvg`: `lang`(`ja` / `en` / `both`、既定 `ja`)、`crop`(既定 true)、`bleed`(既定 3)、`targetSide`(既定 1600)、`xmlDeclaration`(既定 true)
598
+ - `renderToPng` / `renderToJpeg`: `lang`、`scale`(既定 8)、`bleed`(既定 3)
599
+ - `renderToPdf`: `lang`、`bleed`、`vector`(既定 true、失敗時ラスタにフォールバック)、`scale`
600
+ - `renderToPptx`: `lang`、`editable`(既定 false)、`scale`、`bleed`
601
+
602
+ 低レベル API(`parse` → `layout` → `render`)も公開しています。
603
+
604
+ ## CLI リファレンス
605
+
606
+ ```text
607
+ pdgkit render <入力> [--to svg|png|jpeg|pdf|pptx] [--lang ja|en|both] [-o ファイル] [--no-crop] [--editable]
608
+ pdgkit validate <入力>
609
+ pdgkit refs <入力> [--format md|csv] [-o ファイル]
610
+ pdgkit guide
611
+ pdgkit samples
612
+ pdgkit version
613
+ pdgkit help
614
+ ```
615
+
616
+ - `<入力>`: ファイルパス / `-`(標準入力)/ `--sample <id>`
617
+ - `pdgkit guide`: AI 向けの記法ガイド(`.pdg` の書き方)を標準出力に印字。AI に貼り付けさせる代わりに読ませる用途。
618
+ - `-o, --out`: 出力先(省略時は標準出力。バイナリ形式は `-o` 必須)
619
+ - 進捗・診断は標準エラー出力へ。成果物は標準出力へ。
620
+ - 終了コード: `0` 成功、`1` 検証エラーまたは実行時エラー、`2` 使い方の誤り
621
+
622
+ MCP サーバは `pdgkit-mcp` で起動します。
623
+
624
+ ## 出力形式
625
+
626
+ | 形式 | 内容 |
627
+ |---|---|
628
+ | SVG | 実描画範囲で切り出したベクタ画像(本家と同じ寸法計算) |
629
+ | PNG / JPEG | 高解像度ラスタ(既定 8 倍、白背景、`@resvg/resvg-js`) |
630
+ | PDF | A4・IPAex ゴシック埋め込み・ベクタ(jsPDF + svg2pdf.js)。失敗時はラスタにフォールバック |
631
+ | PPTX | 16:9 スライドに高解像度画像を配置 |
632
+ | PPTX(編集) | SVG の各要素を編集可能な PowerPoint 図形・線・文字へ変換(`--editable`) |
633
+ | 符号 MD / CSV | 符号表 |
634
+
635
+ SVG / PNG / JPEG / PPTX は実描画範囲を計算して小さな余白を付けて切り出します。表示言語の切替はすべての出力に反映されます。すべて Node のみ(ブラウザ不要)で動作します。
636
+
637
+ ## アーキテクチャ
638
+
639
+ ```text
640
+ ホスト組み込みの入口
641
+ npm import(Node / TS) / CLI(任意言語の子プロセス) / MCP(エージェント)
642
+ |
643
+ src/node ブラウザ非依存レンダラ
644
+ renderToSvg / renderToPng / renderToJpeg / renderToPdf / renderToPptx
645
+ validate / content-box / dom(SVG シム) / mcp
646
+ |
647
+ src/core 純粋・依存ゼロ(PatentDSL から移植、唯一の真実源)
648
+ parse -> layout -> render(SVG 要素) -> refs
649
+ ```
650
+
651
+ - コアは純粋で、DOM も外部依存も使わない。`render()` も `createElementNS` / `setAttribute` / `appendChild` / `textContent` の 4 操作のみを使う。
652
+ - SVG シム([src/node/dom.ts](src/node/dom.ts))がその 4 操作を実装し、XML を正しくエスケープしてシリアライズする。SVG 出力は jsdom 不要・依存ゼロ。jsdom は PDF 経路(svg2pdf が SVG DOM を要求)でのみ用いる。
653
+ - 実描画範囲の切り出しは `getBBox()` を使わず、[src/node/content-box.ts](src/node/content-box.ts) が生成済み SVG モデルを走査し、`layout` と同じ文字幅推定で解析的に算出する。
654
+ - 決定論。同じ入力からは同じ出力(バイト一致)が得られる。
655
+
656
+ ## 本家との忠実性
657
+
658
+ - [src/core](src/core) は PatentDSL のソースをそのまま移植している(唯一の変更は、コンテンツボックス計算で再利用するための `estimateTextWidth` の `export` 追加のみ)。
659
+ - 本家のテスト(構文解析・レイアウト・レイアウト回帰・ラベル配置)を移植し、すべて合格している。
660
+ - SVG の切り出し余白(3 単位)・表示寸法(長辺 1600px 以上)は本家の定数と一致する。
661
+
662
+ ## 開発
663
+
664
+ ```bash
665
+ npm install
666
+ npm run typecheck
667
+ npm test # vitest(コア移植 + Node 層、計 126 テスト)
668
+ npm run cli -- render --sample block -o /tmp/x.svg
669
+ npm run mcp # MCP サーバを起動
670
+ npm run build # tsup で dist/(ESM + CJS + 型定義)を生成
671
+ ```
672
+
673
+ ディレクトリ構成:
674
+
675
+ ```text
676
+ pdgkit/
677
+ ├── src/
678
+ │ ├── core/ 純粋コア(PatentDSL 移植)
679
+ │ ├── node/ dom / content-box / assets / svg / raster / pdf
680
+ │ │ ooxml / pptx / validate / mcp / index
681
+ │ └── index.ts パッケージのメイン入口
682
+ ├── bin/
683
+ │ ├── pdgkit.ts CLI
684
+ │ └── pdgkit-mcp.ts MCP サーバ(stdio)
685
+ ├── tests/ 移植テスト + Node 層テスト
686
+ ├── examples/ サンプル .pdg(9 種)
687
+ ├── assets/ ipaexg.ttf と IPA フォントライセンス全文
688
+ ├── docs/ spec.md / ai-authoring-guide.md
689
+ └── .github/workflows/ci.yml
690
+ ```
691
+
692
+ ## プライバシー
693
+
694
+ pdgkit はローカルで動作します。図面生成にあたりネットワーク通信は行いません。LLM API と組み合わせる場合の通信はホスト側の責任範囲です。
695
+
696
+ ## ライセンス
697
+
698
+ pdgkit 本体は MIT ライセンスです。[LICENSE](LICENSE) を参照してください。
699
+
700
+ 同梱フォント `assets/ipaexg.ttf`(IPAex ゴシック)は IPA フォントライセンス v1.0 に従います(MIT とは別のライセンスです)。全文を [assets/IPA_Font_License_Agreement_v1.0.txt](assets/IPA_Font_License_Agreement_v1.0.txt) に同梱しています。再配布の際は同ライセンス全文を必ず添付してください。
701
+
702
+ pdgkit は [PatentDSL](https://github.com/shibayamalicht/patent_dsl)(© 2026 しばやま, MIT)から DSL 文法・レイアウト・描画を継承しています。
703
+
704
+ ## クレジット
705
+
706
+ Copyright (c) 2026 しばやま(PatentDSL 作者)
707
+
708
+ - PatentDSL — pdgkit の母体。記法と特許図面に特化した自動レイアウト・描画の設計。[shibayamalicht/patent_dsl](https://github.com/shibayamalicht/patent_dsl)
709
+ - IPAex ゴシック — 情報処理推進機構(IPA)。同梱日本語フォント。