@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/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { NodeKind, Tone, CdlDiagram, EdgeStyle, EdgeHead, EdgeHeadFill, ClassRelationType, SequenceMessageKind, EdgeReveal, LaidDiagram } from '@cardenelabs/cdl';
1
+ import { NodeKind, Tone, CdlDiagram, EdgeStyle, EdgeHead, EdgeHeadFill, ClassRelationType, SequenceMessageKind, EdgeReveal, RelationFocus, LaidDiagram } from '@cardenelabs/cdl';
2
2
  export { CdlDiagram } from '@cardenelabs/cdl';
3
3
 
4
4
  /**
@@ -58,7 +58,7 @@ type V05ParseResult = {
58
58
  * 書くと、項目を足した時に案内か一覧のどちらかが取り残される (実際に `states` / `values` が
59
59
  * 一覧に 1 件も無い状態で放置されていた)。
60
60
  */
61
- declare const TOP_LEVEL_KEYS: readonly ["title", "type", "actors", "flow", "states", "values", "animation", "viewport", "lanes", "groups", "eyebrow", "axes", "readouts", "inputs", "formulas", "events", "scrolls", "bands", "reveal", "direction", "palette"];
61
+ declare const TOP_LEVEL_KEYS: readonly ["title", "type", "actors", "flow", "states", "values", "animation", "viewport", "lanes", "groups", "eyebrow", "axes", "readouts", "inputs", "formulas", "events", "scrolls", "bands", "reveal", "relations", "direction", "palette"];
62
62
  /** 受け付ける図種。 記法一覧はここを見る。 */
63
63
  declare const PRESET_TYPES: ReadonlySet<PresetType>;
64
64
  /**
@@ -75,14 +75,12 @@ declare const DSL_ONLY_KINDS: readonly ["entity", "state", "contract", "eoa", "m
75
75
  /** 記法だけが持つ種類。 描画側の `NodeKind` には含まれない */
76
76
  type DslOnlyKind = (typeof DSL_ONLY_KINDS)[number];
77
77
  /**
78
- * 受け付ける箱の種類。 描画できる種類 (cdl の `NODE_KINDS`) に、 記法だけが持つ種類を足す。
78
+ * 記法が受理する種類の全体。 これに載っていない種類は見本 (パーツ) の候補になる。
79
79
  *
80
- * 以前は手書きの 31 種だった。 描画できる 90 種のうち 78 種が記法から書けず、 部品名として
81
- * 扱われて「そんな部品は無い」 と警告が出るだけだった。 描画側を出所に加えることで
80
+ * 描画できる種類 (cdl の `NODE_KINDS`) に、 記法だけが持つ種類と基盤の別名を足す。
81
+ * 手書きの一覧だった頃は、 描画側に種類が増えても記法から書けず、 部品名として扱われて
82
+ * 「そんな部品は無い」 と警告が出るだけだった。 描画側を出所に加えることで
82
83
  * 「描画できるものは書ける」 が成立する。
83
- */
84
- /**
85
- * 記法が受理する種類の全体。 これに載っていない種類は見本 (パーツ) の候補になる。
86
84
  *
87
85
  * 画面側が「本文が見本を使っているか」 を判定するのに使う (#1022)。 手書きの一覧を
88
86
  * 別に持つと、種類が増えた時にそちらだけ取り残されて余分な読み込みが起きる。
@@ -121,10 +119,19 @@ declare const PHASE_ITEM_WORDS: readonly ["focus", "badge", "body", "description
121
119
  * | `tree` | `tree` | 根から下へ枝が伸びる |
122
120
  * | `gantt` | `gantt` | 各帯の始端から右へ帯が伸びる |
123
121
  * | `funnel` | `funnel` | 上端から順に段が積まれる |
122
+ * | `slope` | `slope` | 左の軸から右の軸へ線が伸びる |
123
+ * | `gauge` | `gauge` | 9 時から上を通って 3 時へ弧が伸びる |
124
+ * | `radial` | `radial` | 各輪が 12 時から時計回りに開く |
125
+ * | `stacked` | `stacked` | 左端から右へ帯が伸びる |
126
+ * | `waffle` | `waffle` | 左上から読む向きに印が 1 個ずつ埋まる |
124
127
  *
125
128
  * `quadrant` は入れない。 4 つの区画に項目を置く図で **項目に順序が無く**、起点を決められない
126
129
  * (順番を書いた順で決めると、動きが図の意味を持たない)。
127
130
  *
131
+ * `stat` も入れない。 値 1 つを大きく示す図で、描画側が起点から描く動きを持たない
132
+ * (`cdl` の `DRAW_KINDS`)。 `waffle` は 1 個 = 1% の印を読む向きに埋める動きを
133
+ * 持つようになったので入れた (cdl#719)。
134
+ *
128
135
  * いまは語と図種が同じ綴りだが、**同じものとして扱わない**。 語は書き手が書く名前で、
129
136
  * 図種は `type:` が取る値。 片方だけ別名を足したくなった時に、対応が表に残っている形にする。
130
137
  */
@@ -146,6 +153,12 @@ declare const DRAW_WORDS: ReadonlySet<string>;
146
153
  */
147
154
  declare const DIRECTIONS: readonly ["縦", "横"];
148
155
  type DslDirection = (typeof DIRECTIONS)[number];
156
+ /**
157
+ * 向きの別名。 色 (`色` / `color` / `tone`) と同じく日本語と英語の両方で書ける。
158
+ *
159
+ * 正規の語を鍵にも入れておく = 引く側が別名かどうかを気にせず 1 度で解決できる。
160
+ */
161
+ declare const DIRECTION_ALIAS: Record<string, DslDirection>;
149
162
  /**
150
163
  * 図の配色 (`palette:`、 #1553)。
151
164
  *
@@ -176,8 +189,19 @@ declare const TONE_ALIAS: Record<string, Tone>;
176
189
  * 2 つあるため、 解決の規則は本 file に 1 つだけ置いて両方から呼ぶ。 片方だけ直すと画面が
177
190
  * 直らない事故を、 規則を共有することで構造的に防ぐ。
178
191
  */
179
- /** 基準からどちら側に置くか。 */
180
- type RelativeDirection = "right" | "left" | "above" | "below";
192
+ /**
193
+ * 基準からどちら側に置くか。
194
+ *
195
+ * 語の一覧は下の `RELATIVE_DIRECTIONS` が持つ。 型を並べ直さず、一覧から導く。
196
+ */
197
+ type RelativeDirection = (typeof RELATIVE_DIRECTIONS)[number];
198
+ /**
199
+ * 向きとして受ける語の一覧。
200
+ *
201
+ * 読み取りの入口が 2 つある (本文の `位置: Web の右 200` と JSON の `posRel.dir`) ため、
202
+ * 一覧を 1 箇所に置いて両方から引く。 2 度書くと、向きを足した時に片方だけが取り残される。
203
+ */
204
+ declare const RELATIVE_DIRECTIONS: readonly ["right", "left", "above", "below"];
181
205
  /** 相対で書かれた位置の指定。 */
182
206
  type RelativePos = {
183
207
  /** 基準にする相手の名前。 `actors:` に書かれた名前をそのまま持つ。 */
@@ -306,13 +330,13 @@ type Position = {
306
330
  column?: number;
307
331
  };
308
332
  /**
309
- * canvas pivot (CAR-1693 Phase 1) の DSL 表面 `pos: {x, y}` を保持する型。
310
- * auto layout の compute value からの offset (dx, dy) を表す。 element の `layoutPos:` が
311
- * undefined なら auto layout の値をそのまま採用 (catalog 100+ backward compat)、 set 済なら
312
- * Phase 2 の applyPosOffset pass が offset として適用する。
333
+ * 自動で決まった位置からのずらし (dx, dy) (#1971)。
334
+ *
335
+ * JSON は `pos: { x, y }`、記法は `offsetX` / `offsetY` で書く。 内部では、行番号を持つ
336
+ * `pos: Position` と名前が重ならないよう `layoutPos` に入れる。
313
337
  *
314
- * naming = DSL 表面 syntax は user 提案 wording (`pos:`) を維持、 内部 AST は既存 `pos: Position`
315
- * (source line/column) との collision 回避のため `layoutPos:` に rename する 2 層設計。
338
+ * 書かなければ自動の配置のまま。 書くと組み立ての出口 (`applyLayoutOffsets`) が 1 度配置してから
339
+ * 配置後の位置に足して置き直す。 箱と縦列は位置が動き、矢印は名前のずらしに足す。
316
340
  */
317
341
  type LayoutPos = {
318
342
  x: number;
@@ -381,6 +405,16 @@ type DslDocument = {
381
405
  * 段に関わらず最初から全部描く。 描き手の `CdlDiagram.edgeReveal` にそのまま渡る。
382
406
  */
383
407
  reveal?: EdgeReveal;
408
+ /**
409
+ * 箱に触れると関係する線だけを光らせるか (`relations:`、 #1757)。
410
+ *
411
+ * 既定 (`off`) は何もしない。 `hover` と書くと、箱に触れた時に その箱 ・ 繋がる線 ・
412
+ * 相手の箱だけが光り、他が沈む。 描き手の `CdlDiagram.relationFocus` にそのまま渡る。
413
+ *
414
+ * クラス図と ER 図は **順番を持たない** 図で、段を追う見せ方は「どの順で読ませるか」 しか
415
+ * 運ばない。 触れた箱の関係を光らせれば、読み手の問いにその場で答えられる。
416
+ */
417
+ relations?: RelationFocus;
384
418
  /**
385
419
  * 図の並ぶ向き (`direction:`、 #1494)。
386
420
  *
@@ -590,6 +624,14 @@ type DslActor = {
590
624
  * 解析の時点ではパーツの定義を知らないため、 名前を決めずに持っておく。
591
625
  */
592
626
  colorHex?: string;
627
+ /**
628
+ * 部品に `color:` で書いた色の名前 (`成功` 等) (#1973)。
629
+ *
630
+ * 部品の色の状態は色番号しか受けず、色の名前は箱の色 (`tone`) にしか効かない。 部品には
631
+ * 箱の色を渡さないため、書いても絵が変わらない。 黙って捨てると手掛かりが残らないので、
632
+ * 書いた名前を残して組み立て側が知らせる。
633
+ */
634
+ partColorName?: Tone;
593
635
  /**
594
636
  * parts state override (partId set 時のみ有効)。 kind + 既存 reserved fields を除いた
595
637
  * inline option の残り (`v: 50` / `count: 100` 等) を state 名 → initial 値 map として保持。
@@ -629,33 +671,13 @@ type DslActor = {
629
671
  */
630
672
  posRel?: RelativePos;
631
673
  /**
632
- * canvas pivot UX 修正 (B1 individual node isolation)。 actor 1 件が生成する複数 sub-node
633
- * (sequence の header / spacer / footer / s{N} 等) の中で「特定 sub-node だけを固定 / resize」
634
- * するための nested override map。 key = sub-node id 相当の short key (`header` / `footer` /
635
- * `spacer` / `s0` 等)、 value = posX/Y/W/H の 4 field。 compile 側は対応 CDL node に単独反映、
636
- * 同 actor の他 sub-node は影響を受けない (lane 全体 posX とは独立経路)。
637
- */
638
- nodes?: Record<string, DslActorNodeOverride>;
639
- /**
640
- * canvas pivot (CAR-1693 Phase 1) DSL 表面 `pos: {x, y}` 由来の layout offset。 未指定は auto
641
- * layout の compute value そのまま (backward compat)、 set 済なら Phase 2 の applyPosOffset で
642
- * (auto x + layoutPos.x, auto y + layoutPos.y) に shift される。 既存 posX/posY (絶対座標) は
643
- * 別 mechanism で、 layoutPos は auto layout からの nudge (dx, dy)。
674
+ * 箱の位置のずらし (#1971)。 配置後の箱の中心を (x, y) だけ動かす。 `posX` / `posY` (座標) とは
675
+ * 別の欄で、座標も書いた時は座標で置いた位置からずらす。 見本 (parts) は見本 1 つ分をまとめて動かす。
676
+ * 同じ縦列の箱に近づくと、描画側が間隔を保つようそちらを押し下げる。
644
677
  */
645
678
  layoutPos?: LayoutPos;
646
679
  pos: Position;
647
680
  };
648
- /**
649
- * canvas pivot UX 修正 (B1) = actor 内 sub-node 単位で「絶対座標 / サイズ」 を固定するための
650
- * override 値。 全 field optional、 posX / posY が両方 set 済なら CDL 側で該当 sub-node の
651
- * auto layout を skip、 明示座標をそのまま採用する。 posW / posH は width / height の上書き。
652
- */
653
- type DslActorNodeOverride = {
654
- posX?: number;
655
- posY?: number;
656
- posW?: number;
657
- posH?: number;
658
- };
659
681
  /** 流れ (1 行 = 1 step) (v0.5+ ... inline option 拡張) */
660
682
  type DslStep = {
661
683
  no: number;
@@ -682,8 +704,8 @@ type DslStep = {
682
704
  /**
683
705
  * 矢印の先の形 (#1462)。 書かなければ従来どおり塗った三角。
684
706
  *
685
- * 4 図の設計は **端の形で関係の種類を示す** = 三角 (継ぐ) / 菱 (持つ) /
686
- * 開いた矢 (使う) / 鳥の足 (多)。 書けないと 4 種とも同じ三角になり、
707
+ * 4 図の設計は **端の形で関係の種類を示す** = 三角 (継承・実装) / 菱 (集約・コンポジション) /
708
+ * 開いた矢 (関連・依存) / 鳥の足 (多)。 書けないと 4 種とも同じ三角になり、
687
709
  * 線の種類 (実線 / 点線) だけで 6 種の関係を区別することになる。
688
710
  *
689
711
  * 受ける語は描画側の `EDGE_HEADS` から導く = 描画側が増やせば書けるようになる。
@@ -691,10 +713,16 @@ type DslStep = {
691
713
  head?: EdgeHead;
692
714
  /** 出どころ側の端の形 (#1466)。 ER は端ごとに違う個数を示すので両端に要る */
693
715
  tailHead?: EdgeHead;
694
- /** 端の印の塗り (#1466)。 白抜きの菱が「持つ」、塗った菱が「抱える」 */
716
+ /** 端の印の塗り (#1466)。 白抜きの菱が集約、塗った菱がコンポジション */
695
717
  headFill?: EdgeHeadFill;
696
718
  /** 出どころ側の印の塗り (#1466) */
697
719
  tailHeadFill?: EdgeHeadFill;
720
+ /**
721
+ * クラス図の出どころ側の多重度 (#1771)。 `sub` (行き先の端の多重度) と対。
722
+ *
723
+ * クラス図でだけ効く (関係の語 `relation` と同じ)。 engine が出どころの端の近くに添える。
724
+ */
725
+ tailSub?: string;
698
726
  /**
699
727
  * クラス図の関係の種類 (#1466)。 書くと線と端の形と塗りと付く側がまとめて決まる。
700
728
  *
@@ -717,10 +745,19 @@ type DslStep = {
717
745
  /** true で説明文を矢印の線の上に重ねる。 分岐図の条件ラベル用。 */
718
746
  overlay?: boolean;
719
747
  /**
720
- * canvas pivot (CAR-1693 Phase 1) DSL 表面 `pos: {x, y}` 由来の layout offset。 step の edge
721
- * label 位置を auto layout compute から (dx, dy) shift する。 未指定は auto、 set 済は Phase 2 で適用。
748
+ * 矢印の位置のずらし (#1971)。 矢印の通り道は両端の箱で決まるので、名前のずらし
749
+ * (`labelOffsetX` / `labelOffsetY`) に足して名前だけを動かす。
722
750
  */
723
751
  layoutPos?: LayoutPos;
752
+ /**
753
+ * 部品 (parts) の端で、矢印を繋ぐ部品の中の要素の id (#1979)。 出どころ側が `fromPartNode`、
754
+ * 行き先側が `toPartNode`。
755
+ *
756
+ * 要素を 1 つだけ持つ部品は書かなくてもその要素に繋ぐ。 要素を 2 つ以上持つ部品は外枠を持たず
757
+ * 同格の要素が並ぶため、1 つを自動で選ぶと「その要素だけ」 を指す矢印に見える。 書き手が名指しする。
758
+ */
759
+ fromPartNode?: string;
760
+ toPartNode?: string;
724
761
  pos: Position;
725
762
  };
726
763
  /** lane 宣言 (v0.5+ top-level lanes section) */
@@ -732,13 +769,20 @@ type DslLane = {
732
769
  contain?: boolean;
733
770
  lifeline?: boolean;
734
771
  /**
735
- * canvas pivot (CAR-1693 Phase 1) DSL 表面 `pos: {x, y}` 由来の layout offset。 lane の x 座標を
736
- * auto layout compute から (dx, dy) shift する。 未指定は auto、 set 済は Phase 2 で適用。
772
+ * 縦列の位置のずらし (#1971)。 配置後の縦列の左上を (x, y) だけ動かし、中の箱も一緒に動く。
773
+ * 1 本でもずらすと全ての縦列を配置後の位置と大きさで固定し、動いた箱を元の位置に留めるので、
774
+ * 他の縦列とその箱は動かない。
737
775
  */
738
776
  layoutPos?: LayoutPos;
739
777
  pos: Position;
740
778
  };
741
- /** group 宣言 (v0.5+ top-level groups section、 topology preset 専用) */
779
+ /**
780
+ * 組の宣言 (v0.5+ top-level groups section)。
781
+ *
782
+ * `lanes` に並べた縦列とその中の箱を、 縦列の位置が決まった後に 1 つの枠 (`group-{id}`) で囲む (#1972)。
783
+ * 図に無い縦列は除いて囲み、 1 本も無ければ枠を描かない。 間に束ねない縦列を挟むと、 その縦列ごと囲む。
784
+ * どちらも知らせで伝える。
785
+ */
742
786
  type DslGroup = {
743
787
  id: string;
744
788
  label?: string;
@@ -825,13 +869,13 @@ type DslValue = {
825
869
  /** 動く長さ (ms) */
826
870
  durationMs: number;
827
871
  });
828
- /** ステップ (phase) */
829
872
  /** 動いている間の帯 (#1466)。 順序図で、面がいつ動いているかを段の番号で持つ */
830
873
  type DslBand = {
831
874
  actor: string;
832
875
  from: number;
833
876
  to: number;
834
877
  };
878
+ /** ステップ (phase) */
835
879
  type DslPhase = {
836
880
  name: string;
837
881
  durationMs: number;
@@ -914,44 +958,16 @@ type ParseResult = {
914
958
  declare function parseTextDsl(src: string): ParseResult;
915
959
 
916
960
  /**
917
- * AST (DslDocument) → 既存 preset API 経由 → LaidDiagram
961
+ * 組み立てが出す知らせの形 (#2030 で `compile.ts` から移した)。
918
962
  *
919
- * v0.3 ... アニメーション ブロック full compile 対応 (sequence preset のみ、 他 preset は v0.4 で順次)
920
- * - state / tween / set / highlight / badge / body を実 phase に注入
921
- * - アニメーション ありなら builder 直接経路 ... preset の標準 phase を置換
922
- * - アニメーション なしは v0.2 と同じく preset 経由
963
+ * 図種ごとの file が受け取り口の型として使い、`compile.ts` が再輸出して外へ出す。
923
964
  *
924
- * v0.2 ... 6 preset 全対応 (sequence / flow / swimlane / er / state / topology)
965
+ * **葉に置く** = 型そのものは消えるが、TypeScript の取り込みの輪は残る。 輪があると
966
+ * 読む順で解決が変わるため、型でも輪を作らない。
925
967
  */
926
-
927
- interface CompileToCdlOpts {
928
- /**
929
- * CAR-1657 = parts identifier lookup catalog、 caller (CdlEditor / test) が inject。
930
- * DslActor.partId が set された actor を検出したら partsCatalog[partId] から CdlDiagram を
931
- * lookup + mergePartIntoDiagram で target に統合。 未渡し時は parts kind actor を skip + warn。
932
- */
933
- partsCatalog?: Record<string, CdlDiagram>;
934
- /**
935
- * 組み立ての途中で分かった「書いたのに効かなかったこと」 の受け取り口。
936
- *
937
- * 図は出せるので誤りにはしないが、 黙って捨てると書いた人が理由を追えない。 editor は
938
- * これを受けて画面に出す。 判定は組み立て側だけが持ち、 画面側は表示に徹する。
939
- */
940
- onNotice?: (notice: CompileNotice) => void;
941
- /**
942
- * edge が DSL のどの行から来たかの受け取り口 (#998)。
943
- *
944
- * preset によっては書いた step と生成される edge が一致しない (`type: flow` は actor を鎖状に
945
- * 繋ぐため `a -> c` と書いても `a -> b` になる)。 edge を起点に本文の行を直す機能は、 この
946
- * 対応が無いと別の行を書き換える。
947
- *
948
- * **対応が取れない edge については呼ばれない**。 「対応が無い」 と「行 0」 を区別するため。
949
- */
950
- onEdgeSource?: (edgeId: string, line: number) => void;
951
- }
952
968
  /** 図は出せるが書いた通りにならなかった、 という知らせ。 */
953
969
  type CompileNotice = {
954
- kind: "relative-position-ignored" | "focus-target-missing" | "state-override-rejected" | "external-paint-dropped" | "part-not-drawn" | "direction-not-honored" | "scale-reserved" | "chart-value-unreadable" | "chart-edge-dropped" | "value-shadows-state" | "value-unresolved" | "value-duplicate" | "flow-actor-missing" | "value-trigger-unresolved" | "lane-not-honored" | "lane-declared-empty" | "eyebrow-not-honored" | "flow-endpoint-not-honored" | "draw-not-honored" | "draw-target-mismatch" | "formula-unresolved" | "event-target-missing" | "actor-kind-not-honored" | "sub-node-not-found" | "message-option-not-honored";
970
+ kind: "relative-position-ignored" | "focus-target-missing" | "state-override-rejected" | "external-paint-dropped" | "part-not-drawn" | "direction-not-honored" | "scale-reserved" | "part-color-ignored" | "part-state-missing" | "part-edge-dropped" | "part-not-found" | "part-node-ignored" | "part-lane-ignored" | "chart-value-unreadable" | "chart-edge-dropped" | "value-shadows-state" | "value-unresolved" | "value-duplicate" | "flow-actor-missing" | "value-trigger-unresolved" | "lane-not-honored" | "lane-declared-empty" | "eyebrow-not-honored" | "flow-endpoint-not-honored" | "draw-not-honored" | "draw-target-mismatch" | "formula-unresolved" | "event-target-missing" | "actor-kind-not-honored" | "message-option-not-honored" | "position-offset-ignored" | "group-lane-missing" | "group-lanes-apart" | "cardinality-not-honored" | "edge-option-not-honored" | "gantt-end-before-start";
955
971
  /** 対象の名前。 光らせる相手なら書かれた指定そのまま */
956
972
  actor: string;
957
973
  /** 書かれていた行 */
@@ -959,25 +975,7 @@ type CompileNotice = {
959
975
  message: string;
960
976
  hint?: string;
961
977
  };
962
- declare function compileToCdl(doc: DslDocument, opts?: CompileToCdlOpts): CdlDiagram;
963
- /**
964
- * 登場人物ごとの、 図の上での中心と大きさを測る。
965
- *
966
- * 対応付けは箱に表示される名前で行う。 id を使わない理由は `applyNodeTones` と同じで、
967
- * slug の作り方が dragon と cdl で違うため記号を含む名前で一致しない。
968
- *
969
- * 1 人が複数の箱に分かれる図種 (順序図の上端 / 下端) では、 全部を囲む矩形を返す。
970
- * 箱として現れない登場人物は縦列の矩形で代用する。
971
- */
972
- declare function measureActorBoxes(diagram: CdlDiagram,
973
- /**
974
- * 配置まで済ませた図。 渡すとここでは測り直さない (#1006)。
975
- *
976
- * 呼出側が既に組み立てているなら、 ここで `layout` を呼ぶと同じ図の配置を 2 度計算する。
977
- * 図の規模に比例して重く、 辺 500 本で約 300ms (実測)。
978
- * 渡す時は `diagram` と対にする = 別の図の配置を渡すと、 測る位置がずれる。
979
- */
980
- laidHint?: LaidDiagram): Map<string, AnchorBox>;
978
+
981
979
  /**
982
980
  * この図を取り込んでよいか (#1015)。
983
981
  *
@@ -1123,18 +1121,21 @@ declare function partVisualSize(part: CdlDiagram, targetW?: number, targetH?: nu
1123
1121
  h: number;
1124
1122
  };
1125
1123
  /**
1126
- * 既存の図が縦に何段ぶんを占めるかの目安 (#1481)。
1124
+ * 組み立てた図の下端 (#2002)。 箱が 1 つも無ければ `undefined`。
1127
1125
  *
1128
- * **箱の数では数えない**。 数で数えると、図を丸ごと 1 つの箱で描く種別が 1 段に潰れる。
1129
- * 順序図は `#1466` で 1 枚の板になり、高さ 432 の箱 1 つになった = 1 段 (280) と見積もられ、
1130
- * その下に置いたパーツが板に 31px 重なっていた (実測)。
1126
+ * **段数で概算しない**。 かつては箱の数から `箱 1 つ = 1 段 (280)` で見積もっていたが、
1127
+ * `flow` の箱は実際には高さ 68 で 168 おきに並ぶため 1 段あたり 112 ずつ余分に見積もる。
1128
+ * 誤差は箱の数に比例して積み上がり、実測で箱 2 つの図に 496、箱 4 つの図に 720 の空きが
1129
+ * 入っていた (部品どうしの間は 120)。
1131
1130
  *
1132
- * 大きさを自分で持つ箱は、その高さから段数を出す。 持たない箱は今までどおり 1 段と数えるので、
1133
- * 高さを書かない図の並び方は変わらない。
1131
+ * **箱の下端ではなく図枠の下端を返す**。 格子は図枠どうしを `PARTS_GAP` 空けて並べるので、
1132
+ * 既存の図との間も図枠で測らないと、部品どうしの間と既存の図との間が揃わない
1133
+ * (箱で測ると 180、図枠で測ると 240 で、後者が部品どうしの段の間と一致する)。
1134
+ *
1135
+ * **箱が無いことを 0 に潰さない**。 0 を下端として使うと、部品だけを並べた図で部品が
1136
+ * 図の上端へ貼り付く。 呼出側が「箱が無い」 と「下端が 0」 を分けられるように `undefined` を返す。
1134
1137
  */
1135
- declare function partsBaseRows(nodes: ReadonlyArray<{
1136
- h?: number;
1137
- }>): number;
1138
+ declare function partsBaseBottom(laid: LaidDiagram): number | undefined;
1138
1139
  /**
1139
1140
  * 位置を書かなかったパーツを格子に並べた時の、 矩形の中心。
1140
1141
  *
@@ -1145,9 +1146,10 @@ declare function partsBaseRows(nodes: ReadonlyArray<{
1145
1146
  * 隣と重なる (実測 = 400 の次に 200 を置くと 280 重なった)。 段の高さも段内の最大高で揃える。
1146
1147
  * 縦は自分の高さの半分だけ段の上端から下げて、 段内で上端を揃える。
1147
1148
  *
1148
- * @param baseRows 既存の図が占める段数の目安 (`partsBaseRows`)。 図の下から並べ始めるために使う
1149
+ * @param baseBottom 既存の図の下端 (`partsBaseBottom`)。 その下に間を空けて並べ始める。
1150
+ * 箱が 1 つも無い図では `undefined` を渡す
1149
1151
  */
1150
- declare function partsGridCenters(baseRows: number, items: ReadonlyArray<{
1152
+ declare function partsGridCenters(baseBottom: number | undefined, items: ReadonlyArray<{
1151
1153
  id: string;
1152
1154
  w: number;
1153
1155
  h: number;
@@ -1155,26 +1157,97 @@ declare function partsGridCenters(baseRows: number, items: ReadonlyArray<{
1155
1157
  cx: number;
1156
1158
  cy: number;
1157
1159
  }>;
1160
+ /**
1161
+ * 本文に書いた状態の上書きと色番号を、部品の図そのものに当てて返す (#1973)。
1162
+ *
1163
+ * 編集画面の本文欄は、部品を図から抜いて別に重ねて描く。 重ねる側が部品の図をそのまま
1164
+ * 描くと、`state: { lvl: 0.4 }` や `color: "#d9534f"` がカタログの絵にだけ効き、
1165
+ * 編集画面では既定の値で描かれる。 値の決め方は組み立て側と同じ 2 つの関数を通す。
1166
+ *
1167
+ * `phase: false` は組み立て側と同じく部品の段を外す。 段の数は残し、中身 (点灯と値の変化)
1168
+ * だけを空にする = 段を消すと、重ねた部品だけ段の進みが止まらない形になる。
1169
+ *
1170
+ * 色として読めない上書きは組み立て側と同じく捨てる。 知らせは組み立て側が出すため、
1171
+ * ここでは出さない (同じ本文で 2 度出さない)。
1172
+ */
1173
+ declare function 部品に上書きを当てる(part: CdlDiagram, actor: Pick<DslActor, "stateOverride" | "colorHex">): CdlDiagram;
1158
1174
 
1159
1175
  /**
1160
- * Notation lint (author 向け修正システム)。
1176
+ * 登場人物ごとの、 図の上での中心と大きさを測る。
1177
+ *
1178
+ * 対応付けは箱に表示される名前で行う。 id を使わない理由は `applyNodeTones` と同じで、
1179
+ * slug の作り方が dragon と cdl で違うため記号を含む名前で一致しない。
1180
+ *
1181
+ * 1 人が複数の箱に分かれる図種 (順序図の上端 / 下端) では、 全部を囲む矩形を返す。
1182
+ * 箱として現れない登場人物は縦列の矩形で代用する。
1183
+ */
1184
+ declare function measureActorBoxes(diagram: CdlDiagram,
1185
+ /**
1186
+ * 配置まで済ませた図。 渡すとここでは測り直さない (#1006)。
1161
1187
  *
1162
- * cdl / dragon 記法で書かれた CdlDiagram を rule-based に検査し、
1163
- * 「もっと良い書き方」 を suggestion として返す純粋関数。 LLM 不要、 rule のみ。
1188
+ * 呼出側が既に組み立てているなら、 ここで `layout` を呼ぶと同じ図の配置を 2 度計算する。
1189
+ * 図の規模に比例して重く、 辺 500 本で約 300ms (実測)。
1190
+ * 渡す時は `diagram` と対にする = 別の図の配置を渡すと、 測る位置がずれる。
1191
+ */
1192
+ laidHint?: LaidDiagram): Map<string, AnchorBox>;
1193
+
1194
+ /**
1195
+ * AST (DslDocument) → 既存 preset API 経由 → LaidDiagram
1164
1196
  *
1165
- * 検知システム (`check:cdl` / `check:dragon` / `check:kind`) は開発陣向けで
1166
- * 「実装バグ」 を検出するが、 本 notation-lint は **author 向け** で
1167
- * 「書き方の癖 / 冗長表現 / 未定義参照 / 空 payload」 等を検出する。
1197
+ * v0.3 ... アニメーション ブロック full compile 対応 (sequence preset のみ、 他 preset は v0.4 で順次)
1198
+ * - state / tween / set / highlight / badge / body を実 phase に注入
1199
+ * - アニメーション ありなら builder 直接経路 ... preset の標準 phase を置換
1200
+ * - アニメーション なしは v0.2 と同じく preset 経由
1201
+ *
1202
+ * v0.2 ... 6 preset 全対応 (sequence / flow / swimlane / er / state / topology)
1203
+ */
1204
+
1205
+ interface CompileToCdlOpts {
1206
+ /**
1207
+ * CAR-1657 = parts identifier lookup catalog、 caller (CdlEditor / test) が inject。
1208
+ * DslActor.partId が set された actor を検出したら partsCatalog[partId] から CdlDiagram を
1209
+ * lookup + mergePartIntoDiagram で target に統合。 未渡し時は parts kind actor を skip + warn。
1210
+ */
1211
+ partsCatalog?: Record<string, CdlDiagram>;
1212
+ /**
1213
+ * 組み立ての途中で分かった「書いたのに効かなかったこと」 の受け取り口。
1214
+ *
1215
+ * 図は出せるので誤りにはしないが、 黙って捨てると書いた人が理由を追えない。 editor は
1216
+ * これを受けて画面に出す。 判定は組み立て側だけが持ち、 画面側は表示に徹する。
1217
+ */
1218
+ onNotice?: (notice: CompileNotice) => void;
1219
+ /**
1220
+ * edge が DSL のどの行から来たかの受け取り口 (#998)。
1221
+ *
1222
+ * preset によっては書いた step と生成される edge が一致しない (`type: flow` は actor を鎖状に
1223
+ * 繋ぐため `a -> c` と書いても `a -> b` になる)。 edge を起点に本文の行を直す機能は、 この
1224
+ * 対応が無いと別の行を書き換える。
1225
+ *
1226
+ * **対応が取れない edge については呼ばれない**。 「対応が無い」 と「行 0」 を区別するため。
1227
+ */
1228
+ onEdgeSource?: (edgeId: string, line: number) => void;
1229
+ }
1230
+ declare function compileToCdl(doc: DslDocument, opts?: CompileToCdlOpts): CdlDiagram;
1231
+
1232
+ /**
1233
+ * 記法の検査 (図を書く人向けの修正システム)。
1234
+ *
1235
+ * cdl / dragon の記法で書いた図 (`CdlDiagram`) を決まった規則で検査し、直し方を修正案
1236
+ * (`suggestion`) として返す純粋関数。 言語モデルは使わない。
1237
+ *
1238
+ * 検知システム (`check:cdl` / `check:dragon` / `check:kind`) は開発者向けで実装の不具合を
1239
+ * 見つける。 こちらは図を書く人向けで、読む人へ伝わらない書き方 (図の説明に入り込んだ実装の
1240
+ * 書き方、無い部品を指す参照、値や項目が空の図表など) を見つける。
1168
1241
  *
1169
1242
  * 使い方:
1170
- * import { lintDiagram } from "@cardenelabs/dragon";
1243
+ * import { lintDiagram, autoFix } from "@cardenelabs/dragon";
1171
1244
  * const report = lintDiagram(diagram);
1172
- * // report.issues[] = LintIssue[]
1173
- * // report.fixed = LintIssue[] のうち自動修正で解消される件
1174
- * // report.autoFix(diagram) = 修正済 CdlDiagram
1245
+ * // report.issues = LintIssue[]
1246
+ * // report.autoFixableCount = 自動修正で実際に解消できる指摘の数
1247
+ * const patched = autoFix(diagram); // 自動修正を当てた新しい図 (元の図は変えない)
1175
1248
  *
1176
- * CLI:
1177
- * pnpm dragon-lint apps/playground-spa/src/topics/catalog/presets.cdl.ts
1249
+ * 道具:
1250
+ * node packages/dragon/scripts/dragon-lint.mjs apps/playground-spa/src/topics/catalog/presets.cdl.ts
1178
1251
  */
1179
1252
 
1180
1253
  type LintSeverity = "warn" | "info";
@@ -1184,9 +1257,12 @@ type LintIssue = {
1184
1257
  severity: LintSeverity;
1185
1258
  /** 該当対象 (node id / edge id / diagram id) */
1186
1259
  target: string;
1187
- /** 人間向けメッセージ */
1260
+ /**
1261
+ * 書き手向けの指摘の文。 書き手が打ち込む識別子と書き手の値は `` ` `` で囲み、 残りは日本語で書く
1262
+ * (画面側の `lint-message-words.test.ts` が全規則の文を判定に通す)
1263
+ */
1188
1264
  message: string;
1189
- /** 修正案 (自動修正可能なら適用後の値、 手動修正必要なら null) */
1265
+ /** 修正案。 自動修正できる指摘は自動修正が書く値そのもの、 できない指摘は直し方の文 */
1190
1266
  suggestion?: string;
1191
1267
  /** autoFix() が本 issue を自動解消できるか */
1192
1268
  autoFixable: boolean;
@@ -1480,6 +1556,33 @@ declare function describeOversize(size: InputSize): string | null;
1480
1556
  */
1481
1557
  declare function describeOversizeSource(src: string): string | null;
1482
1558
 
1559
+ /**
1560
+ * JSON / YAML の本文で「どこに書いたか」 を指す鍵と、そこから行番号を引く表 (#2117)。
1561
+ *
1562
+ * JSON を読む経路は行番号を持たないため、組み立ての知らせは全て 0 行になり、画面は
1563
+ * 「どの行の話か」 を出せなかった。 本文の行が分かる入口 (編集画面の YAML 欄) は、本文を
1564
+ * 読む時に場所ごとの行を集めてこの表で渡す。 表を渡さない呼出 (LLM が作った JSON を直に
1565
+ * 渡す経路) は今までどおり 0 行になる。
1566
+ *
1567
+ * 鍵の形は RFC 6901 (JSON Pointer) と同じにする (`/actors/1` / `/values/sales`)。
1568
+ * 名前をそのまま `.` で繋ぐ形にすると、`values` に `a.b` という名前を書いた場所と、
1569
+ * `values.a` の中の `b` という欄が同じ鍵になる。 `/` と `~` を書き換える規則があるため、
1570
+ * この形では重ならない。
1571
+ *
1572
+ * 表を作る側 (`apps/playground-spa/src/lib/yaml-lines.ts`) と引く側 (`json-parser.ts`) は
1573
+ * 同じ関数を呼ぶ。 別々に持つと、片方だけ直した時に **全ての行が引けなくなる** =
1574
+ * 引けない状態は知らせが 0 行に戻るだけで、図も誤りも変わらないため気付けない。
1575
+ */
1576
+ /** 本文の場所 (JSON Pointer) から、元の本文の行番号 (1 始まり) を引く表。 */
1577
+ type 書いた行の表 = ReadonlyMap<string, number>;
1578
+ /**
1579
+ * 場所を指す鍵を作る。 引数は上から順に、欄の名前と並びの番号。
1580
+ *
1581
+ * 文書そのものは引数なしで空文字になる。 1 つずつ足す時は、親の鍵に
1582
+ * `書いた場所の鍵(次の区切り)` を繋げる (同じ結果になる)。
1583
+ */
1584
+ declare function 書いた場所の鍵(...道: readonly (string | number)[]): string;
1585
+
1483
1586
  /**
1484
1587
  * LLM 向け JSON DSL parser。
1485
1588
  *
@@ -1488,7 +1591,7 @@ declare function describeOversizeSource(src: string): string | null;
1488
1591
  * で確実に生成できるよう、 flat な object array を優先した shape になっている。
1489
1592
  *
1490
1593
  * 使い方 (LLM):
1491
- * 1. `packages/dragon/schemas/diagram.json` の JSON Schema を LLM の tool schema に注入
1594
+ * 1. `packages/dragon/src/schemas/diagram.json` の JSON Schema を LLM の tool schema に注入
1492
1595
  * 2. LLM が JSON を返す
1493
1596
  * 3. `jsonToDiagram(json)` で CdlDiagram に変換
1494
1597
  * 4. validation error は throw、 retry loop で LLM に修正させる
@@ -1545,8 +1648,14 @@ interface DragonJson {
1545
1648
  * つまみの値から決まる値 (optional、 #1391)。 記法の最上位 `formulas:` と同じ。
1546
1649
  *
1547
1650
  * 形は `{ 名前: "式" }`。 `values:` と経路が別で、式は名前を中括弧で囲わない。
1651
+ *
1652
+ * 名札を付ける時は `{ 名前: { expression: "式", label: "名札" } }` の組で書く (#1916)。
1653
+ * 描画側は名札を操作部の式の名前に描く (cdl#853)。
1548
1654
  */
1549
- formulas?: Record<string, string>;
1655
+ formulas?: Record<string, string | {
1656
+ expression: string;
1657
+ label?: string;
1658
+ }>;
1550
1659
  /**
1551
1660
  * 押下などの出来事で動く仕掛け (optional、 #1393)。 記法の最上位 `events:` と同じ。
1552
1661
  *
@@ -1604,8 +1713,8 @@ interface DragonJson {
1604
1713
  contain?: boolean;
1605
1714
  lifeline?: boolean;
1606
1715
  /**
1607
- * canvas pivot (CAR-1693 Phase 1) DSL 表面 `pos: {x, y}` = auto layout offset。 未指定は
1608
- * backward compat、 set 済は Phase 2 の applyPosOffset で lane 位置を shift する。
1716
+ * 縦列の位置のずらし (#1971)。 配置後の縦列の左上を (x, y) だけ動かす。 記法の `offsetX` / `offsetY`
1717
+ * と同じで、読み方は `DslLane.layoutPos` が持つ。
1609
1718
  */
1610
1719
  pos?: LayoutPos;
1611
1720
  }>;
@@ -1622,6 +1731,8 @@ interface DragonJson {
1622
1731
  }[];
1623
1732
  /** 矢印をいつ出すか (#1470)。 記法の最上位 `reveal:` と同じ */
1624
1733
  reveal?: EdgeReveal;
1734
+ /** 箱に触れると関係する線だけを光らせるか (#1757)。 記法の最上位 `relations:` と同じ */
1735
+ relations?: RelationFocus;
1625
1736
  /** 図の並ぶ向き (#1494)。 記法の最上位 `direction:` と同じ。 JSON は英語の語で書く */
1626
1737
  direction?: "vertical" | "horizontal";
1627
1738
  /**
@@ -1635,6 +1746,23 @@ interface DragonJson {
1635
1746
  */
1636
1747
  palette?: DslPalette;
1637
1748
  }
1749
+ /**
1750
+ * 位置を他の要素からの相対で書く指定の、JSON 側の形 (#2039)。
1751
+ *
1752
+ * 記法の `位置: Web の右 200` を 3 つの欄に開いたもの。 内側の値は `RelativePos` と同じで、
1753
+ * 向きの語も同じ 4 つ (`right` / `left` / `above` / `below`) を使う。
1754
+ *
1755
+ * **向きの語を並べ直さない**。 `RelativeDirection` をそのまま使うことで、本文側に向きを
1756
+ * 足した時に JSON 側が黙って取り残される形を作らない。
1757
+ */
1758
+ interface JsonRelativePos {
1759
+ /** 基準にする相手の名前。 `actors:` に書かれた名前をそのまま書く */
1760
+ anchor: string;
1761
+ /** 基準からどちら側に置くか */
1762
+ dir: RelativeDirection;
1763
+ /** 相手との間隔。 書かなければ `RELATIVE_GAP_DEFAULT` */
1764
+ gap?: number;
1765
+ }
1638
1766
  interface JsonActor {
1639
1767
  name: string;
1640
1768
  /**
@@ -1663,8 +1791,9 @@ interface JsonActor {
1663
1791
  renderOffsetX?: number | string;
1664
1792
  renderOffsetY?: number | string;
1665
1793
  /**
1666
- * CAR-1657 unified syntax = 既存 NodeKind (28 個) に加えて parts identifier (arc-gauge 等) を
1667
- * accept する。 未知 kind 値は parts 候補として partId に格納、 compile 側 partsCatalog で解決。
1794
+ * CAR-1657 unified syntax = 既存 NodeKind (一覧は `v05/parser.ts` の `NODE_KIND_VALID`) に
1795
+ * 加えて parts identifier (arc-gauge 等) を accept する。
1796
+ * 未知 kind 値は parts 候補として partId に格納、 compile 側 partsCatalog で解決。
1668
1797
  * LLM structured output の typing 制約を緩めるため union に string 追加。
1669
1798
  * `string & {}` = NodeKind の候補を IDE 補完で提示しつつ任意 string も許容する idiom。
1670
1799
  * 素の `NodeKind | string` は no-redundant-type-constituents に抵触し補完も潰れる (#865)。
@@ -1686,10 +1815,21 @@ interface JsonActor {
1686
1815
  initial?: boolean;
1687
1816
  final?: boolean;
1688
1817
  /**
1689
- * canvas pivot (CAR-1693 Phase 1) DSL 表面 `pos: {x, y}` = auto layout offset。 未指定は
1690
- * backward compat、 set 済は Phase 2 の applyPosOffset で actor 由来 lane / node の位置を shift。
1818
+ * 箱の位置のずらし (#1971)。 配置後の箱の中心を (x, y) だけ動かす。 記法の `offsetX` / `offsetY`
1819
+ * と同じで、読み方は `DslActor.layoutPos` が持つ。
1691
1820
  */
1692
1821
  pos?: LayoutPos;
1822
+ /**
1823
+ * 位置を他の要素からの相対で書く指定 (#2039)。 記法の `位置: Web の右 200` と同じ。
1824
+ *
1825
+ * 記法は 1 本の文字列に「誰の」「どちら側に」「どれだけ離して」 を詰めるが、JSON では
1826
+ * 3 つの欄に分ける。 文字列を組み立てて渡す形にすると、書く側が記法の並び順と区切りを
1827
+ * 覚える必要が出る = JSON を書くのは主に LLM で、読み取りの規則は欄の名前で示す方が短い。
1828
+ *
1829
+ * 組み立ての段階で基準の実座標から `posX` / `posY` に直すため、解決した後は座標を直接
1830
+ * 書いた時と同じ経路を通る。 `pos` (配置後のずらし幅) とは別の欄。
1831
+ */
1832
+ posRel?: JsonRelativePos;
1693
1833
  /**
1694
1834
  * CAR-1657 parts state override (kind = parts identifier 時のみ有効)。
1695
1835
  * LLM JSON DSL では nested 明示 = `{ "state": { "v": 50 } }` が natural、 human 側の
@@ -1742,12 +1882,6 @@ interface JsonActor {
1742
1882
  posY?: number;
1743
1883
  posW?: number;
1744
1884
  posH?: number;
1745
- /**
1746
- * 箱の中の要素ごとに位置と大きさを固定する (#1294)。 記法の `nodes:` と同じ。
1747
- *
1748
- * key は箱が作る要素の名前 (`header` / `footer` / `spacer` / `s0` 等)。
1749
- */
1750
- nodes?: Record<string, JsonActorNodeOverride>;
1751
1885
  /**
1752
1886
  * 見本を何倍で描くか (#1294)。 記法の `scale:` / `倍率:` と同じ。
1753
1887
  *
@@ -1755,6 +1889,17 @@ interface JsonActor {
1755
1889
  * 読めない項目名として知らせる)。
1756
1890
  */
1757
1891
  scale?: number;
1892
+ /**
1893
+ * 見本が持つ段を使うか (#2125)。 記法の `{ kind: wave-gauge, phase: false }` と同じ。
1894
+ *
1895
+ * 既定 (書かない) は見本の段を書いた段と番号ごとに並べて再生する。 `false` を書くと
1896
+ * 見本の段の中身 (点灯と値の変化) を空にし、値は書いた段だけが動かす。
1897
+ *
1898
+ * 見本 (parts) にしか効かない。 中身は状態の上書き (`state`) に `phase` として入る =
1899
+ * `"state": { "phase": false }` と同じ所へ届く。 記法が中括弧の中に 1 つの名前として
1900
+ * 書ける以上、JSON でも同じ名前で書けるようにする (入口で書き方が分かれない)。
1901
+ */
1902
+ phase?: boolean;
1758
1903
  /** 行頭の印 (#1466)。 行と対で読む。 語の意味は図の種類が決める */
1759
1904
  marks?: string[];
1760
1905
  }
@@ -1769,13 +1914,6 @@ interface JsonAxes {
1769
1914
  top?: string;
1770
1915
  };
1771
1916
  }
1772
- /** 箱の中の要素 1 つ分の位置と大きさ (#1294)。 記法の `nodes: { header: { ... } }` と同じ */
1773
- interface JsonActorNodeOverride {
1774
- posX?: number;
1775
- posY?: number;
1776
- posW?: number;
1777
- posH?: number;
1778
- }
1779
1917
  interface JsonStep {
1780
1918
  from: string;
1781
1919
  to: string;
@@ -1786,7 +1924,7 @@ interface JsonStep {
1786
1924
  /**
1787
1925
  * 矢印の先の形 (#1462)。 記法の `{ head: triangle }` と同じ。
1788
1926
  *
1789
- * 三角 (継ぐ) / 菱 (持つ) / 開いた矢 (使う) / 鳥の足 (多)。
1927
+ * 三角 (継承・実装) / 菱 (集約・コンポジション) / 開いた矢 (関連・依存) / 鳥の足 (多)。
1790
1928
  * 書かなければ従来どおり塗った三角になる。
1791
1929
  */
1792
1930
  head?: EdgeHead;
@@ -1794,6 +1932,8 @@ interface JsonStep {
1794
1932
  tailHead?: EdgeHead;
1795
1933
  headFill?: EdgeHeadFill;
1796
1934
  tailHeadFill?: EdgeHeadFill;
1935
+ /** クラス図の出どころ側の多重度 (#1771)。 記法の `{ tailSub: "1" }` と同じ */
1936
+ tailSub?: string;
1797
1937
  /**
1798
1938
  * 辺の役目 (cdl#618)。 記法の `{ role: main }` と同じ。
1799
1939
  *
@@ -1827,10 +1967,15 @@ interface JsonStep {
1827
1967
  /** true で説明文を矢印の線の上に重ねる。 分岐図の条件ラベル用。 */
1828
1968
  overlay?: boolean;
1829
1969
  /**
1830
- * canvas pivot (CAR-1693 Phase 1) DSL 表面 `pos: {x, y}` = edge label offset。 未指定は
1831
- * backward compat、 set 済は Phase 2 の applyPosOffset で edge label 位置を shift する。
1970
+ * 矢印の位置のずらし (#1971)。 名前のずらし (`labelOffsetX` / `labelOffsetY`) に足して名前を動かす。
1832
1971
  */
1833
1972
  pos?: LayoutPos;
1973
+ /**
1974
+ * 部品の端で矢印を繋ぐ部品の中の要素の id (#1979)。 記法の `{ fromPartNode: rC }` / `{ toPartNode: gC }` と同じ。
1975
+ * 要素を 1 つだけ持つ部品は書かなくてもその要素に繋ぐ
1976
+ */
1977
+ fromPartNode?: string;
1978
+ toPartNode?: string;
1834
1979
  }
1835
1980
  interface JsonPhase {
1836
1981
  /** phase name (必須) */
@@ -1902,6 +2047,13 @@ interface JsonDslError {
1902
2047
  declare function jsonToDiagram(json: unknown, opts?: {
1903
2048
  partsCatalog?: Record<string, CdlDiagram>;
1904
2049
  onNotice?: CompileToCdlOpts["onNotice"];
2050
+ /**
2051
+ * 本文の場所から書いた行を引く表 (#2117)。 渡すと知らせが書いた行を指す。
2052
+ *
2053
+ * JSON そのものは書いた場所を持たないため、本文の行が分かる入口 (編集画面の YAML 欄) が
2054
+ * 集めて渡す。 渡さない呼出は今までどおり全ての知らせが 0 行になる。
2055
+ */
2056
+ 行の表?: 書いた行の表;
1905
2057
  }): CdlDiagram;
1906
2058
  /**
1907
2059
  * JSON DSL を validate だけ実施 (compile しない)。 error 詳細を配列で取得したい場合に使う。
@@ -1930,7 +2082,7 @@ declare function validateDragonJson(json: unknown): {
1930
2082
  * });
1931
2083
  * const diagram = jsonToDiagram(res.content[0].input);
1932
2084
  *
1933
- * schema JSON は `packages/dragon/schemas/diagram.json` が SSOT、 本 file は import して再 export するだけ。
2085
+ * schema JSON は `packages/dragon/src/schemas/diagram.json` が SSOT、 本 file は import して再 export するだけ。
1934
2086
  */
1935
2087
  /**
1936
2088
  * Dragon DSL JSON Schema (Draft 7)。 Anthropic / OpenAI の tool schema にそのまま注入可能。
@@ -2116,29 +2268,11 @@ declare const diagramJsonSchema: {
2116
2268
  type: string;
2117
2269
  description: string;
2118
2270
  };
2119
- nodes: {
2271
+ scale: {
2120
2272
  type: string;
2121
2273
  description: string;
2122
- additionalProperties: {
2123
- type: string;
2124
- additionalProperties: boolean;
2125
- properties: {
2126
- posX: {
2127
- type: string;
2128
- };
2129
- posY: {
2130
- type: string;
2131
- };
2132
- posW: {
2133
- type: string;
2134
- };
2135
- posH: {
2136
- type: string;
2137
- };
2138
- };
2139
- };
2140
2274
  };
2141
- scale: {
2275
+ phase: {
2142
2276
  type: string;
2143
2277
  description: string;
2144
2278
  };
@@ -2156,6 +2290,28 @@ declare const diagramJsonSchema: {
2156
2290
  };
2157
2291
  };
2158
2292
  };
2293
+ posRel: {
2294
+ type: string;
2295
+ additionalProperties: boolean;
2296
+ description: string;
2297
+ required: string[];
2298
+ properties: {
2299
+ anchor: {
2300
+ type: string;
2301
+ minLength: number;
2302
+ description: string;
2303
+ };
2304
+ dir: {
2305
+ type: string;
2306
+ enum: string[];
2307
+ description: string;
2308
+ };
2309
+ gap: {
2310
+ type: string;
2311
+ description: string;
2312
+ };
2313
+ };
2314
+ };
2159
2315
  visibleIf: {
2160
2316
  type: string;
2161
2317
  description: string;
@@ -2305,6 +2461,10 @@ declare const diagramJsonSchema: {
2305
2461
  type: string;
2306
2462
  description: string;
2307
2463
  };
2464
+ tailSub: {
2465
+ type: string;
2466
+ description: string;
2467
+ };
2308
2468
  tone: {
2309
2469
  type: string;
2310
2470
  enum: string[];
@@ -2379,6 +2539,18 @@ declare const diagramJsonSchema: {
2379
2539
  type: string;
2380
2540
  description: string;
2381
2541
  };
2542
+ fromPartNode: {
2543
+ type: string;
2544
+ minLength: number;
2545
+ pattern: string;
2546
+ description: string;
2547
+ };
2548
+ toPartNode: {
2549
+ type: string;
2550
+ minLength: number;
2551
+ pattern: string;
2552
+ description: string;
2553
+ };
2382
2554
  pos: {
2383
2555
  type: string;
2384
2556
  additionalProperties: boolean;
@@ -3067,10 +3239,40 @@ declare const diagramJsonSchema: {
3067
3239
  min: {
3068
3240
  type: string;
3069
3241
  };
3242
+ offLabel: {
3243
+ type: string;
3244
+ minLength: number;
3245
+ description: string;
3246
+ };
3247
+ onLabel: {
3248
+ type: string;
3249
+ minLength: number;
3250
+ description: string;
3251
+ };
3070
3252
  options: {
3071
3253
  type: string;
3254
+ description: string;
3072
3255
  items: {
3073
- type: string;
3256
+ oneOf: ({
3257
+ type: string;
3258
+ additionalProperties?: undefined;
3259
+ required?: undefined;
3260
+ properties?: undefined;
3261
+ } | {
3262
+ type: string;
3263
+ additionalProperties: boolean;
3264
+ required: string[];
3265
+ properties: {
3266
+ value: {
3267
+ type: string;
3268
+ minLength: number;
3269
+ };
3270
+ label: {
3271
+ type: string;
3272
+ minLength: number;
3273
+ };
3274
+ };
3275
+ })[];
3074
3276
  };
3075
3277
  };
3076
3278
  placeholder: {
@@ -3123,9 +3325,34 @@ declare const diagramJsonSchema: {
3123
3325
  type: string;
3124
3326
  description: string;
3125
3327
  additionalProperties: {
3126
- type: string;
3127
- minLength: number;
3128
- pattern: string;
3328
+ oneOf: ({
3329
+ type: string;
3330
+ minLength: number;
3331
+ pattern: string;
3332
+ additionalProperties?: undefined;
3333
+ required?: undefined;
3334
+ properties?: undefined;
3335
+ } | {
3336
+ type: string;
3337
+ additionalProperties: boolean;
3338
+ required: string[];
3339
+ properties: {
3340
+ expression: {
3341
+ type: string;
3342
+ minLength: number;
3343
+ pattern: string;
3344
+ description: string;
3345
+ };
3346
+ label: {
3347
+ type: string;
3348
+ minLength: number;
3349
+ pattern: string;
3350
+ description: string;
3351
+ };
3352
+ };
3353
+ minLength?: undefined;
3354
+ pattern?: undefined;
3355
+ })[];
3129
3356
  };
3130
3357
  propertyNames: {
3131
3358
  pattern: string;
@@ -3146,6 +3373,11 @@ declare const diagramJsonSchema: {
3146
3373
  enum: string[];
3147
3374
  description: string;
3148
3375
  };
3376
+ relations: {
3377
+ type: string;
3378
+ enum: string[];
3379
+ description: string;
3380
+ };
3149
3381
  bands: {
3150
3382
  type: string;
3151
3383
  description: string;
@@ -3295,4 +3527,4 @@ interface CompileOpts {
3295
3527
  */
3296
3528
  declare function textDslToDiagram(src: string, opts?: CompileOpts): CdlDiagram;
3297
3529
 
3298
- export { type AnchorBox, type CompileNotice, type CompileOpts, DIAGRAM_BOUNDARY_PADDING, DRAW_TARGETS, DRAW_WORDS, type DiagramBoundingBox, type DragonJson, type DslActor, type DslAnimate, type DslDocument, type DslError, type DslGroup, type DslLane, type DslPhase, type DslSet, type DslState, type DslStep, type DslTween, type DslValue, type DslViewport, type FocusEntry, type InputSize, JSONを分解する, type JsonActor, type JsonActorNodeOverride, type JsonAxes, type JsonDslError, type JsonPhase, type JsonStep, type LayoutMode, type LayoutPos, type LintIssue, type LintReport, type LintSeverity, MAX_INPUT_BYTES, MAX_INPUT_ELEMENTS, MAX_PART_SCALE, NODE_KIND_ALIAS, NODE_KIND_VALID, PHASE_ITEM_WORDS, PRESET_TYPES, type PresetType, RELATIVE_GAP_DEFAULT, type RelativeDirection, type RelativePos, TONE_ALIAS, TOP_LEVEL_KEYS, autoFix, compileToCdl, computeDiagramBoundingBox, countBytes, countDiagramElements, countDocElements, describeOversize, describeOversizeSource, diagramJsonSchema, isColorValue, jsonToDiagram, lintDiagram, measureActorBoxes, normalizePartScale, orderByDependency, parseFocusEntry, parseRelativePos, parseTextDsl, parseTextDslV05, partBoxInFrame, partDrawsInDiagram, partIsMeasurable, partRenderSize, partScaleFactor, partTargetScale, partTargetSize, partVisualSize, partsBaseRows, partsGridCenters, pointsOutside, rectsOverlap, resolveRelativePos, stripExternalPaint, stripQuotes, textDslToDiagram, validateDragonJson, writeActorPosition, type トークン, type トークンの種類, 区間に広げる, 記法を分解する };
3530
+ export { type AnchorBox, type CompileNotice, type CompileOpts, DIAGRAM_BOUNDARY_PADDING, DIRECTION_ALIAS, DRAW_TARGETS, DRAW_WORDS, type DiagramBoundingBox, type DragonJson, type DslActor, type DslAnimate, type DslDocument, type DslError, type DslGroup, type DslLane, type DslPhase, type DslSet, type DslState, type DslStep, type DslTween, type DslValue, type DslViewport, type FocusEntry, type InputSize, JSONを分解する, type JsonActor, type JsonAxes, type JsonDslError, type JsonPhase, type JsonStep, type LayoutMode, type LayoutPos, type LintIssue, type LintReport, type LintSeverity, MAX_INPUT_BYTES, MAX_INPUT_ELEMENTS, MAX_PART_SCALE, NODE_KIND_ALIAS, NODE_KIND_VALID, PHASE_ITEM_WORDS, PRESET_TYPES, type PresetType, RELATIVE_GAP_DEFAULT, type RelativeDirection, type RelativePos, TONE_ALIAS, TOP_LEVEL_KEYS, autoFix, compileToCdl, computeDiagramBoundingBox, countBytes, countDiagramElements, countDocElements, describeOversize, describeOversizeSource, diagramJsonSchema, isColorValue, jsonToDiagram, lintDiagram, measureActorBoxes, normalizePartScale, orderByDependency, parseFocusEntry, parseRelativePos, parseTextDsl, parseTextDslV05, partBoxInFrame, partDrawsInDiagram, partIsMeasurable, partRenderSize, partScaleFactor, partTargetScale, partTargetSize, partVisualSize, partsBaseBottom, partsGridCenters, pointsOutside, rectsOverlap, resolveRelativePos, stripExternalPaint, stripQuotes, textDslToDiagram, validateDragonJson, writeActorPosition, type トークン, type トークンの種類, 区間に広げる, 書いた場所の鍵, type 書いた行の表, 記法を分解する, 部品に上書きを当てる };