agentic-mermaid 0.1.0 → 0.1.2

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 (333) hide show
  1. package/CHANGELOG.md +149 -4
  2. package/LICENSES/Apache-2.0.txt +202 -0
  3. package/README.md +25 -32
  4. package/THIRD_PARTY_NOTICES.md +29 -0
  5. package/assets/fonts/FONT-LICENSES.md +9 -5
  6. package/assets/fonts/Inter-Bold.ttf +0 -0
  7. package/assets/fonts/Inter-Medium.ttf +0 -0
  8. package/assets/fonts/Inter-Regular.ttf +0 -0
  9. package/assets/fonts/Inter-SemiBold.ttf +0 -0
  10. package/dist/agent-core.d.ts +463 -0
  11. package/dist/agent-core.js +397 -0
  12. package/dist/agent.d.ts +81 -1822
  13. package/dist/agent.js +336 -36839
  14. package/dist/agentic-mermaid-mcp.js +7 -37908
  15. package/dist/am.js +33638 -36261
  16. package/dist/chunk-4QECACIA.js +4702 -0
  17. package/dist/chunk-CDPKJ2BQ.js +37 -0
  18. package/dist/chunk-QKDLMOJJ.js +3487 -0
  19. package/dist/chunk-WI35L7IR.js +615 -0
  20. package/dist/chunk-WN3YDOBG.js +149 -0
  21. package/dist/chunk-ZYMMKQ3I.js +62637 -0
  22. package/dist/index-D54dqSdC.d.ts +6777 -0
  23. package/dist/index.d.ts +1 -1
  24. package/dist/index.js +310 -32836
  25. package/dist/mcp-cli-SBQSTJFC.js +17 -0
  26. package/docs/README.md +14 -6
  27. package/docs/schemas/style-spec.schema.json +1221 -30
  28. package/examples/styles/catalog.json +54 -0
  29. package/examples/styles/cloudflare-workers-inspired-prototype.mmd +9 -0
  30. package/examples/styles/cloudflare-workers-inspired-prototype.style.json +110 -0
  31. package/examples/styles/cupertino-prototype.mmd +10 -0
  32. package/examples/styles/cupertino-prototype.style.json +63 -0
  33. package/examples/styles/mid-century-report.style.json +2 -2
  34. package/examples/styles/star-chart-atlas.style.json +2 -1
  35. package/examples/styles/transit-route-map.style.json +2 -2
  36. package/examples/styles/vercel-inspired-prototype.mmd +6 -0
  37. package/examples/styles/vercel-inspired-prototype.style.json +87 -0
  38. package/package.json +70 -43
  39. package/server.json +41 -0
  40. package/skills/agentic-mermaid-diagram-workflow/SKILL.md +17 -36
  41. package/skills/agentic-mermaid-diagram-workflow/references/cli.md +4 -5
  42. package/skills/agentic-mermaid-diagram-workflow/references/code-mode.md +15 -31
  43. package/skills/agentic-mermaid-diagram-workflow/references/sequence.md +10 -14
  44. package/skills/agentic-mermaid-live-editor/SKILL.md +100 -206
  45. package/AGENT_NATIVE.md +0 -602
  46. package/Instructions_for_agents.md +0 -83
  47. package/TODO.md +0 -662
  48. package/assets/hero.png +0 -0
  49. package/dist/index-x2Cj1dVv.d.ts +0 -1089
  50. package/docs/agent-api-cookbook.md +0 -308
  51. package/docs/agent-mutation-policy.md +0 -104
  52. package/docs/agent-workflow-examples.md +0 -46
  53. package/docs/api.md +0 -203
  54. package/docs/ascii.md +0 -103
  55. package/docs/assets/improvements/box-start-connector.png +0 -0
  56. package/docs/assets/improvements/comment-dropped-lint.png +0 -0
  57. package/docs/assets/improvements/er-content-loss.png +0 -0
  58. package/docs/assets/improvements/fan-in-trunks.png +0 -0
  59. package/docs/assets/improvements/gantt-family.png +0 -0
  60. package/docs/assets/improvements/gantt-milestone-clamp.png +0 -0
  61. package/docs/assets/improvements/gantt-verify-seam.png +0 -0
  62. package/docs/assets/improvements/subgraph-container-edges.png +0 -0
  63. package/docs/assets/improvements/wrapper-frontmatter.png +0 -0
  64. package/docs/assets/improvements/wrapper-init-directive.png +0 -0
  65. package/docs/assets/improvements/wrapper-leading-comment.png +0 -0
  66. package/docs/assets/style-cookbook/mid-century-report.png +0 -0
  67. package/docs/assets/style-cookbook/star-chart-atlas.png +0 -0
  68. package/docs/assets/style-cookbook/transit-route-map.png +0 -0
  69. package/docs/comparison.md +0 -94
  70. package/docs/config.md +0 -105
  71. package/docs/contributing/adding-diagram-types.md +0 -144
  72. package/docs/contributing/diagram-family-citizenship.matrix.json +0 -2127
  73. package/docs/contributing/diagram-family-citizenship.md +0 -82
  74. package/docs/contributing/harvesting-upstream-tests.md +0 -126
  75. package/docs/contributing/lessons-learned.md +0 -276
  76. package/docs/contributing/releasing.md +0 -71
  77. package/docs/contributing/visual-review-evidence.md +0 -53
  78. package/docs/custom-style-cookbook.md +0 -154
  79. package/docs/design/families/README.md +0 -26
  80. package/docs/design/families/architecture-beta.md +0 -48
  81. package/docs/design/families/flowchart-parser-conformance.md +0 -22
  82. package/docs/design/families/gantt-research.md +0 -137
  83. package/docs/design/families/gantt.md +0 -329
  84. package/docs/design/families/journey-agentic-cards-before.png +0 -0
  85. package/docs/design/families/journey-mermaid-classic-implementation.png +0 -0
  86. package/docs/design/families/journey-mermaid-classic-prototype.png +0 -0
  87. package/docs/design/families/journey-mermaid-classic-prototype.svg +0 -163
  88. package/docs/design/families/journey-mermaid-classic-prototype.svg.png +0 -0
  89. package/docs/design/families/journey-migration-parity.md +0 -433
  90. package/docs/design/families/journey-usage-research.md +0 -423
  91. package/docs/design/families/journey.md +0 -125
  92. package/docs/design/families/xychart.md +0 -85
  93. package/docs/design/system/README.md +0 -45
  94. package/docs/design/system/abstraction-audit.md +0 -224
  95. package/docs/design/system/abstraction-recommendations.md +0 -655
  96. package/docs/design/system/architecture.mmd +0 -29
  97. package/docs/design/system/architecture.svg +0 -137
  98. package/docs/design/system/layout-guarantees-and-robustness.md +0 -351
  99. package/docs/design/system/layout-rubric.md +0 -138
  100. package/docs/design/system/route-contracts.md +0 -848
  101. package/docs/design/system/source-preservation-ladder.md +0 -52
  102. package/docs/design/system/styles-rollout.md +0 -216
  103. package/docs/design/system/ugly-layouts.md +0 -119
  104. package/docs/diagram-families.md +0 -193
  105. package/docs/features.md +0 -147
  106. package/docs/fork-differences.md +0 -130
  107. package/docs/getting-started.md +0 -175
  108. package/docs/issue-derived-test-cases.md +0 -156
  109. package/docs/layout-characterization/README.md +0 -245
  110. package/docs/layout-characterization/contact-sheet-families.md +0 -496
  111. package/docs/layout-characterization/contact-sheet.md +0 -638
  112. package/docs/layout-characterization/properties.md +0 -281
  113. package/docs/layout-characterization/visual-quality.md +0 -160
  114. package/docs/layout-characterization/visual-snapshots/architecture.svg +0 -79
  115. package/docs/layout-characterization/visual-snapshots/class.svg +0 -60
  116. package/docs/layout-characterization/visual-snapshots/er.svg +0 -61
  117. package/docs/layout-characterization/visual-snapshots/flowchart.svg +0 -58
  118. package/docs/layout-characterization/visual-snapshots/gantt.svg +0 -52
  119. package/docs/layout-characterization/visual-snapshots/journey.svg +0 -118
  120. package/docs/layout-characterization/visual-snapshots/pie.svg +0 -36
  121. package/docs/layout-characterization/visual-snapshots/quadrant.svg +0 -47
  122. package/docs/layout-characterization/visual-snapshots/sequence.svg +0 -59
  123. package/docs/layout-characterization/visual-snapshots/state.svg +0 -52
  124. package/docs/layout-characterization/visual-snapshots/timeline.svg +0 -64
  125. package/docs/layout-characterization/visual-snapshots/xychart.svg +0 -97
  126. package/docs/mcp-code-mode-rationale.md +0 -101
  127. package/docs/mcp-http-transport.md +0 -223
  128. package/docs/mermaid-layout-complaints.md +0 -837
  129. package/docs/mutation-testing.md +0 -206
  130. package/docs/project/divergences.md +0 -98
  131. package/docs/project/dogfooding-docs-strategy.md +0 -66
  132. package/docs/project/hosted-mcp-cloudflare-plan.md +0 -338
  133. package/docs/project/lessons-learned.md +0 -1019
  134. package/docs/project/remove-role-styling-plan.md +0 -176
  135. package/docs/quality.md +0 -212
  136. package/docs/react.md +0 -97
  137. package/docs/style-authoring.md +0 -133
  138. package/docs/testing-strategy.md +0 -335
  139. package/docs/theming.md +0 -162
  140. package/examples/agent-improve-auth-flow.ts +0 -206
  141. package/examples/agent-loop.ts +0 -53
  142. package/examples/mcp-vs-cli-complex-diagrams.ts +0 -133
  143. package/llms.txt +0 -104
  144. package/skill-evals/README.md +0 -77
  145. package/skill-evals/fixtures/architecture-cache/input.mmd +0 -5
  146. package/skill-evals/fixtures/class-payment/input.mmd +0 -4
  147. package/skill-evals/fixtures/er-orders/input.mmd +0 -10
  148. package/skill-evals/fixtures/flowchart-cache/input.mmd +0 -3
  149. package/skill-evals/fixtures/gantt-release/input.mmd +0 -7
  150. package/skill-evals/fixtures/journey-checkout/input.mmd +0 -6
  151. package/skill-evals/fixtures/pie-exports/input.mmd +0 -5
  152. package/skill-evals/fixtures/quadrant-priorities/input.mmd +0 -11
  153. package/skill-evals/fixtures/sequence-retry/input.mmd +0 -8
  154. package/skill-evals/fixtures/state-lifecycle/input.mmd +0 -5
  155. package/skill-evals/fixtures/timeline-release/input.mmd +0 -6
  156. package/skill-evals/fixtures/xychart-growth/input.mmd +0 -5
  157. package/skill-evals/shared-benchmark.json +0 -510
  158. package/src/agent/analyze.ts +0 -157
  159. package/src/agent/apply.ts +0 -146
  160. package/src/agent/architecture-body.ts +0 -458
  161. package/src/agent/certificates.ts +0 -110
  162. package/src/agent/class-body.ts +0 -319
  163. package/src/agent/core.ts +0 -207
  164. package/src/agent/create.ts +0 -106
  165. package/src/agent/describe.ts +0 -364
  166. package/src/agent/er-body.ts +0 -224
  167. package/src/agent/facts.ts +0 -337
  168. package/src/agent/families-builtin.ts +0 -934
  169. package/src/agent/families.ts +0 -232
  170. package/src/agent/family-layouts.ts +0 -826
  171. package/src/agent/flowchart-body.ts +0 -372
  172. package/src/agent/flowchart-unsupported.ts +0 -243
  173. package/src/agent/gantt-body.ts +0 -495
  174. package/src/agent/index.ts +0 -10
  175. package/src/agent/journey-body.ts +0 -414
  176. package/src/agent/label-metrics.ts +0 -28
  177. package/src/agent/layout-to-rendered.ts +0 -63
  178. package/src/agent/mutate.ts +0 -97
  179. package/src/agent/mutation-ops.ts +0 -51
  180. package/src/agent/op-schema.ts +0 -439
  181. package/src/agent/parse.ts +0 -223
  182. package/src/agent/pie-body.ts +0 -270
  183. package/src/agent/png.ts +0 -117
  184. package/src/agent/quadrant-body.ts +0 -336
  185. package/src/agent/quality.ts +0 -363
  186. package/src/agent/readability-audit.ts +0 -92
  187. package/src/agent/rendered-route-audit.ts +0 -61
  188. package/src/agent/sequence-body.ts +0 -345
  189. package/src/agent/serialize.ts +0 -214
  190. package/src/agent/state-body.ts +0 -589
  191. package/src/agent/structural-count.ts +0 -150
  192. package/src/agent/timeline-body.ts +0 -280
  193. package/src/agent/trace-log.ts +0 -43
  194. package/src/agent/types.ts +0 -979
  195. package/src/agent/verify.ts +0 -571
  196. package/src/agent/xychart-body.ts +0 -472
  197. package/src/architecture/config.ts +0 -282
  198. package/src/architecture/layout.ts +0 -496
  199. package/src/architecture/parser.ts +0 -375
  200. package/src/architecture/renderer.ts +0 -611
  201. package/src/architecture/types.ts +0 -113
  202. package/src/ascii/ansi.ts +0 -423
  203. package/src/ascii/architecture.ts +0 -210
  204. package/src/ascii/canvas.ts +0 -443
  205. package/src/ascii/class-diagram.ts +0 -697
  206. package/src/ascii/converter.ts +0 -475
  207. package/src/ascii/draw.ts +0 -1693
  208. package/src/ascii/edge-bundling.ts +0 -328
  209. package/src/ascii/edge-routing.ts +0 -330
  210. package/src/ascii/er-diagram.ts +0 -439
  211. package/src/ascii/gantt.ts +0 -276
  212. package/src/ascii/grid.ts +0 -747
  213. package/src/ascii/index.ts +0 -196
  214. package/src/ascii/journey.ts +0 -189
  215. package/src/ascii/meta.ts +0 -244
  216. package/src/ascii/multiline-utils.ts +0 -80
  217. package/src/ascii/pathfinder.ts +0 -301
  218. package/src/ascii/pie.ts +0 -67
  219. package/src/ascii/quadrant.ts +0 -158
  220. package/src/ascii/reverse.ts +0 -216
  221. package/src/ascii/sequence.ts +0 -499
  222. package/src/ascii/shapes/circle.ts +0 -27
  223. package/src/ascii/shapes/corners.ts +0 -143
  224. package/src/ascii/shapes/diamond.ts +0 -27
  225. package/src/ascii/shapes/hexagon.ts +0 -27
  226. package/src/ascii/shapes/index.ts +0 -106
  227. package/src/ascii/shapes/rectangle.ts +0 -168
  228. package/src/ascii/shapes/rounded.ts +0 -27
  229. package/src/ascii/shapes/special.ts +0 -332
  230. package/src/ascii/shapes/stadium.ts +0 -110
  231. package/src/ascii/shapes/state.ts +0 -192
  232. package/src/ascii/shapes/types.ts +0 -73
  233. package/src/ascii/timeline.ts +0 -128
  234. package/src/ascii/types.ts +0 -312
  235. package/src/ascii/validate.ts +0 -120
  236. package/src/ascii/width.ts +0 -81
  237. package/src/ascii/xychart.ts +0 -919
  238. package/src/browser.ts +0 -29
  239. package/src/class/layout.ts +0 -240
  240. package/src/class/parser.ts +0 -332
  241. package/src/class/renderer.ts +0 -638
  242. package/src/class/types.ts +0 -129
  243. package/src/cli/agent-instructions.ts +0 -1
  244. package/src/cli/am-bin.ts +0 -6
  245. package/src/cli/exit-codes.ts +0 -18
  246. package/src/cli/index.ts +0 -1117
  247. package/src/cli/init-agent.ts +0 -147
  248. package/src/color-resolver.ts +0 -152
  249. package/src/elk-instance.ts +0 -114
  250. package/src/er/layout.ts +0 -187
  251. package/src/er/parser.ts +0 -226
  252. package/src/er/renderer.ts +0 -792
  253. package/src/er/types.ts +0 -99
  254. package/src/font-manifest.ts +0 -27
  255. package/src/gantt/layout.ts +0 -365
  256. package/src/gantt/parser.ts +0 -282
  257. package/src/gantt/pipeline.ts +0 -27
  258. package/src/gantt/renderer.ts +0 -414
  259. package/src/gantt/schedule.ts +0 -513
  260. package/src/gantt/types.ts +0 -255
  261. package/src/index.ts +0 -368
  262. package/src/journey/layout.ts +0 -520
  263. package/src/journey/parser.ts +0 -218
  264. package/src/journey/renderer.ts +0 -811
  265. package/src/journey/types.ts +0 -144
  266. package/src/layout/geometry.ts +0 -182
  267. package/src/layout/pass.ts +0 -142
  268. package/src/layout/passes/index.ts +0 -3916
  269. package/src/layout-engine.ts +0 -1565
  270. package/src/layout-rubric.ts +0 -659
  271. package/src/mcp/artifacts.ts +0 -137
  272. package/src/mcp/dynamic-harness.ts +0 -31
  273. package/src/mcp/dynamic-modules.d.ts +0 -7
  274. package/src/mcp/facade.ts +0 -608
  275. package/src/mcp/harness-runtime.ts +0 -203
  276. package/src/mcp/hosted-server.ts +0 -468
  277. package/src/mcp/mcp-bin.ts +0 -3
  278. package/src/mcp/mcp-cli.ts +0 -82
  279. package/src/mcp/protocol.ts +0 -13
  280. package/src/mcp/sandbox.ts +0 -195
  281. package/src/mcp/sdk-decl.ts +0 -387
  282. package/src/mcp/server.ts +0 -362
  283. package/src/mcp/tool-surface.ts +0 -146
  284. package/src/mermaid-source.ts +0 -655
  285. package/src/multiline-utils.ts +0 -228
  286. package/src/parser.ts +0 -1031
  287. package/src/pie/layout.ts +0 -168
  288. package/src/pie/parser.ts +0 -136
  289. package/src/pie/renderer.ts +0 -234
  290. package/src/pie/types.ts +0 -82
  291. package/src/quadrant/layout.ts +0 -191
  292. package/src/quadrant/parser.ts +0 -183
  293. package/src/quadrant/renderer.ts +0 -322
  294. package/src/quadrant/types.ts +0 -113
  295. package/src/render-family-hooks.ts +0 -244
  296. package/src/renderer.ts +0 -1099
  297. package/src/route-contracts.ts +0 -2723
  298. package/src/scene/backend.ts +0 -76
  299. package/src/scene/fidelity.ts +0 -183
  300. package/src/scene/hybrid-backend.ts +0 -174
  301. package/src/scene/ir.ts +0 -181
  302. package/src/scene/marks.ts +0 -127
  303. package/src/scene/rough-backend.ts +0 -378
  304. package/src/scene/seed.ts +0 -46
  305. package/src/scene/style-registry.ts +0 -556
  306. package/src/sequence/layout.ts +0 -456
  307. package/src/sequence/parser.ts +0 -255
  308. package/src/sequence/renderer.ts +0 -604
  309. package/src/sequence/types.ts +0 -154
  310. package/src/shape-clipping.ts +0 -351
  311. package/src/shared/accessibility-directives.ts +0 -22
  312. package/src/shared/batched.ts +0 -61
  313. package/src/shared/color-math.ts +0 -72
  314. package/src/shared/svg-a11y.ts +0 -29
  315. package/src/shared/syntax-error.ts +0 -17
  316. package/src/shared/unicode-ranges.ts +0 -135
  317. package/src/styles.ts +0 -318
  318. package/src/svg-paths.ts +0 -28
  319. package/src/text-metrics.ts +0 -248
  320. package/src/theme.ts +0 -639
  321. package/src/timeline/layout.ts +0 -381
  322. package/src/timeline/parser.ts +0 -215
  323. package/src/timeline/renderer.ts +0 -538
  324. package/src/timeline/types.ts +0 -105
  325. package/src/types.ts +0 -454
  326. package/src/website-worker-modules.d.ts +0 -18
  327. package/src/xychart/axis-utils.ts +0 -109
  328. package/src/xychart/colors.ts +0 -124
  329. package/src/xychart/config.ts +0 -88
  330. package/src/xychart/layout.ts +0 -656
  331. package/src/xychart/parser.ts +0 -504
  332. package/src/xychart/renderer.ts +0 -640
  333. package/src/xychart/types.ts +0 -282
@@ -1,52 +0,0 @@
1
- # Source preservation ladder
2
-
3
- Status: implemented as the Agentic Mermaid family-adoption contract.
4
-
5
- Agentic Mermaid edits source, not just pictures. Every family must declare how
6
- much source it can model and what happens when it encounters syntax outside the
7
- modeled subset. Silent loss is never an acceptable level.
8
-
9
- ## Levels
10
-
11
- | Level | Name | Contract |
12
- |---|---|---|
13
- | L0 | reject/fail loud | The construct is not safely renderable/editable. Parsing or verification returns a named error/warning; no partial IR is serialized as if it were complete. |
14
- | L1 | whole-body opaque | The family header is recognized, but the body is preserved byte-for-byte as opaque source. Typed narrowers return `null`; render/verify may use a safe legacy/family parser. |
15
- | L2 | segment-preserving mixed body | Modeled statements are typed-editable; unmodeled blocks/directives/comments remain in ordered opaque segments and serialize without silent loss. |
16
- | L3 | canonical structured body | Accepted body syntax is modeled; parse → serialize → parse is stable. Unsupported syntax falls back to L1/L2 or fails loud. |
17
- | L4 | traceable structured model | L3 plus stable source spans, rendered regions, and action/analysis sidecars for load-bearing semantic objects. |
18
-
19
- ## Construct policy
20
-
21
- | Construct class | Required behavior |
22
- |---|---|
23
- | Frontmatter / init directives / leading comments | Preserved in `meta.wrapperSource` and re-emitted verbatim by default; canonical wrapper synthesis is opt-in. |
24
- | In-body comments | Preserved by opaque bodies; structured bodies must either preserve them or report `COMMENT_DROPPED`. |
25
- | Unknown family syntax | Use L1 opaque preservation when rendering remains safe; otherwise L0 named failure. |
26
- | Mermaid v11 `@{ ... }` metadata | Must not create phantom nodes or silently drop targets. Current safety floor preserves opaque/unsupported forms and consumes supported label metadata conservatively. Full typed-shape vocabulary remains separate (#44). |
27
- | Actions/clicks | Never execute during parse/render/analysis. Preserve source intent and expose source-only metadata where modeled. |
28
- | Render regions | Stable IDs are required for L4 claims; V1 region coverage may be partial but must be documented and tested. |
29
-
30
- ## Current family levels
31
-
32
- | Family | Body preservation level | L4 traceability status |
33
- |---|---|---|
34
- | flowchart | L3 for modeled graph syntax; L1 for unsupported syntax/metadata forms | Partial L4: nodes/edges/groups/labels/source map, route certs, action analysis, region MVP |
35
- | state | L3 structured body | Partial L4 via graph projection, source map, route certs, region MVP |
36
- | sequence | L2 segment-preserving structured body | Partial L4: participants/messages layout + lifeline certificates |
37
- | timeline | L3 structured body with opaque fallback | Partial L4: sections/periods/events layout regions/certs |
38
- | class | L3 structured body with opaque fallback | Partial L4: classes/members source map, geometry validators, orthogonal-box certs |
39
- | er | L3 structured body with opaque fallback | Partial L4: entities/attrs/cardinalities source map, geometry validators, orthogonal-box certs |
40
- | journey | L3 structured body with opaque fallback | Partial L4: sections/tasks regions/source map |
41
- | architecture | L3 structured body | Partial L4: groups/services/junctions/side-anchored certs |
42
- | xychart | L3 structured body with opaque fallback | Partial L4: plot/marks/labels source map + containment certs |
43
- | pie | L3 structured body with opaque fallback | Partial L4: slices/legend source map + containment certs |
44
- | quadrant | L3 structured body with opaque fallback | Partial L4: quadrants/points source map + containment certs |
45
- | gantt | L2/L3 structured body with schedule resolver and named schedule errors | Partial L4: sections/tasks source map, schedule analysis, containment certs |
46
-
47
- ## Reviewer rule
48
-
49
- A family may advance levels incrementally, but it may not regress silently. New
50
- syntax support must add one of: typed modeling, opaque preservation, or a named
51
- failure with docs/tests. Mutation APIs require L3 for the affected construct;
52
- agents must verify before serializing.
@@ -1,216 +0,0 @@
1
- # Styles: the composable look system — naming, model, and rollout plan
2
-
3
- Status: v2, largely executed on PR #60 — the engine, the consolidated
4
- `style` primitive, and the product surfaces (CLI `--style`/`--seed` +
5
- `am styles`, MCP style args + typed SDK declaration, editor style picker
6
- with seed re-roll, agent docs) have landed; steps below are annotated.
7
- Nothing has shipped to npm yet, so remaining decisions stay free.
8
-
9
- The engine work is done: every diagram family lowers to a SceneGraph of
10
- semantic marks, and pluggable backends serialize those marks — crisp (the
11
- unchanged default), rough.js sketch, and hybrid (pressure ribbons, washes).
12
-
13
- **The headline is what users and their agents can construct, not what we
14
- ship.** The built-in looks are proof and raw material: the original sketch
15
- set (hand-drawn, excalidraw, pen-and-ink, freehand, watercolor, blueprint,
16
- tufte) plus coverage expanders for accessibility, print, operations,
17
- physical media, architecture, and editorial/report figures. The product is
18
- a small set of primitives with one combination rule, from which looks we
19
- never anticipated can emerge.
20
-
21
- ---
22
-
23
- ## 1. One concept: style. A theme is a kind of style.
24
-
25
- The repo used to have three overlapping vocabularies: *themes* (the
26
- `THEMES` palette record + `themeVariables` + color options), early private
27
- role-face experiments, and the pre-consolidation *aesthetics*. Multiple words,
28
- shapes, and precedence stories answered one question: **how should this diagram look?**
29
-
30
- We collapse them into one primitive:
31
-
32
- > A **style** is a partial description of how diagrams look. Every field is
33
- > optional. A style that only sets colors is a palette. A style that sets
34
- > stroke character, fills, typography, and a palette is a full look.
35
-
36
- ```ts
37
- interface StyleSpec {
38
- // identity (optional — anonymous inline styles are fine)
39
- name?: string
40
- blurb?: string
41
-
42
- // palette — the seven tokens every mark references
43
- colors?: { bg?; fg?; line?; accent?; muted?; surface?; border? }
44
-
45
- // typography
46
- font?: string
47
-
48
- // mark treatment (what the sketch backends read)
49
- stroke?: 'crisp' | 'jittered' | 'freehand'
50
- fill?: 'none' | 'hachure' | 'solid' | 'wash'
51
- roughness?; bowing?; passes?; strokeWidth?; hachureAngle?; hachureGap?;
52
- fillWeight?; washOpacity?; washEdge?
53
- backdrop?: 'plain' | 'paper-ruled' | 'grid'
54
-
55
- // advisory metadata (documented, never read by the engine)
56
- intent?: 'premium' | 'draft' | 'lofi'
57
- mono?: boolean
58
- }
59
- ```
60
-
61
- So the answer to "what is the right relationship between styles and themes"
62
- is: **subsumption, not orthogonality**. A theme is a palette-only style.
63
- The existing `THEMES` entries register into the style registry at startup
64
- (their names keep working everywhere a style name is accepted), and
65
- `themeVariables`/color options remain as the *last* override layer for
66
- Mermaid compatibility. One registry, one lookup (`getStyle`), one list
67
- (`knownStyles`) — and the docs answer the theme question in a sentence
68
- instead of a precedence table.
69
-
70
- ## 2. One combination rule: the stack
71
-
72
- The public option takes a name, a spec, or a **stack** of them:
73
-
74
- ```ts
75
- interface RenderOptions {
76
- style?: StyleInput | StyleInput[] // StyleInput = string | StyleSpec
77
- seed?: number // re-rolls ink wobble, never layout
78
- }
79
-
80
- // a full look
81
- renderMermaidSVG(src, { style: 'hand-drawn' })
82
-
83
- // hand-drawn geometry × dracula palette — "any style × any theme" is just stacking
84
- renderMermaidSVG(src, { style: ['hand-drawn', 'dracula'] })
85
-
86
- // stack a shared brand fragment and a local tweak on top
87
- renderMermaidSVG(src, { style: ['hand-drawn', acmeBrand, { colors: { accent: '#e11d48' } }] })
88
- ```
89
-
90
- Merging is left→right, per field — the CSS intuition everyone already has.
91
- The full precedence story becomes one line:
92
-
93
- ```
94
- defaults < style stack (left → right) < themeVariables < explicit color options
95
- ```
96
-
97
- This one rule replaces separate theme/style/variant parameters. It is also the
98
- agent-native shape: an agent composes a look by concatenating fragments it
99
- was given, retrieved, or wrote itself.
100
-
101
- ## 3. Simplifications this unlocks (missed in plan v1)
102
-
103
- 1. **No `backend` field for authors.** Which backend a style needs is
104
- derivable from what it asks for: `stroke: 'freehand'` or `fill: 'wash'`
105
- ⇒ hybrid; any rough parameter or `stroke: 'jittered'` ⇒ rough; otherwise
106
- ⇒ default. Authors describe the *look*; the engine picks the machinery.
107
- (An explicit `backend` override remains for code-backed extensions, but
108
- it disappears from the tutorial path.)
109
- 2. **No aesthetic/style/theme triage.** One word in the API, the CLI, the
110
- MCP schema, the docs. `THEMES` stays exported for compatibility of
111
- in-repo code but is defined *as* registered palette-only styles.
112
- 3. **No compatibility shims anywhere** — pre-release, the in-repo callers
113
- of the old option just update.
114
- 4. **`intent`/`mono` demote to advisory metadata.** The engine never
115
- branches on them; they exist for pickers, galleries, and the authoring
116
- rubric. (The mono *contract* stays a test on built-ins, not an engine
117
- switch.)
118
- 5. **One registry, one gallery.** `knownStyles()` drives the CLI list, the
119
- editor picker, and the poster harness — registering a style is the only
120
- step to appear in all three.
121
- 6. **Fragments are the sharing unit.** A JSON file with three fields is a
122
- complete, valid, shareable style. Packs are just arrays of named
123
- fragments — no schemaVersion ceremony until a real need appears.
124
-
125
- ## 4. Designed for emergence
126
-
127
- Following the "design for emergence" argument (UX Mag): when user needs are
128
- heterogeneous and unpredictable — and custom looks are exactly that — ship
129
- simple elements and combination rules, not finished solutions; keep the
130
- floor low, the ceiling high, and the walls wide.
131
-
132
- - **Low floor**: `style: 'hand-drawn'` — one string.
133
- - **Wide walls**: fragments compose across axes we don't enumerate. A
134
- palette fragment × a line-character fragment × a typography fragment — we
135
- ship full looks, but the space users can reach is
136
- the product of every fragment anyone writes. Nobody designs "corporate
137
- memo hand-drawn dark"; it emerges from a stack.
138
- - **High ceiling**: `registerBackend` + the SceneGraph types for the rare
139
- code-backed capability (a new fill algorithm, a layout-aware dialect).
140
- Styles stay data; code is the escape hatch, not the path.
141
- - **Safety rails that make wild combinations viable**: the prototype WCAG
142
- contrast audit and text-halo policy showed the right contract. Production
143
- now has deterministic stacking and built-in looks that route structural
144
- ink through the active theme foreground; a full arbitrary-stack WCAG gate
145
- remains the missing guardrail.
146
- - **Reproducible sharing**: determinism means `(source, stack, seed)` is a
147
- complete, portable description of an image. A gist with a JSON fragment
148
- IS the artifact. This is the hashtag/spreadsheet property: the unit of
149
- user invention is trivially copyable.
150
- - **Agents as the emergence engine**: `docs/style-authoring.md` (spec
151
- template + quality rubric + worked good/bad examples) is linked from
152
- `llms.txt` and the agent instructions, so an agent can author a fragment
153
- from a sentence ("make it look like our brand deck"), render it, check
154
- contrast, and iterate — the loop that produced the 31-style prototype,
155
- now available to every user's agent.
156
- - **Deliberately not built** (over-specification kills emergence): no
157
- inheritance/`extends` graphs (stacking covers it), no per-diagram-family
158
- style hooks in v1, no marketplace/registry service — a JSON fragment in
159
- a repo is the distribution mechanism until the community proves a need.
160
-
161
- ## 5. npm package changes
162
-
163
- First release ships as `agentic-mermaid` **0.x minor** (crisp default
164
- byte-identical, corpus-gated):
165
-
166
- - **API**: `RenderOptions.style` (name | spec | stack), `RenderOptions.seed`,
167
- `registerStyle`, `getStyle`, `knownStyles`, `validateStyleSpec` (JSON
168
- schema included in the package), and for extensions `registerBackend`,
169
- `StyleBackend`, plus SceneGraph types (`SceneDoc`, `SceneNode`,
170
- `SemanticChannels`, `SceneRole`). `THEMES` remains, redefined as
171
- palette-only styles.
172
- - **Runtime dependencies**: `roughjs@4.6.6` and `perfect-freehand@1.2.3`,
173
- pinned exactly — seeded geometry must not shift under a bump; a bump is a
174
- golden-fixture change (`[approve-goldens]`). They are `dependencies`
175
- because the `bun` export condition resolves raw `src/*.ts`; the Node dist
176
- bundles them (~80 KB minified). A `agentic-mermaid/styles` subpath split
177
- is the escape hatch if crisp-only weight ever matters.
178
- - **Docs in the box**: README leads with the matrix image, a one-string
179
- quick start, and a *custom fragment stack* example; `docs/api.md` gets the
180
- option + precedence line; CHANGELOG states the model in three sentences.
181
- - **Deferred**: styled PNG parity (blocked on bundling the OFL faces as
182
- reviewed production assets — notices already exist); CLI/MCP surfaces
183
- land in the rollout below.
184
-
185
- ## 6. Rollout, emergence-first
186
-
187
- 1. **Collapse the primitives**: rename `aesthetic` → `style`; make all
188
- `StyleSpec` fields optional; implement the stack merge; register `THEMES`
189
- as styles; infer backends. (Everything else builds on the final shape.)
190
- *Status: DONE — resolveStyleStack / inferBackend / validateStyleSpec in
191
- src/scene/style-registry.ts; RenderOptions.style is the union; public
192
- role-key objects were removed before launch.*
193
- 2. **Agent surface**: MCP render tool + SDK declaration accept `style`
194
- (name | spec | stack) and `seed`; authoring guide linked for agents.
195
- 3. **CLI**: `am render --style <name|file.json>` (repeatable = stack),
196
- `--seed`, `am styles [--json]`; PNG threading with an explicit
197
- font-fallback warning.
198
- 4. **Editor**: style picker and palette picker for built-in looks; `seed` stays
199
- an API/CLI/share-link field rather than a persistent topbar control.
200
- 5. **README + gallery** generated from the registry.
201
- 6. **Fonts for PNG parity** (OFL faces as reviewed assets).
202
-
203
- ## 7. How we explain it
204
-
205
- - One sentence: *"A style is a small data record describing how diagrams
206
- look; stack styles to combine them — a color-only style is a theme."*
207
- - Crisp stays the default, stated with receipts (corpus-verified byte
208
- identity), and styling covers **all 12 diagram types uniformly**.
209
- - Three promises for the supported path: **readable** built-in stacks
210
- (halos, theme-friendly structural ink, and generated evidence),
211
- **deterministic** (`seed` shuffles ink, never layout — cacheable,
212
- diffable, golden-testable), **portable** (a JSON fragment + seed
213
- reproduces the image anywhere). A full WCAG gate for arbitrary user
214
- fragments is still a follow-up.
215
- - The README example is a custom fragment stack, not a built-in name —
216
- the message *is* the primary value.
@@ -1,119 +0,0 @@
1
- # What Makes a Layout Ugly
2
-
3
- This document states the working definition of an *ugly* diagram layout that
4
- this project has converged on, and maps each defect to a detector. It is the
5
- specification for `eval/ugly-detector/` (which audits **rendered** output —
6
- SVG, PNG, ASCII — not just the internal geometry the rubric checks).
7
-
8
- ## The one-line definition
9
-
10
- > **A layout is ugly when an edge's geometry isn't forced by the node
11
- > positions** — when it bends, floats, splays, crosses, or breaks symmetry in
12
- > a way a clearer alternative would avoid for the *same* layout. Every bend,
13
- > offset, and asymmetry should be the cheapest one the node positions allow,
14
- > or it shouldn't be there. Ugliness is **unexplained geometry**.
15
-
16
- ## The defects (and how we detect them)
17
-
18
- Grouped by the layer they live in. The first group are **hard** — they must
19
- never appear in a finished render. The second are **soft** — present in good
20
- layouts only when forced, and ranked below.
21
-
22
- ### Hard defects (a finished render must have zero)
23
-
24
- | Defect | What it looks like | Detector |
25
- |---|---|---|
26
- | **Diagonal segment** | an edge segment that is neither horizontal nor vertical, in an orthogonal drawing | segment with `|dx| > ε` AND `|dy| > ε` |
27
- | **Edge through a node** | an edge crossing a node's interior (occlusion) | segment intersects a non-endpoint node's body deeper than stroke width |
28
- | **Floating endpoint** | an edge ending at an arbitrary point on the outline, not a designated connection point | endpoint not within tolerance of the shape's outline / a designated port |
29
- | **Node overlap** | two node bodies overlapping | bbox/footprint intersection |
30
- | **Hitch / dogleg** | a short perpendicular jog on a run whose lane is clear | a segment much shorter than its collinear neighbours, perpendicular, with a clear straight alternative |
31
- | **Label off its route** | a label pill sitting away from the edge it names | label centroid far from its edge's polyline |
32
-
33
- ### Soft ranking (good layouts minimize these, in this priority order)
34
-
35
- The operative priority, distilled from Purchase 1997/2002 and Ware 2002 and
36
- from the choices made across this project:
37
-
38
- 1. **Straightness / continuity** — fewest bends; a multi-edge path reads as a
39
- line. (Beats everything below.)
40
- 2. **Designated-port attachment** — endpoints sit on a *named*, deterministic
41
- connection point, not a target-determined float. **Subtlety we encode:**
42
- straightness normally beats port-exactness (the strict-ports experiment was
43
- measured and rejected), *except* when a designated port is reachable
44
- **without costing a bend** — then take it. The diamond 8-port model exists
45
- precisely to make E/F/G/K port-exact *and* straight/symmetric at once.
46
- 3. **Symmetry / balance** — where the structure is symmetric (peer fan-ins,
47
- reciprocal pairs), the drawing should be too: a centered hub, two equal
48
- parallel lines, no peer privileged over another.
49
- 4. **Fewest bends and crossings** — after the above.
50
-
51
- ### Specific ugly shapes we have named
52
-
53
- - **Cramming at a sharp point** — two lines crowded onto a vertex when they
54
- could be spread (the ±6 reciprocal-on-a-diamond-tip, before facet-mids).
55
- - **Pinch-then-splay / hourglass** — edges converging to a narrow pair of ports
56
- then fanning back out to wider targets (the rejected F facet-mid+bend).
57
- - **A line through a shape's body** — routing the short way *through* a node
58
- instead of around it (the rejected G facet-mid prototype).
59
- - **Asymmetry where symmetry is natural** — a fan-in hub stuck at the top of
60
- its sources, or a reciprocal pair of unequal lengths.
61
-
62
- ## Why detect from rendered output (not just geometry)
63
-
64
- The `assessLayout` rubric (`src/layout-rubric.ts`) checks the **internal
65
- geometry** (`PositionedGraph`). The ugly-detector checks the **rendered
66
- artifact** — the SVG/PNG/ASCII a consumer actually sees — so it:
67
-
68
- 1. catches rendering bugs where clean geometry renders wrong;
69
- 2. works on *any* diagram, including external SVGs and golden fixtures not
70
- produced by our layout pass;
71
- 3. validates the ASCII pipeline, which is a separate renderer that never sees
72
- the `RouteCertificate` contracts.
73
-
74
- The three formats degrade in fidelity: **SVG** is the authoritative analysis
75
- (vector paths + shape geometry are recoverable exactly); **PNG** is a faithful
76
- raster of an SVG, so its check is "analyze the source SVG, plus a coarse
77
- pixel-orthogonality sanity pass"; **ASCII** is a glyph grid, so detection is
78
- limited to what the grid reveals (diagonal line glyphs, edge glyphs inside a
79
- box interior).
80
-
81
- ## Running the audit
82
-
83
- ```
84
- bun run audit:ugly # render every corpus to SVG/PNG/ASCII, report
85
- bun run audit:ugly -- --verbose # also list soft findings
86
- bun run audit:ugly -- --json # machine-readable report
87
- ```
88
-
89
- The runner (`eval/ugly-detector/audit.ts`) renders every diagram corpus in the
90
- project — the contact-sheet scenarios, the heuristic-tracker examples, the
91
- site samples, the layout-compare fixtures, and the ASCII/Unicode golden
92
- fixture sources — to all three formats and runs the detectors. It exits
93
- non-zero if any **hard** finding is present, so it doubles as a CI gate.
94
- `src/__tests__/ugly-detector.test.ts` pins the detector's behavior.
95
-
96
- ### What the audit found (2026-06)
97
-
98
- Current result on PR #30 after the nested-subgraph route fixes:
99
-
100
- ```text
101
- 338 diagrams / 1009 format-audits
102
- 0 hard layout defects
103
- 0 soft layout findings
104
- 6 render/corpus errors
105
- ```
106
-
107
- The non-clean entries are **render errors** (a diagram type or config header a
108
- given renderer rejects), not layout defects, and are bucketed as such.
109
-
110
- Historical note: an earlier audit found one real hard defect — a
111
- cross-hierarchy edge into a nested subgraph missing the containing subgraph's
112
- offset. That is now fixed by hosting cross-hierarchy edges at their lowest
113
- common compound and by treating subgraph IDs as container endpoints; the
114
- regressions live in `src/__tests__/subgraph-direction.test.ts`.
115
-
116
- Two findings the audit initially raised were **detector** false positives, now
117
- fixed and regression-tested: a cylinder's footprint must union its cap ellipses
118
- (not just the body rect), and a sub-pixel endpoint jog within the curved-shape
119
- clip floor (~1.5px) is not a visible dogleg.
@@ -1,193 +0,0 @@
1
- # Diagram families
2
-
3
- Agentic Mermaid supports Mermaid's common diagram families through a split pipeline: parse source, layout typed structures, render SVG/PNG/ASCII, and verify structural warnings.
4
-
5
- ## Capability matrix
6
-
7
- | Family | Header(s) | Render | Structured mutation | Notes |
8
- |---|---|---|---|---|
9
- | Flowchart | `flowchart`, `graph` | SVG/PNG/ASCII | ✓ | 6 graph ops; narrow with `asFlowchart`. |
10
- | State | `stateDiagram-v2` | SVG/PNG/ASCII | ✓ | Dedicated `StateBody` (BUILD-19): narrow with `asState`, 8 state-shaped ops. `asFlowchart` returns null. |
11
- | Sequence | `sequenceDiagram` | SVG/PNG/ASCII | structured (5 ops) | Notes/alt/loop bodies are segment-preserving; un-segmentable syntax falls back to opaque. |
12
- | Timeline | `timeline` | SVG/PNG/ASCII | ✓ | Supports sections, periods, events, title changes. |
13
- | Class | `classDiagram` | SVG/PNG/ASCII | ✓ | Classes, members, relations, notes. |
14
- | ER | `erDiagram` | SVG/PNG/ASCII | ✓ | Entities, attributes, relations. |
15
- | Journey | `journey` | SVG/PNG/ASCII | structured (10 ops) | `asJourney` narrows documented Journey syntax: title, accTitle/accDescr, sections, scored tasks, and actors. |
16
- | XY chart | `xychart`, `xychart-beta` | SVG/PNG/ASCII | structured (8 ops) | Vertical/horizontal bar/line/mixed charts; modeled subset is structurally mutable via `asXyChart`. |
17
- | Pie | `pie` | SVG/PNG/ASCII | structured (7 ops) | `asPie` narrows title/showData/slices; malformed entries and accTitle/accDescr stay opaque. |
18
- | Quadrant | `quadrantChart` | SVG/PNG/ASCII | structured (7 ops) | `asQuadrant` narrows title/axes/quadrant labels/points; styling and out-of-range coords stay opaque. |
19
- | Architecture | `architecture-beta` | SVG/PNG/ASCII | structured (10 ops) | `asArchitecture` narrows the modeled subset (groups/services/junctions/edges); the `{group}` boundary modifier and accTitle/accDescr stay opaque. |
20
- | Gantt | `gantt` | SVG/PNG/ASCII | structured (9 ops) | `asGantt` narrows title/sections/tasks; calendar directives, `click` lines, and comments ride along verbatim as opaque segments. Deterministic: the today marker draws only from a caller-supplied `ganttToday`. See [design/families/gantt.md](./design/families/gantt.md). |
21
-
22
- Opaque fallback does not mean unsupported: those bodies parse, render, verify, and round-trip losslessly, but agents should edit preserved source deliberately instead of calling `mutate`.
23
-
24
- ## Flowchart
25
-
26
- ```mermaid
27
- flowchart TD
28
- API --> DB
29
- API --> Cache
30
- ```
31
-
32
- Structured ops include node and edge add/remove/rename/set-label operations. Use `asFlowchart(parsed.value)` before mutation.
33
-
34
- ## State
35
-
36
- ```mermaid
37
- stateDiagram-v2
38
- [*] --> Idle
39
- Idle --> Running
40
- ```
41
-
42
- State diagrams own a dedicated `StateBody` (BUILD-19): narrow with `asState` and apply the 8 typed ops (`add_state`, `remove_state`, `rename_state`, `set_state_label`, `add_transition`, `remove_transition`, `set_transition_label`, `make_composite`). The modeled subset is simple states, transitions, `[*]` start/end pseudostates, nestable composite blocks, and `direction`. Anything outside it — `<<fork>>`/`<<choice>>`/`<<join>>`, history states, concurrency `--`, notes, `classDef`/`class`/`:::` styling — falls back to a lossless opaque body and stays source-level. Verify still runs the full Tier 1 + Tier 2 geometric path by projecting the body to a graph.
43
-
44
- ## Sequence
45
-
46
- ```mermaid
47
- sequenceDiagram
48
- participant User
49
- participant API
50
- User->>API: Login
51
- API-->>User: Session
52
- ```
53
-
54
- Simple participants/messages are structured. Rich Mermaid sequence blocks such as notes, `alt`, `loop`, and activation syntax are preserved as opaque source when not modeled.
55
-
56
- ## Timeline
57
-
58
- ```mermaid
59
- timeline
60
- title Release plan
61
- section Build
62
- Parser : complete
63
- Renderer : polish
64
- ```
65
-
66
- Structured ops cover title, section, period, and event changes.
67
-
68
- ## Class
69
-
70
- ```mermaid
71
- classDiagram
72
- class User {
73
- +string id
74
- +login()
75
- }
76
- User --> Session
77
- ```
78
-
79
- Structured ops cover classes, members, relations, notes, and renames.
80
-
81
- ## ER
82
-
83
- ```mermaid
84
- erDiagram
85
- CUSTOMER ||--o{ ORDER : places
86
- ORDER ||--|{ LINE_ITEM : contains
87
- ```
88
-
89
- Structured ops cover entities, attributes, relation add/remove, and renames.
90
-
91
- ## Journey
92
-
93
- ```mermaid
94
- journey
95
- title Checkout
96
- section Cart
97
- Add item: 5: Customer
98
- Pay: 3: Customer, Gateway
99
- ```
100
-
101
- Journey diagrams narrow via `asJourney` and expose 10 structured ops (sections, tasks, scores, actors). Documented Mermaid accessibility directives (`accTitle`, inline `accDescr`, and block `accDescr { ... }`) stay structured and round-trip through canonical serialization. Malformed or unknown Journey syntax falls back to a lossless opaque body.
102
-
103
- SVG rendering uses Mermaid's left-to-right Journey metaphor rather than the older Agentic card layout: sections span task columns, actors appear in a left legend, per-task actor dots show participation, and scores map to sentiment markers on a progression baseline. Mermaid `journey` config fields for actor colors, section fills/text colors, task/title fonts, task spacing, and actor label width are honored. Agentic Mermaid `style` and palette colors also reach Journey-specific surfaces such as section spans, actor dots, score markers, and the baseline.
104
-
105
- ## XY chart
106
-
107
- ```mermaid
108
- xychart-beta
109
- title "Latency"
110
- x-axis [p50, p95, p99]
111
- y-axis "ms" 0 --> 500
112
- line [50, 180, 420]
113
- ```
114
-
115
- The modeled subset (bare title, named/categorical/range axes, bar/line series with finite values) is structurally mutable: narrow with `asXyChart` and apply the 8 typed ops (`set_title`, `set_x_axis`, `set_y_axis`, `add_series`, `remove_series`, `set_series_values`, `set_series_name`, `reorder_series`). Quoted text, multi-statement `;` lines, and accTitle/accDescr fall back to opaque and stay source-level. See [`design/families/xychart.md`](./design/families/xychart.md) for compatibility details and layout notes.
116
-
117
- ## Pie
118
-
119
- ```mermaid
120
- pie showData
121
- title Pets adopted by volunteers
122
- "Dogs" : 386
123
- "Cats" : 85
124
- "Rats" : 15
125
- ```
126
-
127
- Pie charts accept the `pie` header with optional `showData`, an optional `title`, and `"label" : value` entries with positive numeric values. Slices render clockwise in source order. `showData` adds the raw value beside each legend label; the legend always shows the computed percentage. Malformed entries (negative/zero values, missing colon, unquoted labels) fall back to a lossless opaque body — never silently dropped — and the renderer still surfaces the loud error at render time. The ASCII renderer draws a proportional bar list. Pie is structured-when-narrowed: `asPie` exposes 7 ops (`set_title`, `set_show_data`, `add_slice`, `remove_slice`, `rename_slice`, `set_slice_value`, `reorder_slice`); slices are addressed by their unique label.
128
-
129
- ## Quadrant
130
-
131
- ```mermaid
132
- quadrantChart
133
- title Reach and engagement of campaigns
134
- x-axis Low Reach --> High Reach
135
- y-axis Low Engagement --> High Engagement
136
- quadrant-1 We should expand
137
- quadrant-2 Need to promote
138
- quadrant-3 Re-evaluate
139
- quadrant-4 May be improved
140
- Campaign A: [0.3, 0.6]
141
- Campaign B: [0.45, 0.23]
142
- ```
143
-
144
- Quadrant charts accept the `quadrantChart` header, an optional `title`, `x-axis <left> --> <right>` and `y-axis <bottom> --> <top>` axis labels (the far side is optional), four `quadrant-1..quadrant-4 <label>` region labels, and `<Label>: [x, y]` points with coordinates in `[0, 1]`. Quadrant numbering follows Mermaid core: **1 = top-right, 2 = top-left, 3 = bottom-left, 4 = bottom-right**. The SVG renderer draws a square plot split into four theme-tinted quadrants with the points as circles; the ASCII renderer draws a bordered grid with a coordinate legend. Official point style metadata (`radius`, `color`, `stroke-color`, `stroke-width`) and `classDef` lines are accepted for render compatibility but are not modeled for typed mutation; the agent path preserves those charts as opaque source and emits `UNSUPPORTED_SYNTAX` as an advisory warning. Malformed lines — out-of-range/non-numeric coordinates, missing brackets, duplicate point labels, and unknown point style metadata — fall back to a lossless opaque body, never silently dropped, and the renderer still surfaces the loud error at render time. Quadrant is structured-when-narrowed: `asQuadrant` exposes 7 ops (`set_title`, `set_axis_labels`, `set_quadrant_label`, `add_point`, `remove_point`, `move_point`, `rename_point`); points are addressed by their unique label and coordinates stay in `[0, 1]`.
145
-
146
- ## Gantt
147
-
148
- ```mermaid
149
- gantt
150
- title A Gantt Diagram
151
- dateFormat YYYY-MM-DD
152
- excludes weekends
153
- section Section
154
- A task :a1, 2014-01-01, 30d
155
- Another task :after a1, 20d
156
- section Another
157
- Task in Another :2014-01-12, 12d
158
- another task :24d
159
- ```
160
-
161
- Gantt charts accept the `gantt` header, `title`, calendar directives (`dateFormat`, `axisFormat`, `tickInterval`, `inclusiveEndDates`, `topAxis`, multiple `excludes`/`includes` lines, `weekend friday|saturday`, `weekday <day>`, `todayMarker`), `section` lines, and task lines `Label :[tags,] [id,] [start,] end` where tags are `active`/`done`/`crit`/`milestone`/`vert`, start is a date or `after id…`, and end is a date, a duration token (`ms s m h d w M y`, decimals allowed), or `until id…`. Dependencies resolve in a pure scheduler ([design/families/gantt.md](./design/families/gantt.md)): `after` starts at the latest referenced end, `until` ends at the earliest referenced start, working durations extend over excluded days, `includes` overrides `excludes`, and dependency cycles / unknown references / invalid dates are named structured errors (`GANTT_*`), never wall-clock fallbacks. Rendering is deterministic: the `todayMarker` draws only when the caller passes `ganttToday` (a date in the diagram's `dateFormat`), and `todayMarker off` always wins. `displayMode: compact` (frontmatter or `config.gantt`) packs non-overlapping tasks of a section into shared rows; `vert` markers draw a full-height line without consuming a task row. `click … href` is sanitized under strict security and `click … call` is parsed but never executed. Gantt is structured-when-narrowed AND segment-preserving: `asGantt` exposes 9 ops (`set_title`, `add_section`, `rename_section`, `remove_section`, `add_task`, `remove_task`, `rename_task`, `set_task_status`, `set_task_dates`) on title/sections/tasks while calendar directives, click lines, and comments ride along verbatim as opaque segments; duplicate task ids or an unclosed `accDescr` block fall back to a lossless whole-opaque body.
162
-
163
- ## Architecture
164
-
165
- ```mermaid
166
- architecture-beta
167
- group api(cloud)[API]
168
- service web(server)[Web] in api
169
- service db(database)[DB]
170
- web:R --> L:db
171
- ```
172
-
173
- See [`design/families/architecture-beta.md`](./design/families/architecture-beta.md) for parser/layout/render notes.
174
-
175
- ## Output formats
176
-
177
- All families use the same public output paths:
178
-
179
- ```ts
180
- import { renderMermaidSVG, renderMermaidPNG, renderMermaidASCII } from 'agentic-mermaid/agent'
181
-
182
- const svg = renderMermaidSVG(source, { security: 'strict' })
183
- const png = renderMermaidPNG(source, { fitTo: { width: 1200 }, background: '#fff' })
184
- const text = renderMermaidASCII(source)
185
- ```
186
-
187
- CLI equivalents:
188
-
189
- ```bash
190
- am render diagram.mmd --format svg > diagram.svg
191
- am render diagram.mmd --format png --output diagram.png
192
- am render diagram.mmd --format ascii > diagram.txt
193
- ```