@cardenelabs/dragon 0.12.0 → 0.13.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 +74 -58
- package/dist/index.cjs +2863 -119
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +544 -2
- package/dist/index.d.ts +544 -2
- package/dist/index.js +2863 -119
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/compile.ts +457 -188
- package/src/input-size.ts +9 -1
- package/src/json-parser.ts +259 -1
- package/src/schemas/diagram.json +985 -3
- package/src/types.ts +39 -1
- package/src/v05/parser-types.ts +17 -0
- package/src/v05/parser.ts +544 -20
- package/src/v05/readout-table.generated.ts +1088 -0
package/README.md
CHANGED
|
@@ -49,20 +49,23 @@ flow:
|
|
|
49
49
|
### 最上位のブロック
|
|
50
50
|
|
|
51
51
|
<!-- notation:top-level:start -->
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
|
55
|
-
| `
|
|
56
|
-
| `
|
|
57
|
-
| `
|
|
58
|
-
| `
|
|
59
|
-
| `
|
|
60
|
-
| `
|
|
61
|
-
| `
|
|
62
|
-
| `
|
|
63
|
-
| `
|
|
64
|
-
| `
|
|
65
|
-
| `
|
|
52
|
+
|
|
53
|
+
| 欄 | 何を書くか |
|
|
54
|
+
| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
55
|
+
| `title` | 図の題 |
|
|
56
|
+
| `type` | 図種 (`sequence` / `flow` / `swimlane` / `er` / `state` / `topology` / `gantt` / `class` / `mind` / `tree` / `c4` / `solidity` / 図表各種) |
|
|
57
|
+
| `actors` | 箱 |
|
|
58
|
+
| `flow` | 矢印 |
|
|
59
|
+
| `states` | 状態の初期値 |
|
|
60
|
+
| `values` | 他の状態から決まる値 (式) |
|
|
61
|
+
| `animation` | 段 |
|
|
62
|
+
| `viewport` | 図全体の大きさと間隔 |
|
|
63
|
+
| `lanes` | 縦列の見出しと幅 |
|
|
64
|
+
| `groups` | 縦列を束ねる枠 |
|
|
65
|
+
| `eyebrow` | 図全体を 1 箱にする図種で、その箱の上に出す小見出し |
|
|
66
|
+
| `axes` | 2 軸で仕分ける図の軸の名前 |
|
|
67
|
+
| `readouts` | 値を見せる部品 (割合の輪 / 数え上げ / 目盛り) |
|
|
68
|
+
|
|
66
69
|
<!-- notation:top-level:end -->
|
|
67
70
|
|
|
68
71
|
### 箱に書ける欄
|
|
@@ -70,28 +73,33 @@ flow:
|
|
|
70
73
|
`- 名前: { 欄: 値, ... }` の形で書く。
|
|
71
74
|
|
|
72
75
|
<!-- notation:actor:start -->
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
|
76
|
-
| `
|
|
77
|
-
| `
|
|
78
|
-
| `
|
|
79
|
-
| `
|
|
80
|
-
| `
|
|
81
|
-
| `
|
|
82
|
-
| `
|
|
83
|
-
| `
|
|
84
|
-
| `
|
|
85
|
-
| `
|
|
86
|
-
| `
|
|
87
|
-
| `
|
|
88
|
-
| `
|
|
89
|
-
| `
|
|
90
|
-
| `
|
|
91
|
-
| `
|
|
92
|
-
| `
|
|
93
|
-
| `
|
|
94
|
-
| `
|
|
76
|
+
|
|
77
|
+
| 欄 | 何を書くか |
|
|
78
|
+
| ------------- | ------------------------------------------------------------------------------ |
|
|
79
|
+
| `kind` | 見た目の種別 (`card` / `storage` / `service` / `person` 等、`種類` とも書ける) |
|
|
80
|
+
| `subtitle` | 題の下の補足 (`補足` とも書ける) |
|
|
81
|
+
| `eyebrow` | 題の上の小見出し |
|
|
82
|
+
| `value` | 箱に出す値 (`値` とも書ける) |
|
|
83
|
+
| `rows` | 箱の中に並べる行 (`行` とも書ける) |
|
|
84
|
+
| `lane` | どの縦列に置くか |
|
|
85
|
+
| `stack` | 縦列の中の何段目に置くか |
|
|
86
|
+
| `initial` | 状態遷移図で始まりの状態か |
|
|
87
|
+
| `final` | 状態遷移図で終わりの状態か |
|
|
88
|
+
| `tone` | 色 |
|
|
89
|
+
| `nodes` | 見本 (parts) の中の箱を差し替える |
|
|
90
|
+
| `touchpoint` | 体験の道筋で、利用者が触れる場所 |
|
|
91
|
+
| `opportunity` | 体験の道筋で、改善の余地 |
|
|
92
|
+
| `owner` | 工程の並びで、担当 |
|
|
93
|
+
| `end` | 工程の並びで、終わりの位置 |
|
|
94
|
+
| `posX` | 置く場所の横位置 |
|
|
95
|
+
| `posY` | 置く場所の縦位置 |
|
|
96
|
+
| `posW` | 箱の幅 |
|
|
97
|
+
| `posH` | 箱の高さ |
|
|
98
|
+
| `scale` | 見本 (parts) の倍率 (`倍率` とも書ける) |
|
|
99
|
+
| `shape` | 箱の中に描く図形 (水位 / 角度 / 半径を状態で動かす、`図形` とも書ける) |
|
|
100
|
+
| `visibleIf` | その箱を出すかどうかの条件 (`出す条件` とも書ける) |
|
|
101
|
+
| `title` | 箱に出す題。 書かなければ名前がそのまま題になる (`題` とも書ける) |
|
|
102
|
+
|
|
95
103
|
<!-- notation:actor:end -->
|
|
96
104
|
|
|
97
105
|
### 矢印に書ける欄
|
|
@@ -99,14 +107,17 @@ flow:
|
|
|
99
107
|
`- A -> B: "説明" (色, 線種) { 欄: 値, ... }` の形で書く。
|
|
100
108
|
|
|
101
109
|
<!-- notation:flow:start -->
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
|
105
|
-
| `
|
|
106
|
-
| `
|
|
107
|
-
| `
|
|
108
|
-
| `
|
|
109
|
-
| `
|
|
110
|
+
|
|
111
|
+
| 欄 | 何を書くか |
|
|
112
|
+
| -------------- | ------------------------------------------------------------ |
|
|
113
|
+
| `sub` | 説明の下の補足 |
|
|
114
|
+
| `guard` | 状態遷移の条件 |
|
|
115
|
+
| `cardinality` | 関係の多重度 (`1:N` 等) |
|
|
116
|
+
| `side` | 矢印がどの辺から出るか (`top` / `right` / `bottom` / `left`) |
|
|
117
|
+
| `labelOffsetX` | 説明文の位置を横にずらす |
|
|
118
|
+
| `labelOffsetY` | 説明文の位置を縦にずらす |
|
|
119
|
+
| `overlay` | `true` で説明文を線の上に重ねる (分岐図の条件ラベル用) |
|
|
120
|
+
|
|
110
121
|
<!-- notation:flow:end -->
|
|
111
122
|
|
|
112
123
|
## 記法の癖
|
|
@@ -145,8 +156,8 @@ type: flow
|
|
|
145
156
|
actors: [A, B, C]
|
|
146
157
|
|
|
147
158
|
flow:
|
|
148
|
-
- A -> C: "x"
|
|
149
|
-
- C -> B: "y"
|
|
159
|
+
- A -> C: "x" # 出来るのは A -> B
|
|
160
|
+
- C -> B: "y" # 出来るのは B -> C
|
|
150
161
|
```
|
|
151
162
|
|
|
152
163
|
書いた端どおりに繋ぎたい時は箱に `lane:` を書く。 縦列を書いた形は別の組み立てを通り、
|
|
@@ -155,16 +166,19 @@ flow:
|
|
|
155
166
|
## API
|
|
156
167
|
|
|
157
168
|
**Text DSL (人向け YAML)**
|
|
169
|
+
|
|
158
170
|
- `textDslToDiagram(src: string): CdlDiagram` ... 一発変換 (v0.4 / v0.5 auto-detect、 recommended entry)
|
|
159
171
|
- `parseTextDslV05(src: string): V05ParseResult` ... v0.5 parser を直接呼出 (error 詳細取得)
|
|
160
172
|
- `compileToCdl(doc: DslDocument): CdlDiagram` ... AST → CdlDiagram
|
|
161
173
|
|
|
162
174
|
**JSON DSL (LLM 向け)**
|
|
175
|
+
|
|
163
176
|
- `jsonToDiagram(json: unknown): CdlDiagram` ... JSON DSL → CdlDiagram、 validation error は throw
|
|
164
177
|
- `validateDragonJson(json: unknown): { ok, data | errors }` ... compile なしで validation のみ
|
|
165
178
|
- `diagramJsonSchema` ... JSON Schema (Draft 7)、 LLM の tool schema にそのまま注入可能
|
|
166
179
|
|
|
167
180
|
**Deprecated (2026-12-31 削除予定)**
|
|
181
|
+
|
|
168
182
|
- `parseTextDsl(src: string): ParseResult` ... v0.4 parser、 `textDslToDiagram` に移行推奨
|
|
169
183
|
|
|
170
184
|
## LLM 向け JSON DSL
|
|
@@ -211,11 +225,13 @@ async function generateDiagramFromLLM(userRequest: string, maxRetry = 3) {
|
|
|
211
225
|
const res = await client.messages.create({
|
|
212
226
|
model: "claude-sonnet-5",
|
|
213
227
|
max_tokens: 4096,
|
|
214
|
-
tools: [
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
228
|
+
tools: [
|
|
229
|
+
{
|
|
230
|
+
name: "create_diagram",
|
|
231
|
+
description: "Create an animated diagram from user's request using Dragon DSL.",
|
|
232
|
+
input_schema: diagramJsonSchema,
|
|
233
|
+
},
|
|
234
|
+
],
|
|
219
235
|
tool_choice: { type: "tool", name: "create_diagram" },
|
|
220
236
|
messages,
|
|
221
237
|
});
|
|
@@ -238,7 +254,7 @@ async function generateDiagramFromLLM(userRequest: string, maxRetry = 3) {
|
|
|
238
254
|
|
|
239
255
|
// 使用例
|
|
240
256
|
const diagram = await generateDiagramFromLLM(
|
|
241
|
-
"ユーザーが API 経由で DB に検索をかけて結果を受け取るシーケンス図を作って"
|
|
257
|
+
"ユーザーが API 経由で DB に検索をかけて結果を受け取るシーケンス図を作って",
|
|
242
258
|
);
|
|
243
259
|
```
|
|
244
260
|
|
|
@@ -271,13 +287,13 @@ const diagram = jsonToDiagram(json);
|
|
|
271
287
|
|
|
272
288
|
同じ図を両方の記法で書ける。 人 → YAML、 LLM → JSON が推奨だが、 混在可能。
|
|
273
289
|
|
|
274
|
-
| YAML
|
|
275
|
-
|
|
276
|
-
| `title: "..."`
|
|
290
|
+
| YAML | JSON |
|
|
291
|
+
| ---------------------- | ------------------------------------------------------- |
|
|
292
|
+
| `title: "..."` | `{title: "..."}` |
|
|
277
293
|
| `actors: [A, B: kind]` | `{actors: [{name: "A"}, {name: "B", kind: "storage"}]}` |
|
|
278
|
-
| `- A -> B: "label"`
|
|
279
|
-
| `step: "..." 1.4s`
|
|
280
|
-
| `focus: [A, B]`
|
|
294
|
+
| `- A -> B: "label"` | `{from: "A", to: "B", label: "label"}` |
|
|
295
|
+
| `step: "..." 1.4s` | `{step: "...", duration: 1.4}` |
|
|
296
|
+
| `focus: [A, B]` | `{focus: ["A", "B"]}` |
|
|
281
297
|
|
|
282
298
|
箱に書ける項目 (`tone` / `owner` / `posX` 等) は両方の記法で同じ。 一覧は実装
|
|
283
299
|
(`INLINE_ACTOR_KEYS`) が持ち、`packages/dragon/test/json-actor-fields.test.ts` が
|