agentic-mermaid 0.1.1 → 0.2.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 (340) hide show
  1. package/AGENT_NATIVE.md +155 -91
  2. package/CHANGELOG.md +163 -4
  3. package/Instructions_for_agents.md +10 -10
  4. package/LICENSES/Apache-2.0.txt +202 -0
  5. package/README.md +31 -38
  6. package/THIRD_PARTY_NOTICES.md +29 -0
  7. package/assets/hero.png +0 -0
  8. package/dist/agent-core.d.ts +463 -0
  9. package/dist/agent-core.js +397 -0
  10. package/dist/agent.d.ts +73 -1868
  11. package/dist/agent.js +336 -37325
  12. package/dist/agentic-mermaid-mcp.js +7 -38399
  13. package/dist/am.js +33626 -40446
  14. package/dist/chunk-2P5FKUQC.js +3485 -0
  15. package/dist/chunk-2S3VSS6I.js +149 -0
  16. package/dist/chunk-2SILJDW2.js +37 -0
  17. package/dist/chunk-BJYMBT4I.js +61963 -0
  18. package/dist/chunk-FDM43XU7.js +615 -0
  19. package/dist/chunk-MYPDVZCO.js +4702 -0
  20. package/dist/index-DWPa2MJs.d.ts +6780 -0
  21. package/dist/index.d.ts +1 -1
  22. package/dist/index.js +310 -33014
  23. package/dist/mcp-cli-5J47WEY3.js +17 -0
  24. package/docs/README.md +39 -31
  25. package/docs/agent-api-cookbook.md +44 -35
  26. package/docs/agent-mutation-policy.md +1 -1
  27. package/docs/agent-workflow-examples.md +2 -2
  28. package/docs/api.md +284 -77
  29. package/docs/ascii.md +26 -16
  30. package/docs/code-mode-impact.md +214 -0
  31. package/docs/comparison.md +23 -11
  32. package/docs/computational-aesthetics-prototype-plan.md +252 -0
  33. package/docs/config.md +26 -10
  34. package/docs/custom-fonts.md +265 -0
  35. package/docs/custom-style-cookbook.md +130 -9
  36. package/docs/diagram-families.md +48 -23
  37. package/docs/features.md +59 -52
  38. package/docs/fork-differences.md +6 -3
  39. package/docs/getting-started.md +23 -16
  40. package/docs/issue-derived-test-cases.md +29 -22
  41. package/docs/mcp-code-mode-rationale.md +13 -6
  42. package/docs/mcp-http-transport.md +20 -13
  43. package/docs/mermaid-layout-complaints.md +66 -52
  44. package/docs/mutation-testing.md +145 -66
  45. package/docs/quality.md +23 -14
  46. package/docs/react.md +2 -2
  47. package/docs/schemas/style-spec.schema.json +1221 -30
  48. package/docs/style-authoring.md +241 -38
  49. package/docs/svg-semantic-contract.md +49 -0
  50. package/docs/testing-strategy.md +166 -58
  51. package/docs/theming.md +19 -32
  52. package/examples/styles/catalog.json +54 -0
  53. package/examples/styles/cloudflare-workers-inspired-prototype.mmd +9 -0
  54. package/examples/styles/cloudflare-workers-inspired-prototype.style.json +110 -0
  55. package/examples/styles/cupertino-prototype.mmd +10 -0
  56. package/examples/styles/cupertino-prototype.style.json +63 -0
  57. package/examples/styles/mid-century-report.style.json +2 -2
  58. package/examples/styles/star-chart-atlas.style.json +2 -1
  59. package/examples/styles/transit-route-map.style.json +2 -2
  60. package/examples/styles/vercel-inspired-prototype.mmd +6 -0
  61. package/examples/styles/vercel-inspired-prototype.style.json +87 -0
  62. package/package.json +85 -45
  63. package/server.json +2 -2
  64. package/skills/agentic-mermaid-diagram-workflow/SKILL.md +17 -36
  65. package/skills/agentic-mermaid-diagram-workflow/references/cli.md +4 -5
  66. package/skills/agentic-mermaid-diagram-workflow/references/code-mode.md +15 -31
  67. package/skills/agentic-mermaid-diagram-workflow/references/sequence.md +10 -14
  68. package/skills/agentic-mermaid-live-editor/SKILL.md +100 -206
  69. package/TODO.md +0 -684
  70. package/dist/index-wjRjbsP-.d.ts +0 -1102
  71. package/docs/assets/improvements/box-start-connector.png +0 -0
  72. package/docs/assets/improvements/comment-dropped-lint.png +0 -0
  73. package/docs/assets/improvements/er-content-loss.png +0 -0
  74. package/docs/assets/improvements/fan-in-trunks.png +0 -0
  75. package/docs/assets/improvements/gantt-family.png +0 -0
  76. package/docs/assets/improvements/gantt-milestone-clamp.png +0 -0
  77. package/docs/assets/improvements/gantt-verify-seam.png +0 -0
  78. package/docs/assets/improvements/subgraph-container-edges.png +0 -0
  79. package/docs/assets/improvements/wrapper-frontmatter.png +0 -0
  80. package/docs/assets/improvements/wrapper-init-directive.png +0 -0
  81. package/docs/assets/improvements/wrapper-leading-comment.png +0 -0
  82. package/docs/assets/style-cookbook/mid-century-report.png +0 -0
  83. package/docs/assets/style-cookbook/star-chart-atlas.png +0 -0
  84. package/docs/assets/style-cookbook/transit-route-map.png +0 -0
  85. package/docs/contributing/adding-diagram-types.md +0 -144
  86. package/docs/contributing/diagram-family-citizenship.matrix.json +0 -2127
  87. package/docs/contributing/diagram-family-citizenship.md +0 -82
  88. package/docs/contributing/harvesting-upstream-tests.md +0 -126
  89. package/docs/contributing/lessons-learned.md +0 -276
  90. package/docs/contributing/releasing.md +0 -82
  91. package/docs/contributing/visual-review-evidence.md +0 -53
  92. package/docs/design/families/README.md +0 -26
  93. package/docs/design/families/architecture-beta.md +0 -48
  94. package/docs/design/families/flowchart-parser-conformance.md +0 -22
  95. package/docs/design/families/gantt-research.md +0 -137
  96. package/docs/design/families/gantt.md +0 -329
  97. package/docs/design/families/journey-agentic-cards-before.png +0 -0
  98. package/docs/design/families/journey-experience-curve-implementation.png +0 -0
  99. package/docs/design/families/journey-mermaid-classic-implementation.png +0 -0
  100. package/docs/design/families/journey-mermaid-classic-prototype.png +0 -0
  101. package/docs/design/families/journey-mermaid-classic-prototype.svg +0 -163
  102. package/docs/design/families/journey-mermaid-classic-prototype.svg.png +0 -0
  103. package/docs/design/families/journey-migration-parity.md +0 -439
  104. package/docs/design/families/journey-section-overlap-after.png +0 -0
  105. package/docs/design/families/journey-section-overlap-before.png +0 -0
  106. package/docs/design/families/journey-usage-research.md +0 -423
  107. package/docs/design/families/journey.md +0 -153
  108. package/docs/design/families/xychart.md +0 -85
  109. package/docs/design/system/README.md +0 -45
  110. package/docs/design/system/abstraction-audit.md +0 -224
  111. package/docs/design/system/abstraction-recommendations.md +0 -655
  112. package/docs/design/system/architecture.mmd +0 -29
  113. package/docs/design/system/architecture.svg +0 -137
  114. package/docs/design/system/layout-guarantees-and-robustness.md +0 -351
  115. package/docs/design/system/layout-rubric.md +0 -138
  116. package/docs/design/system/route-contracts.md +0 -848
  117. package/docs/design/system/source-preservation-ladder.md +0 -52
  118. package/docs/design/system/styles-rollout.md +0 -216
  119. package/docs/design/system/ugly-layouts.md +0 -119
  120. package/docs/layout-characterization/README.md +0 -245
  121. package/docs/layout-characterization/contact-sheet-families.md +0 -498
  122. package/docs/layout-characterization/contact-sheet.md +0 -638
  123. package/docs/layout-characterization/properties.md +0 -281
  124. package/docs/layout-characterization/visual-quality.md +0 -160
  125. package/docs/layout-characterization/visual-snapshots/architecture.svg +0 -79
  126. package/docs/layout-characterization/visual-snapshots/class.svg +0 -60
  127. package/docs/layout-characterization/visual-snapshots/er.svg +0 -61
  128. package/docs/layout-characterization/visual-snapshots/flowchart.svg +0 -58
  129. package/docs/layout-characterization/visual-snapshots/gantt.svg +0 -52
  130. package/docs/layout-characterization/visual-snapshots/journey.svg +0 -98
  131. package/docs/layout-characterization/visual-snapshots/pie.svg +0 -36
  132. package/docs/layout-characterization/visual-snapshots/quadrant.svg +0 -47
  133. package/docs/layout-characterization/visual-snapshots/sequence.svg +0 -59
  134. package/docs/layout-characterization/visual-snapshots/state.svg +0 -52
  135. package/docs/layout-characterization/visual-snapshots/timeline.svg +0 -64
  136. package/docs/layout-characterization/visual-snapshots/xychart.svg +0 -97
  137. package/docs/project/divergences.md +0 -98
  138. package/docs/project/dogfooding-docs-strategy.md +0 -66
  139. package/docs/project/hosted-mcp-cloudflare-plan.md +0 -338
  140. package/docs/project/lessons-learned.md +0 -1019
  141. package/docs/project/remove-role-styling-plan.md +0 -176
  142. package/examples/agent-improve-auth-flow.ts +0 -206
  143. package/examples/agent-loop.ts +0 -53
  144. package/examples/mcp-vs-cli-complex-diagrams.ts +0 -133
  145. package/llms.txt +0 -104
  146. package/skill-evals/README.md +0 -77
  147. package/skill-evals/fixtures/architecture-cache/input.mmd +0 -5
  148. package/skill-evals/fixtures/class-payment/input.mmd +0 -4
  149. package/skill-evals/fixtures/er-orders/input.mmd +0 -10
  150. package/skill-evals/fixtures/flowchart-cache/input.mmd +0 -3
  151. package/skill-evals/fixtures/gantt-release/input.mmd +0 -7
  152. package/skill-evals/fixtures/journey-checkout/input.mmd +0 -6
  153. package/skill-evals/fixtures/pie-exports/input.mmd +0 -5
  154. package/skill-evals/fixtures/quadrant-priorities/input.mmd +0 -11
  155. package/skill-evals/fixtures/sequence-retry/input.mmd +0 -8
  156. package/skill-evals/fixtures/state-lifecycle/input.mmd +0 -5
  157. package/skill-evals/fixtures/timeline-release/input.mmd +0 -6
  158. package/skill-evals/fixtures/xychart-growth/input.mmd +0 -5
  159. package/skill-evals/shared-benchmark.json +0 -510
  160. package/src/agent/analyze.ts +0 -157
  161. package/src/agent/apply.ts +0 -146
  162. package/src/agent/architecture-body.ts +0 -458
  163. package/src/agent/certificates.ts +0 -110
  164. package/src/agent/class-body.ts +0 -319
  165. package/src/agent/core.ts +0 -207
  166. package/src/agent/create.ts +0 -106
  167. package/src/agent/describe.ts +0 -368
  168. package/src/agent/er-body.ts +0 -224
  169. package/src/agent/facts.ts +0 -360
  170. package/src/agent/families-builtin.ts +0 -920
  171. package/src/agent/families.ts +0 -232
  172. package/src/agent/family-layouts.ts +0 -832
  173. package/src/agent/flowchart-body.ts +0 -372
  174. package/src/agent/flowchart-unsupported.ts +0 -243
  175. package/src/agent/font-coverage.ts +0 -288
  176. package/src/agent/gantt-body.ts +0 -495
  177. package/src/agent/index.ts +0 -10
  178. package/src/agent/journey-body.ts +0 -374
  179. package/src/agent/label-metrics.ts +0 -28
  180. package/src/agent/layout-to-rendered.ts +0 -63
  181. package/src/agent/mutate.ts +0 -97
  182. package/src/agent/mutation-ops.ts +0 -51
  183. package/src/agent/op-schema.ts +0 -443
  184. package/src/agent/parse.ts +0 -223
  185. package/src/agent/pie-body.ts +0 -270
  186. package/src/agent/png.ts +0 -171
  187. package/src/agent/quadrant-body.ts +0 -336
  188. package/src/agent/quality.ts +0 -363
  189. package/src/agent/readability-audit.ts +0 -92
  190. package/src/agent/rendered-route-audit.ts +0 -61
  191. package/src/agent/sequence-body.ts +0 -345
  192. package/src/agent/serialize.ts +0 -214
  193. package/src/agent/state-body.ts +0 -589
  194. package/src/agent/structural-count.ts +0 -150
  195. package/src/agent/timeline-body.ts +0 -280
  196. package/src/agent/trace-log.ts +0 -43
  197. package/src/agent/types.ts +0 -995
  198. package/src/agent/verify.ts +0 -603
  199. package/src/agent/xychart-body.ts +0 -472
  200. package/src/architecture/config.ts +0 -282
  201. package/src/architecture/layout.ts +0 -496
  202. package/src/architecture/parser.ts +0 -375
  203. package/src/architecture/renderer.ts +0 -611
  204. package/src/architecture/types.ts +0 -113
  205. package/src/ascii/ansi.ts +0 -423
  206. package/src/ascii/architecture.ts +0 -210
  207. package/src/ascii/canvas.ts +0 -443
  208. package/src/ascii/class-diagram.ts +0 -697
  209. package/src/ascii/converter.ts +0 -475
  210. package/src/ascii/draw.ts +0 -1693
  211. package/src/ascii/edge-bundling.ts +0 -328
  212. package/src/ascii/edge-routing.ts +0 -330
  213. package/src/ascii/er-diagram.ts +0 -439
  214. package/src/ascii/gantt.ts +0 -276
  215. package/src/ascii/grid.ts +0 -747
  216. package/src/ascii/index.ts +0 -196
  217. package/src/ascii/journey.ts +0 -169
  218. package/src/ascii/meta.ts +0 -244
  219. package/src/ascii/multiline-utils.ts +0 -80
  220. package/src/ascii/pathfinder.ts +0 -301
  221. package/src/ascii/pie.ts +0 -67
  222. package/src/ascii/quadrant.ts +0 -158
  223. package/src/ascii/reverse.ts +0 -216
  224. package/src/ascii/sequence.ts +0 -499
  225. package/src/ascii/shapes/circle.ts +0 -27
  226. package/src/ascii/shapes/corners.ts +0 -143
  227. package/src/ascii/shapes/diamond.ts +0 -27
  228. package/src/ascii/shapes/hexagon.ts +0 -27
  229. package/src/ascii/shapes/index.ts +0 -106
  230. package/src/ascii/shapes/rectangle.ts +0 -168
  231. package/src/ascii/shapes/rounded.ts +0 -27
  232. package/src/ascii/shapes/special.ts +0 -332
  233. package/src/ascii/shapes/stadium.ts +0 -110
  234. package/src/ascii/shapes/state.ts +0 -192
  235. package/src/ascii/shapes/types.ts +0 -73
  236. package/src/ascii/timeline.ts +0 -141
  237. package/src/ascii/types.ts +0 -312
  238. package/src/ascii/validate.ts +0 -120
  239. package/src/ascii/width.ts +0 -81
  240. package/src/ascii/wrap.ts +0 -131
  241. package/src/ascii/xychart.ts +0 -919
  242. package/src/browser.ts +0 -29
  243. package/src/class/layout.ts +0 -240
  244. package/src/class/parser.ts +0 -332
  245. package/src/class/renderer.ts +0 -638
  246. package/src/class/types.ts +0 -129
  247. package/src/cli/agent-instructions.ts +0 -1
  248. package/src/cli/am-bin.ts +0 -6
  249. package/src/cli/exit-codes.ts +0 -18
  250. package/src/cli/index.ts +0 -1132
  251. package/src/cli/init-agent.ts +0 -147
  252. package/src/cli/run-entrypoint.ts +0 -10
  253. package/src/color-resolver.ts +0 -152
  254. package/src/elk-instance.ts +0 -114
  255. package/src/er/layout.ts +0 -187
  256. package/src/er/parser.ts +0 -226
  257. package/src/er/renderer.ts +0 -792
  258. package/src/er/types.ts +0 -99
  259. package/src/family-rubric.ts +0 -425
  260. package/src/font-manifest.ts +0 -31
  261. package/src/gantt/layout.ts +0 -365
  262. package/src/gantt/parser.ts +0 -282
  263. package/src/gantt/pipeline.ts +0 -27
  264. package/src/gantt/renderer.ts +0 -414
  265. package/src/gantt/schedule.ts +0 -513
  266. package/src/gantt/types.ts +0 -255
  267. package/src/index.ts +0 -368
  268. package/src/journey/layout.ts +0 -554
  269. package/src/journey/parse-core.ts +0 -251
  270. package/src/journey/parser.ts +0 -101
  271. package/src/journey/renderer.ts +0 -917
  272. package/src/journey/types.ts +0 -144
  273. package/src/layout/geometry.ts +0 -182
  274. package/src/layout/pass.ts +0 -142
  275. package/src/layout/passes/index.ts +0 -3916
  276. package/src/layout-engine.ts +0 -1565
  277. package/src/layout-rubric.ts +0 -659
  278. package/src/mcp/artifacts.ts +0 -137
  279. package/src/mcp/dynamic-harness.ts +0 -31
  280. package/src/mcp/dynamic-modules.d.ts +0 -7
  281. package/src/mcp/facade.ts +0 -608
  282. package/src/mcp/harness-runtime.ts +0 -203
  283. package/src/mcp/hosted-server.ts +0 -468
  284. package/src/mcp/mcp-bin.ts +0 -3
  285. package/src/mcp/mcp-cli.ts +0 -82
  286. package/src/mcp/protocol.ts +0 -13
  287. package/src/mcp/sandbox.ts +0 -195
  288. package/src/mcp/sdk-decl.ts +0 -391
  289. package/src/mcp/server.ts +0 -362
  290. package/src/mcp/tool-surface.ts +0 -146
  291. package/src/mermaid-source.ts +0 -655
  292. package/src/multiline-utils.ts +0 -228
  293. package/src/parser.ts +0 -1031
  294. package/src/pie/layout.ts +0 -168
  295. package/src/pie/parser.ts +0 -136
  296. package/src/pie/renderer.ts +0 -234
  297. package/src/pie/types.ts +0 -82
  298. package/src/quadrant/layout.ts +0 -191
  299. package/src/quadrant/parser.ts +0 -183
  300. package/src/quadrant/renderer.ts +0 -322
  301. package/src/quadrant/types.ts +0 -113
  302. package/src/render-family-hooks.ts +0 -244
  303. package/src/renderer.ts +0 -1099
  304. package/src/route-contracts.ts +0 -2723
  305. package/src/scene/backend.ts +0 -76
  306. package/src/scene/fidelity.ts +0 -183
  307. package/src/scene/hybrid-backend.ts +0 -174
  308. package/src/scene/ir.ts +0 -181
  309. package/src/scene/marks.ts +0 -127
  310. package/src/scene/rough-backend.ts +0 -378
  311. package/src/scene/seed.ts +0 -46
  312. package/src/scene/style-registry.ts +0 -556
  313. package/src/sequence/layout.ts +0 -456
  314. package/src/sequence/parser.ts +0 -255
  315. package/src/sequence/renderer.ts +0 -604
  316. package/src/sequence/types.ts +0 -154
  317. package/src/shape-clipping.ts +0 -351
  318. package/src/shared/accessibility-directives.ts +0 -22
  319. package/src/shared/batched.ts +0 -61
  320. package/src/shared/color-math.ts +0 -93
  321. package/src/shared/svg-a11y.ts +0 -29
  322. package/src/shared/syntax-error.ts +0 -17
  323. package/src/shared/unicode-ranges.ts +0 -135
  324. package/src/styles.ts +0 -318
  325. package/src/svg-paths.ts +0 -28
  326. package/src/text-metrics.ts +0 -248
  327. package/src/theme.ts +0 -710
  328. package/src/timeline/layout.ts +0 -381
  329. package/src/timeline/parser.ts +0 -215
  330. package/src/timeline/renderer.ts +0 -538
  331. package/src/timeline/types.ts +0 -105
  332. package/src/types.ts +0 -462
  333. package/src/website-worker-modules.d.ts +0 -18
  334. package/src/xychart/axis-utils.ts +0 -109
  335. package/src/xychart/colors.ts +0 -124
  336. package/src/xychart/config.ts +0 -88
  337. package/src/xychart/layout.ts +0 -656
  338. package/src/xychart/parser.ts +0 -504
  339. package/src/xychart/renderer.ts +0 -640
  340. package/src/xychart/types.ts +0 -282
@@ -1,45 +0,0 @@
1
- # System architecture — start here
2
-
3
- How the Agentic Mermaid engine fits together. This is the entry point the
4
- [abstraction audit](./abstraction-audit.md) identified as missing: a single top-down
5
- view of the whole system, distinct from the per-diagram-type design notes.
6
-
7
- ![Agentic Mermaid abstraction architecture: one normalized source is routed through the FamilyPlugin registry into SVG, ASCII, and agent hooks over the same 12 diagram families and shared core types](./architecture.svg)
8
-
9
- One Mermaid source is normalized once, then processed by **three parallel stacks** —
10
- SVG (`renderMermaidSVG`), ASCII (`renderMermaidASCII`), and the agent IR
11
- (`parseMermaid` / `mutate` / `verify`). All three route through the
12
- `FamilyPlugin` registry: SVG uses `layout` + `renderSvg` hooks, ASCII uses
13
- `renderAscii`, and the agent stack uses `parse` / `serialize` / `mutate` /
14
- `verify`. The stacks still keep their own geometry models where that is essential
15
- (float SVG layout vs. terminal grid layout), over a shared core vocabulary in
16
- `src/types.ts`.
17
-
18
- ## This figure is dogfooded and drift-proof
19
-
20
- The diagram is authored as Mermaid ([`architecture.mmd`](./architecture.mmd)) and
21
- rendered to [`architecture.svg`](./architecture.svg) **by our own renderer**. A
22
- determinism snapshot test
23
- ([`src/__tests__/docs-architecture-diagram.test.ts`](../../../src/__tests__/docs-architecture-diagram.test.ts))
24
- re-renders the source and asserts (a) the render is deterministic across calls and
25
- (b) it matches the committed SVG — so the picture can never silently drift from the
26
- code it describes. Regenerate after an intentional source change:
27
-
28
- ```
29
- UPDATE_GOLDEN=1 bun test src/__tests__/docs-architecture-diagram.test.ts
30
- ```
31
-
32
- This is the documentation half of the abstraction work: docs *about* the system are
33
- produced *by* the system, and pinned the same way we pin layout determinism.
34
-
35
- ## Read next
36
-
37
- - [`abstraction-audit.md`](./abstraction-audit.md) — the historical pre-implementation snapshot + ranked issue list **I1–I9**.
38
- - [`abstraction-recommendations.md`](./abstraction-recommendations.md) — literature-grounded fixes, 2026-06-21 reappraisal, and closure criteria for I1–I9.
39
- - [`route-contracts.md`](./route-contracts.md) — the flowchart routing engine (edge classification, direct-lane proofs, certifying straightener).
40
- - [`layout-rubric.md`](./layout-rubric.md) — the deterministic layout-quality rubric.
41
- - [`layout-guarantees-and-robustness.md`](./layout-guarantees-and-robustness.md) — literature + industry synthesis: which invariants we can guarantee by construction vs. only optimize-and-certify, and the path to fuzz-robustness.
42
- - [`source-preservation-ladder.md`](./source-preservation-ladder.md) — the structured\|opaque family-adoption contract (L0–L4).
43
-
44
- > These design docs are co-located here in `design/system/`; per-family notes live in
45
- > [`../families/`](../families/README.md).
@@ -1,224 +0,0 @@
1
- # Abstraction audit — historical baseline and issue list
2
-
3
- Status: historical audit snapshot. Captured 2026-06-20, before the issue #71
4
- implementation. Scope: the abstraction surfaces across
5
- `src/` (core pipeline, per-family modules, `agent/`, `ascii/`, styling/theming).
6
-
7
- This document captures **what the code looked like on 2026-06-20** and the **list of issues**. It is
8
- kept as the historical baseline for issue #71, not as the current architecture reference.
9
- Literature-grounded
10
- recommendations are tracked separately in
11
- [`abstraction-recommendations.md`](./abstraction-recommendations.md).
12
-
13
- > 2026-06-21 note: this is now the **pre-implementation baseline**, not the
14
- > current architecture. The current closure spec and reappraisal are in
15
- > [`abstraction-recommendations.md`](./abstraction-recommendations.md#2026-06-21-reappraisal).
16
- > Line references and type names below are audit-time references.
17
-
18
- ---
19
-
20
- ## 1. Mental model: three stacks over one source
21
-
22
- Every diagram nominally flowed `source → normalize → parse → layout → render`. At audit time, that
23
- pipeline was implemented **three independent times**, once per output surface, over the same set of 12
24
- diagram families:
25
-
26
- | Stack | Entry | Dispatch | Layout model | Output |
27
- |---|---|---|---|---|
28
- | **SVG** | `renderMermaidSVG` (`src/index.ts:297`) | `switch(diagramType)` — 11 arms (`index.ts:342`) | `PositionedGraph` + 10 sibling `Positioned*` types | SVG string |
29
- | **ASCII** | `renderMermaidASCII` (`src/ascii/index.ts`) | `switch(diagramType)` — 11 arms | `AsciiGraph`/`Canvas` (own A* layout, no ELK) | text |
30
- | **Agent** | `parseMermaid`/`mutate`/`verify`/… (`src/agent/`) | `FamilyPlugin` **registry** (`src/agent/families.ts`) | `ValidDiagram`/`DiagramBody` + `RenderedLayout` | typed IR |
31
-
32
- This triplication was the root cause of most issues below: the same concept ("a sequence
33
- diagram," "a node," "an edge route") has up to three representations, and the three stacks
34
- dispatch over families three different ways.
35
-
36
- The only **core** types genuinely shared across stacks live in `src/types.ts`: `NodeShape`,
37
- `EdgeStyle`, `EdgeMarker`, `Direction`, `MermaidGraph` (+`MermaidNode`/`Edge`/`Subgraph`), and
38
- the `RouteClass`/port vocabulary. Everything larger forks per stack.
39
-
40
- ---
41
-
42
- ## 2. Inventory of abstraction layers
43
-
44
- The 12 built-in families this inventory spans — the canonical roster, **generated from
45
- `BUILTIN_FAMILY_METADATA` (`src/agent/families.ts`)** and pinned by
46
- [`audit-family-table.test.ts`](../../../src/__tests__/audit-family-table.test.ts) so it cannot drift
47
- from the registry (regenerate with `UPDATE_GOLDEN=1 bun test src/__tests__/audit-family-table.test.ts`):
48
-
49
- <!-- FAMILY-TABLE:start -->
50
- | Family | `kind` | Mermaid header(s) | SDK narrower |
51
- |---|---|---|---|
52
- | Flowchart | `flowchart` | `flowchart`, `graph` | `asFlowchart` |
53
- | State | `state` | `stateDiagram`, `stateDiagram-v2` | `asState` |
54
- | Sequence | `sequence` | `sequenceDiagram` | `asSequence` |
55
- | Timeline | `timeline` | `timeline` | `asTimeline` |
56
- | Class | `class` | `classDiagram` | `asClass` |
57
- | ER | `er` | `erDiagram` | `asEr` |
58
- | Journey | `journey` | `journey` | `asJourney` |
59
- | Architecture | `architecture` | `architecture-beta` | `asArchitecture` |
60
- | XY chart | `xychart` | `xychart`, `xychart-beta` | `asXyChart` |
61
- | Pie | `pie` | `pie` | `asPie` |
62
- | Quadrant | `quadrant` | `quadrantChart` | `asQuadrant` |
63
- | Gantt | `gantt` | `gantt` | `asGantt` |
64
- <!-- FAMILY-TABLE:end -->
65
-
66
- - **Domain IR (input):** `MermaidGraph` (flowchart, `types.ts:7`) + 10 family input types
67
- (`SequenceDiagram`, `ClassDiagram`, `ErDiagram`, `TimelineDiagram`, `JourneyDiagram`,
68
- `XYChart`, `PieChart`, `QuadrantChart`, `GanttModel`, `ArchitectureDiagram`) + agent
69
- `ValidDiagram`/`DiagramBody` (`agent/types.ts`).
70
- - **Layout output (positioned):** `PositionedGraph` (`types.ts:91`) + 10 unrelated `Positioned*`/
71
- `*LayoutResult` siblings + agent `RenderedLayout` (a second normalized model).
72
- - **Routing / quality:** `route-contracts.ts` (`classifyRoutes`, `allocateRoutePorts`,
73
- `applyRouteContracts`, `auditRouteContracts`) producing `RouteCertificate`;
74
- audit-time `FamilyRouteCertificate` (produced only in `agent/family-layouts.ts`);
75
- `layout-rubric.ts` (`assessLayout` → `RubricResult`);
76
- agent `verify` (3-tier `LayoutWarning`).
77
- - **Styling / color:** the public Style + Palette surface normalizes into `DiagramColors`
78
- (`theme.ts`), `ResolvedColors` (`theme.ts`), `MermaidThemeVariables` (`mermaid-source.ts`),
79
- `classDefs`/`nodeStyles`/`linkStyles` (`MermaidGraph`), and the CSS-custom-property layer
80
- (`--bg`/`--fg` + `color-mix`). Built-in looks also feed an internal style face.
81
- - **Rendering surfaces:** SVG renderers (`renderer.ts:37` `renderSvg` + 10 family `render*Svg`);
82
- ASCII (`AsciiGraph`/`Canvas`/`RoleCanvas` + pluggable `ShapeRenderer` registry); PNG (`agent/png.ts`).
83
- - **Dispatch:** SVG `switch` (`index.ts`) vs ASCII `switch` (`ascii/index.ts`) vs agent
84
- `FamilyPlugin` registry (`agent/families.ts`).
85
- - **Delivery:** `cli/`, `mcp/` (JSON-RPC server, sandbox, artifact store) — thin surfaces over the above.
86
-
87
- ---
88
-
89
- ## 3. Issue list (ranked by structural weight)
90
-
91
- ### I1 — Three dispatch mechanisms for one family set; the best one is least used
92
- The agent layer has a clean plugin registry (`FamilyPlugin { id, detect, parse?, serialize?,
93
- mutate?, verify? }` in a `Map<DiagramKind, FamilyPlugin>`, self-registered at import). The SVG
94
- and ASCII stacks each hand-maintain a parallel `switch(diagramType)`. Adding a family means
95
- touching three dispatch sites that cannot drift-check each other. **Highest-leverage target.**
96
-
97
- ### I2 — Renderer signature drift + redundant `(colors, font, transparent, options)` threading
98
- Canonical shape: `renderSvg(positioned, colors: DiagramColors, font='Inter', transparent=false,
99
- options={})` (`renderer.ts:37`). Drift across families:
100
- - `renderGanttSvg(positioned, colors, font, transparent)` — **no `options`**
101
- - `renderTimelineSvg(positioned, colors, font, transparent, timelineConfig, themeVariables, options)` — **7 params**
102
- - `renderXYChartSvg(positioned, colors, font, transparent, interactive, options)` — `interactive` wedged in
103
- - `renderArchitectureSvg(positioned, colors, font, transparent, visual)` — `visual` *replaces* `options`
104
- - `renderPieSvg` / `renderQuadrantSvg(…, _options)` — `options` accepted but unused
105
-
106
- Three positional args are redundant: `font` is also folded into `colors`
107
- (audit-time `buildColors(opts, config, font)` sets `DiagramColors.font`, `index.ts:106`), and `transparent`
108
- is a lone boolean that could live in `colors`/`options`. A single
109
- `RenderContext { positioned, colors, options }` collapses the row and kills the drift.
110
-
111
- ### I3 — No shared `Positioned*` contract; two parallel layout-output models
112
- The 11 `Positioned*`/`*LayoutResult` types are structurally unrelated — each re-declares
113
- `width`/`height` independently, no base interface. On top of that the agent stack has a second
114
- normalized model, `RenderedLayout`, which the SVG stack never uses; `agent/layout-to-rendered.ts`
115
- and `agent/family-layouts.ts` translate into it. "A laid-out diagram" has no canonical type.
116
-
117
- ### I4 — Layering leaks: render/config concerns pushed up into parse and layout
118
- Clean for ~7 families, broken for 4:
119
- - Audit-time `layoutPieChart(chart, options, colors)` — layout consumes `DiagramColors` to assign slice colors.
120
- - `layoutArchitectureDiagram(diagram, options, visual)` + `resolveArchitectureVisualConfig` —
121
- visual config threaded through layout *and* render, bypassing `options`.
122
- - Audit-time `parseXYChart(lines, frontmatter)` — frontmatter/theme baked in during *parsing*.
123
- - Gantt is a **4-stage** pipeline (`parseGanttModel → applyGanttFrontmatterConfig →
124
- resolveGanttSchedule → layoutGantt → render`), hand-wired in `index.ts:404`.
125
-
126
- ### I5 — Styling: five parallel color models; N ways to set one property
127
- `RenderOptions → DiagramColors → ResolvedColors` (hex, for non-browser via `inlineResolvedColors`),
128
- plus `MermaidThemeVariables` (frontmatter aliases) and `classDefs`/`nodeStyles`/`linkStyles`
129
- (inline directives). **Node fill** is reachable through palette tokens, themeVariables, and
130
- classDef/style directives; **group border** is similarly split between options and themeVariables.
131
- The current target is one public Style + Palette boundary plus Mermaid-native per-element directives.
132
-
133
- ### I6 — "Route contracts" is two abstractions sharing one type union
134
- `RouteCertificate` (flowchart) is produced in the **core** (`route-contracts.ts:1169`
135
- `applyRouteContracts`, attached to `PositionedEdge.routeCertificate`). Audit-time `FamilyRouteCertificate`
136
- (class/er/architecture/sequence/timeline/…) is produced **only** in `agent/family-layouts.ts`
137
- (`:139`, `:196`, `:292`, `:406`); the core SVG render path for families attaches no certificates.
138
- Audit-time `LayoutRouteCertificate = RouteCertificate | FamilyRouteCertificate` looks unified but the two
139
- arms share neither producer, consumer, nor lifecycle.
140
-
141
- ### I7 — The agent layer is the reference design — with two seams
142
- `ValidDiagram { kind, meta, body, source, canonicalSource }` + `DiagramBody` (12 structured
143
- bodies | opaque fallback) + `Result<T,E>` + the `FamilyPlugin` registry is the most coherent
144
- abstraction in the repo, and it reuses core `MermaidGraph` rather than re-declaring it. Seams:
145
- (a) mutation ops are **duck-typed** — `mutate(body, op: AnyMutationOp)` with each family narrowing
146
- via `if (body.kind !== 'class') return err(...)`; (b) for layout the agent **re-parses
147
- `canonicalSource`** through the core per-family parser instead of laying out the structured body
148
- it already holds — a text round-trip coupling agent layout to serializer fidelity.
149
-
150
- ### I8 — ASCII is a parallel universe — mostly justified, internally clean
151
- `ascii/` (~9.6k lines) shares nothing large with SVG: own `AsciiGraph`/`Canvas`/`RoleCanvas`,
152
- own A* pathfinder, own per-family layouts. It reuses only `NodeShape`, `EdgeStyle`, `RouteClass`
153
- (via `classifyRoutes`), and `shared/unicode-ranges.ts`. The isolation is defensible (grid vs.
154
- float geometry); ASCII is *internally* well-abstracted (it has the pluggable `ShapeRenderer`
155
- registry the SVG side lacks). Cost: "shape," "edge routing," and "fan-in/out bundling" each
156
- exist twice, so a parity change must be made in two places.
157
-
158
- ### I9 — Vestigial / cosmetic
159
- - Audit-time `src/layout.ts` is a one-line re-export of `layoutGraphSync` — pure indirection.
160
- - Naming inconsistency: `parseXDiagram` vs `parseXChart` vs `parseGanttModel`; `Sync` suffix on
161
- only 3 of 11 layout fns (all are sync).
162
- - `_options` unused params (pie/quadrant) advertise a contract the function does not honor.
163
-
164
- ---
165
-
166
- ## 4. Preliminary convergence targets
167
-
168
- These are first-cut directions; the literature review refines and prioritizes them in
169
- [`abstraction-recommendations.md`](./abstraction-recommendations.md). The binding constraint is
170
- **determinism** (CLAUDE.md: identical input must produce identical geometry), which makes any
171
- retrofit careful, family-by-family work behind snapshot tests rather than a sweeping rename.
172
-
173
- 1. Unify family dispatch on the agent's registry; give `FamilyPlugin` optional
174
- `renderSvg`/`renderAscii` hooks and delete the two `switch` statements. (Addresses I1.)
175
- 2. Collapse renderer signatures to `render(ctx: RenderContext)` with `font`/`transparent` inside.
176
- (Addresses I2.)
177
- 3. Introduce a marker `PositionedDiagram` base and make `RenderedLayout` a documented projection.
178
- (Addresses I3.)
179
- 4. Pick one color funnel (`DiagramColors` + CSS vars as the internal contract; normalize
180
- themeVariables/classDefs into it at the boundary; keep public style JSON to Style + Palette).
181
- (Addresses I5.)
182
- 5. Push layering leaks back down (pie/architecture resolve colors/visual at render; xychart applies
183
- frontmatter as post-parse middleware like gantt). (Addresses I4.)
184
- 6. Split the certificate type to reflect reality, or produce family certs in the core layout path.
185
- (Addresses I6.)
186
-
187
- ---
188
-
189
- ## 5. Reconciliation with existing design docs
190
-
191
- This audit was derived from source, but several existing docs already describe parts of this
192
- architecture. Cross-checked against them, the findings **agree**; three earn an honest refinement.
193
-
194
- | Existing doc | Relates to | Verdict |
195
- |---|---|---|
196
- | [`AGENT_NATIVE.md`](../../../AGENT_NATIVE.md) | I3, I6, I7 | Agrees; refines I3 and I7 (below). The agent-stack design rationale. |
197
- | [`contributing/diagram-family-citizenship.md`](../../contributing/diagram-family-citizenship.md) | I1, I8 | Agrees; the family×surface drift is **already CI-guarded** (below). |
198
- | [`design/source-preservation-ladder.md`](./source-preservation-ladder.md) | I7 | Agrees; formalizes the structured\|opaque model as levels L0–L4. |
199
-
200
- **I1 refinement — the drift was already test-guarded.** `diagram-family-citizenship.md` (issue #41)
201
- defines a family×surface matrix whose `detectionParse` row requires that "shared detector, agent parse,
202
- SVG render, ASCII render, CLI, and MCP paths route consistently" (state's flowchart-renderer split is the
203
- one documented exception), enforced by `diagram-family-citizenship.test.ts`. So the risk I1 names — three
204
- dispatch sites that "cannot drift-check each other" — was already mitigated by an external CI ratchet.
205
- The issue #71 implementation made that drift-check structural by routing SVG and ASCII through
206
- `FamilyPlugin` hooks.
207
-
208
- **I3 refinement — `RenderedLayout` is the deliberate canonical artifact.** `AGENT_NATIVE.md` §1 establishes
209
- that the **layout JSON (`RenderedLayout`) is THE canonical artifact, not the SVG** ("two render results are
210
- equal iff their layout JSON is structurally equal") — it is the determinism/equality oracle pinned by the
211
- cross-process and drift-sentinel tests. It is therefore not redundant debt: `PositionedGraph` is the
212
- SVG-specific geometry, `RenderedLayout` is the surface-neutral equality contract. The fix is to make the
213
- `PositionedGraph → RenderedLayout` lowering explicit (one derives from the other), **not** to pick a winner.
214
-
215
- **I7 refinement — the re-parse seam is documented and round-trip-tested.** `AGENT_NATIVE.md` §3 makes
216
- `canonicalSource` "the round-trip pillar" and states "structured renderers use this as input" — so the
217
- agent-layout re-parse I flagged is a *documented* design choice, guarded by the round-trip identity
218
- properties (`serializeMermaid(parseMermaid(s)) ≡ normalize(s)` and `parseMermaid(serializeMermaid(d)) ≡ d`,
219
- property-tested). The coupling is **tested, not hidden**; laying out the structured body directly is a
220
- decoupling/perf option (lower-urgency than first stated) that applies only to **L3/L4** structured bodies
221
- (per the source-preservation ladder) — for **L1** opaque bodies, text *is* the representation and
222
- re-parsing is correct by design. Likewise I7 seam (a): the **public** mutation surface is strongly typed
223
- (per-family `mutate` overloads + branded `as*` narrowers with compile-time rejection of opaque bodies,
224
- `AGENT_NATIVE.md` §3); the duck-typed narrowing is an internal implementation detail, not the public contract.