@cardenelabs/dragon 0.27.0 → 0.30.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.
Files changed (60) hide show
  1. package/README.md +119 -12
  2. package/dist/index.cjs +9619 -8023
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.d.cts +407 -175
  5. package/dist/index.d.ts +407 -175
  6. package/dist/index.js +9617 -8024
  7. package/dist/index.js.map +1 -1
  8. package/package.json +2 -2
  9. package/src/compile/actor-ids.ts +306 -0
  10. package/src/compile/actors.ts +74 -0
  11. package/src/compile/c4.ts +77 -0
  12. package/src/compile/chain.ts +54 -0
  13. package/src/compile/chart-fields.ts +178 -0
  14. package/src/compile/class.ts +100 -0
  15. package/src/compile/deep-rewrite.ts +30 -0
  16. package/src/compile/derived-source.ts +18 -0
  17. package/src/compile/direction.ts +63 -0
  18. package/src/compile/er-relation.ts +200 -0
  19. package/src/compile/er.ts +44 -0
  20. package/src/compile/flow.ts +54 -0
  21. package/src/compile/funnel.ts +75 -0
  22. package/src/compile/gantt.ts +232 -0
  23. package/src/compile/generic.ts +284 -0
  24. package/src/compile/hierarchy.ts +92 -0
  25. package/src/compile/journey.ts +84 -0
  26. package/src/compile/kinds.ts +156 -0
  27. package/src/compile/lanes.ts +56 -0
  28. package/src/compile/mind.ts +343 -0
  29. package/src/compile/node-title.ts +24 -0
  30. package/src/compile/notice.ts +94 -0
  31. package/src/compile/parts-lookup.ts +17 -0
  32. package/src/compile/parts.ts +2635 -0
  33. package/src/compile/placement-apply.ts +673 -0
  34. package/src/compile/placement.ts +15 -0
  35. package/src/compile/quadrant.ts +110 -0
  36. package/src/compile/rows.ts +40 -0
  37. package/src/compile/sequence.ts +226 -0
  38. package/src/compile/slug.ts +29 -0
  39. package/src/compile/solidity.ts +39 -0
  40. package/src/compile/state.ts +71 -0
  41. package/src/compile/subtitle.ts +22 -0
  42. package/src/compile/swimlane.ts +83 -0
  43. package/src/compile/topology.ts +50 -0
  44. package/src/compile/tree.ts +60 -0
  45. package/src/compile/value-chart.ts +183 -0
  46. package/src/compile/values.ts +432 -0
  47. package/src/compile/word-state.ts +82 -0
  48. package/src/compile.ts +596 -5672
  49. package/src/index.ts +13 -10
  50. package/src/json-line-map.ts +30 -0
  51. package/src/json-parser.ts +509 -176
  52. package/src/near-name.ts +42 -0
  53. package/src/notation-lint.ts +112 -74
  54. package/src/relative-pos.ts +71 -2
  55. package/src/schema.ts +1 -1
  56. package/src/schemas/diagram.json +130 -34
  57. package/src/types.ts +60 -41
  58. package/src/v05/input-table.generated.ts +6 -4
  59. package/src/v05/parser-types.ts +12 -1
  60. package/src/v05/parser.ts +503 -149
package/README.md CHANGED
@@ -65,12 +65,13 @@ flow:
65
65
  | `eyebrow` | 図全体を 1 箱にする図種で、その箱の上に出す小見出し |
66
66
  | `axes` | 2 軸で仕分ける図の軸の名前 |
67
67
  | `readouts` | 値を見せる部品 (割合の輪 / 数え上げ / 目盛り) |
68
- | `inputs` | 読む人が動かすつまみ (すべり / 選び / 入り切り など 14 種) |
69
- | `formulas` | つまみの値から決まる値 (式。 `values` は段が動かす状態を読み、こちらはつまみを読む) |
68
+ | `inputs` | 読む人が動かすつまみ (すべり / 選び / 入り切り など。 書ける種類は、知らない種類を書いた時の知らせが `使える種類 = ...` の形で全て並べる。 選択肢を `{ value, label }` の組で、入り切りを `onLabel` / `offLabel` で書くと、値は綴りのまま名前で描く) |
69
+ | `formulas` | つまみの値から決まる値 (式。 `values` は段が動かす状態を読み、こちらはつまみを読む。 `{ expression, label }` の組で書くと操作部に名札を出す) |
70
70
  | `events` | 押下などの出来事で動く仕掛け (相手は名前で指す) |
71
71
  | `scrolls` | 巻き上げに応じて進む値 (画面を巻き上げた量から 0 から 1 を作る) |
72
72
  | `bands` | 動いている間の帯 (順序図。 `- DB: 1..2` の形で段の番号の区間を書く) |
73
73
  | `reveal` | 矢印をいつ出すか (`phase` = 段が名指しする矢印はその段まで描かない (既定) / `all` = 最初から全部描く) |
74
+ | `relations` | 触れた箱の関係を光らせるか (`off` = 何もしない (既定) / `hover` = 触れた箱と繋がる線と相手の箱だけが光る) |
74
75
  | `direction` | 図の並ぶ向き (`縦` / `横`、英語なら `vertical` / `horizontal`)。 効くのは `flow` と `swimlane` だけ |
75
76
  | `palette` | 図の配色 (`kinari` = 生成りに茶 / `celadon` = 青磁に墨、日本語なら `生成り` / `青磁`) で、ER 図とクラス図は書かなくても `kinari` になり、書いた `palette:` が優先される |
76
77
 
@@ -84,7 +85,7 @@ flow:
84
85
 
85
86
  | 欄 | 何を書くか |
86
87
  | --------------- | ------------------------------------------------------------------------------ |
87
- | `kind` | 見た目の種別 (`card` / `storage` / `service` / `person` 等、`種類` とも書ける) |
88
+ | `kind` | 見た目の種別 (`card` / `storage` / `service` / `person` 等、`種類` とも書ける)。 種別に無い名前は部品の名前として部品の一覧 (`partsCatalog`) から引き、一覧にも無ければ種別を書かなかった箱になる。 部品を持つ一覧を渡した時は、書いた行に知らせ (`onNotice`) が出て綴りの近い名前を案内する |
88
89
  | `subtitle` | 題の下の補足 (`補足` とも書ける) |
89
90
  | `eyebrow` | 題の上の小見出し |
90
91
  | `value` | 箱に出す値 (`値` とも書ける) |
@@ -96,15 +97,17 @@ flow:
96
97
  | `initial` | 状態遷移図で始まりの状態か |
97
98
  | `final` | 状態遷移図で終わりの状態か |
98
99
  | `tone` | 色 |
99
- | `nodes` | 見本 (parts) の中の箱を差し替える |
100
+ | `color` | 色 (`tone` と同じ意味。 両方書いた時は `tone` を採る) |
100
101
  | `touchpoint` | 体験の道筋で、利用者が触れる場所 |
101
102
  | `opportunity` | 体験の道筋で、改善の余地 |
102
103
  | `owner` | 工程の並びで、担当 |
103
- | `end` | 工程の並びで、終わりの位置 |
104
+ | `end` | 工程の並びで、終わりの位置。 始まりより前の時期は始まりと同じに倒し、知らせ (`onNotice`) が出る |
104
105
  | `posX` | 置く場所の横位置 |
105
106
  | `posY` | 置く場所の縦位置 |
106
107
  | `posW` | 箱の幅 |
107
108
  | `posH` | 箱の高さ |
109
+ | `offsetX` | 自動で決まった位置から横へずらす量 (JSON の `pos.x`。 `posX` は座標で、こちらはずらし) |
110
+ | `offsetY` | 自動で決まった位置から縦へずらす量 (JSON の `pos.y`。 片方だけ書くと残りは 0) |
108
111
  | `scale` | 見本 (parts) の倍率 (`倍率` とも書ける) |
109
112
  | `shape` | 箱の中に描く図形 (水位 / 角度 / 半径を状態で動かす、`図形` とも書ける) |
110
113
  | `visibleIf` | その箱を出すかどうかの条件 (`出す条件` とも書ける) |
@@ -125,24 +128,27 @@ flow:
125
128
 
126
129
  | 欄 | 何を書くか |
127
130
  | ---------------- | ------------------------------------------------------------------- |
128
- | `sub` | 説明の下の補足 |
131
+ | `sub` | 説明の下の補足 (クラス図では行き先の端の多重度) |
132
+ | `tailSub` | クラス図の出どころ側の多重度 (`1` 等)。 出どころの端の近くに出る |
129
133
  | `guard` | 状態遷移の条件 |
130
- | `cardinality` | 関係の多重度 (`1:N` 等) |
134
+ | `cardinality` | ER 図の関係の多重度 (`1:1` / `1:N` / `N:1` / `N:M` / `0..1` / `1..*`)。 両端の形が語から決まり (`tailHead` / `head` を書けばそちらが勝つ)、語は説明の下の行に出る。 6 語以外の語と、ER 図以外に書いた多重度は端の形にならず、知らせ (`onNotice`) が出る |
131
135
  | `widthBind` | 線の太さを値に追随させる (状態やつまみの名前を `{名前}` の形で書く) |
132
136
  | `strokeBind` | 線の色を値に追随させる (`widthBind` と同じ読み方) |
133
137
  | `dashOffsetBind` | 破線の位置を値に追随させる (流れているように見せる) |
134
138
  | `side` | 矢印がどの辺から出るか (`top` / `right` / `bottom` / `left`) |
135
- | `head` | 矢印の先の形 (`triangle` 継ぐ / `diamond` 持つ / `open` 使う / `crow` 多 / `one` `zero-one` `many` `zero-many` ER の端 / `none` 描かない) |
139
+ | `head` | 矢印の先の形 (`triangle` 継承・実装 / `diamond` 集約・コンポジション / `open` 関連・依存 / `crow` 多 / `one` `zero-one` `many` `zero-many` ER の端 / `none` 描かない) |
136
140
  | `tailHead` | 出どころ側の端の形 (ER は端ごとに違う個数を示すので両端に要る) |
137
141
  | `headFill` | 端の印の塗り (`solid` 塗る / `hollow` 白抜き) |
138
142
  | `tailHeadFill` | 出どころ側の印の塗り |
139
- | `relation` | クラス図の関係の種類 (`extends` 継ぐ / `implements` 満たす / `aggregates` 持つ / `composes` 抱える / `associates` 結ぶ / `uses` 使う)。 書くと線と端の形と塗りと付く側がまとめて決まる |
143
+ | `relation` | クラス図の関係の種類 (`extends` 継承 / `implements` 実装 / `aggregates` 集約 / `composes` コンポジション / `associates` 関連 / `uses` 依存)。 書くと線と端の形と塗りと付く側がまとめて決まる |
140
144
  | `kind` | 順序図の言づての種類 (`call` 呼ぶ / `return` 返す / `fire` 投げる) |
141
145
  | `role` | 辺の役目 (`main` 主となる道)。 書いた辺だけ「いま」 の色で引く。 主となる 1 本 (または 1 続き) にだけ書く |
142
146
  | `labelPlate` | 説明文の下地を敷くか (`false` で外す)。 丸い下地は箱と同じ形なので、罫の細い図では名前が小さな箱に見える |
143
147
  | `labelOffsetX` | 説明文の位置を横にずらす |
144
148
  | `labelOffsetY` | 説明文の位置を縦にずらす |
145
149
  | `overlay` | `true` で説明文を線の上に重ねる (分岐図の条件ラベル用) |
150
+ | `fromPartNode` | 出どころが部品 (kind に部品の名前を書いた箱) の時、矢印を繋ぐ部品の中の要素の id。 要素を 1 つだけ持つ部品は書かなくてもその要素に繋がり、2 つ以上持つ部品は書かないと矢印を外して知らせる |
151
+ | `toPartNode` | 行き先が部品の時、矢印を繋ぐ部品の中の要素の id (`fromPartNode` と同じ読み方) |
146
152
 
147
153
  <!-- notation:flow:end -->
148
154
 
@@ -171,6 +177,22 @@ actors:
171
177
  `lanes:` の id は組み立て側が作る形に合わせて、字 / 数 / 下線 / hyphen を受ける
172
178
  (`lane-idle` のような自動で作られた縦列の幅も書き直せる)。
173
179
 
180
+ `groups:` は並べた縦列のうち何本かを 1 つの枠で囲む。 枠は縦列の位置が決まった後に、束ねた縦列と
181
+ 中の箱を全て含む位置と大きさで描かれ、縦列と箱の位置は組を書かない図と変わらない。
182
+
183
+ ```yaml
184
+ lanes:
185
+ web: { label: "受付の層" }
186
+ app: { label: "処理の層" }
187
+ db: { label: "保存の層" }
188
+
189
+ groups:
190
+ inside: { label: "社内の網", lanes: [app, db] }
191
+ ```
192
+
193
+ 図に無い縦列は除いて囲み、1 本も無ければ枠を描かない。 束ねる縦列の間に束ねない縦列を挟むと、
194
+ その縦列ごと囲む。 どちらも知らせが出る。
195
+
174
196
  ### 静止した `type: flow` は書いた矢印の端を使わない
175
197
 
176
198
  この図種は **登場人物を書いた順に鎖状に繋ぐ**。 矢印の説明文は「その箱を to に持つ行」
@@ -186,8 +208,92 @@ flow:
186
208
  - C -> B: "y" # 出来るのは B -> C
187
209
  ```
188
210
 
189
- 書いた端どおりに繋ぎたい時は箱に `lane:` を書く。 縦列を書いた形は別の組み立てを通り、
190
- 書いた端がそのまま矢印になる。 端が使われなかった行には知らせが出る。
211
+ 書いた端どおりに繋ぎたい時は `direction: 縦` を書くか、箱に `lane:` を書く。 向きか縦列を書いた形は
212
+ 別の組み立てを通り、書いた端がそのまま矢印になる。 `direction: 縦` は並びも鎖の時と変わらない。
213
+ 段 (`animation`) を書いた形も同じく書いた端を使う。 端が使われなかった行には知らせが出る。
214
+
215
+ 部品 (`kind` に部品の名前を書いた箱) は、どの行の端にも書かれていなければ鎖に入らない。
216
+ 部品は図の下に並び、`受付 / 部品 / 出荷` と書いても `受付 -> 出荷` が繋がる。
217
+
218
+ 図の下に並ぶ部品と位置を書いた部品は、部品のすぐ上に登場人物の名前の名札を 1 つ出す
219
+ (`flow` / `sequence` / `topology` / `c4`)。 部品の中に縦列を 2 本以上持つ部品でも名札は 1 つで、
220
+ 部品が自分の縦列に書いた名札はそのまま残る。 部品をいくつ並べても、縦列が右へ送られて図が横に伸びることはない。
221
+
222
+ 部品の中の要素は、部品の頁と同じ間で並ぶ。 頁で空けた箱の間と段の間が図に置いても詰まらないので、
223
+ 部品の中の要素どうしが間隔の検査に掛からない。 頁の配置が使えない部品だけは、部品に書いた縦列の位置と
224
+ 段の番号で置く。
225
+
226
+ ### 段の `focus:` で部品の全体か中の 1 つを光らせる
227
+
228
+ 段の `focus:` に部品の名前を書くと、部品の要素と部品の中の線が全て光る。
229
+ 中の 1 つだけを光らせる時は `{部品の名前}__{要素の id}` か `{部品の名前}__{中の線の id}` を書く。
230
+ 要素の id は矢印の `fromPartNode` / `toPartNode` に書く id と同じ。
231
+
232
+ ```yaml
233
+ title: "注文を 2 つの窓口へ分ける"
234
+ type: swimlane
235
+
236
+ actors:
237
+ - 受注: { kind: card }
238
+ - split: { kind: split-router, phase: false }
239
+
240
+ flow:
241
+ - 受注 -> split: "注文" { toPartNode: inP }
242
+
243
+ animation:
244
+ - step: "注文が入る" 1.2s
245
+ focus: [split__inP]
246
+ - step: "A へ渡す" 1.2s
247
+ focus: [split__outA, split__sr-a]
248
+ - step: "まとめて見せる" 1.2s
249
+ focus: [split]
250
+ ```
251
+
252
+ | 段 | 光る所 |
253
+ |---|---|
254
+ | 注文が入る | 振り分け器の入口 (`inP`) だけ |
255
+ | A へ渡す | 出口 A (`outA`) と、入口から出口 A への中の線 (`sr-a`) |
256
+ | まとめて見せる | 振り分け器の要素と中の線の全て |
257
+
258
+ 部品に無い名前を書くと何も光らず、知らせ (`focus-target-missing`) が部品の要素と中の線の名前を案内する。
259
+ 部品の名前そのものが `__` を含む時は、一番長く一致する部品の名前で読む。
260
+
261
+ ### 順序図の段は `focus:` で強調する言づてを選ぶ
262
+
263
+ `sequence` / `solidity` の図は 1 枚の板に言づてを行で並べる。 段ごとに 1 通を強調し、それより前は
264
+ 描き済みとして残し、後ろは隠す。 どの言づてを強調するかは段の `focus:` から決まる。
265
+
266
+ | `focus:` に書いたもの | 合う言づて |
267
+ |---|---|
268
+ | 矢印 `A -> B` | 元が A で先が B |
269
+ | 箱の名前 2 つ以上 | 元と先の両方が書いた箱に含まれる |
270
+ | 箱の名前 1 つ | 元か先がその箱 |
271
+
272
+ 矢印を 1 本でも書いた段は、矢印だけで言づてを選ぶ。 同じ段の箱の名前は数えない。
273
+
274
+ 言づては先頭から段の数に切り分け、各段が続きの言づてを受け持つ。 切り分けは次の順に良いものを選ぶ。
275
+
276
+ 1. 合う言づてを持つ段が多い (どの段も板を進める)
277
+ 2. 段に合う言づての数が多い
278
+ 3. 2 つの段に合う言づてを、図全体で合う言づてが少ない段 (狭く指した段) に置く
279
+
280
+ 段はその区間で合う最後の言づてを強調する。 合う言づてが無い段は前の段の強調を保つ。
281
+
282
+ ```yaml
283
+ flow:
284
+ - 利用者 -> 認証窓口: "POST 認証情報"
285
+ - 認証窓口 -> DB: "照合"
286
+ - 認証窓口 -> 利用者: "JWT を発行"
287
+
288
+ animation:
289
+ - step: "照合" 1.5s
290
+ focus: [利用者, 認証窓口, DB] # 1-2 通目を束ね、「照合」 を強調する
291
+ - step: "発行" 1.0s
292
+ focus: [認証窓口, 利用者] # 3 通目を強調する
293
+ ```
294
+
295
+ 段の題と強調する言づてを確実に揃えたい時は、矢印で書く。 同じ 2 者の矢印が続く時は、同じ矢印を段の数だけ
296
+ 並べれば 1 通ずつ進む。
191
297
 
192
298
  ## API
193
299
 
@@ -199,7 +305,8 @@ flow:
199
305
 
200
306
  **JSON DSL (LLM 向け)**
201
307
 
202
- - `jsonToDiagram(json: unknown): CdlDiagram` ... JSON DSL → CdlDiagram、 validation error は throw
308
+ - `jsonToDiagram(json: unknown, opts?): CdlDiagram` ... JSON DSL → CdlDiagram、 validation error は throw。 `opts` は部品の一覧 (`partsCatalog`)、 書いた通りにならなかったことの受け取り口 (`onNotice`)、 書いた場所から行を引く表 (`行の表`) の 3 つ
309
+ - `書いた場所の鍵(...道): string` ... `行の表` の鍵を作る (`書いた場所の鍵("actors", 1)` が `/actors/1`)。 本文の行が分かる入口 (編集画面の YAML 欄) が表を作る時に使い、`jsonToDiagram` が同じ関数で引く
203
310
  - `validateDragonJson(json: unknown): { ok, data | errors }` ... compile なしで validation のみ
204
311
  - `diagramJsonSchema` ... JSON Schema (Draft 7)、 LLM の tool schema にそのまま注入可能
205
312