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.
- package/CHANGELOG.md +149 -4
- package/LICENSES/Apache-2.0.txt +202 -0
- package/README.md +25 -32
- package/THIRD_PARTY_NOTICES.md +29 -0
- package/assets/fonts/FONT-LICENSES.md +9 -5
- package/assets/fonts/Inter-Bold.ttf +0 -0
- package/assets/fonts/Inter-Medium.ttf +0 -0
- package/assets/fonts/Inter-Regular.ttf +0 -0
- package/assets/fonts/Inter-SemiBold.ttf +0 -0
- package/dist/agent-core.d.ts +463 -0
- package/dist/agent-core.js +397 -0
- package/dist/agent.d.ts +81 -1822
- package/dist/agent.js +336 -36839
- package/dist/agentic-mermaid-mcp.js +7 -37908
- package/dist/am.js +33638 -36261
- package/dist/chunk-4QECACIA.js +4702 -0
- package/dist/chunk-CDPKJ2BQ.js +37 -0
- package/dist/chunk-QKDLMOJJ.js +3487 -0
- package/dist/chunk-WI35L7IR.js +615 -0
- package/dist/chunk-WN3YDOBG.js +149 -0
- package/dist/chunk-ZYMMKQ3I.js +62637 -0
- package/dist/index-D54dqSdC.d.ts +6777 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +310 -32836
- package/dist/mcp-cli-SBQSTJFC.js +17 -0
- package/docs/README.md +14 -6
- package/docs/schemas/style-spec.schema.json +1221 -30
- package/examples/styles/catalog.json +54 -0
- package/examples/styles/cloudflare-workers-inspired-prototype.mmd +9 -0
- package/examples/styles/cloudflare-workers-inspired-prototype.style.json +110 -0
- package/examples/styles/cupertino-prototype.mmd +10 -0
- package/examples/styles/cupertino-prototype.style.json +63 -0
- package/examples/styles/mid-century-report.style.json +2 -2
- package/examples/styles/star-chart-atlas.style.json +2 -1
- package/examples/styles/transit-route-map.style.json +2 -2
- package/examples/styles/vercel-inspired-prototype.mmd +6 -0
- package/examples/styles/vercel-inspired-prototype.style.json +87 -0
- package/package.json +70 -43
- package/server.json +41 -0
- package/skills/agentic-mermaid-diagram-workflow/SKILL.md +17 -36
- package/skills/agentic-mermaid-diagram-workflow/references/cli.md +4 -5
- package/skills/agentic-mermaid-diagram-workflow/references/code-mode.md +15 -31
- package/skills/agentic-mermaid-diagram-workflow/references/sequence.md +10 -14
- package/skills/agentic-mermaid-live-editor/SKILL.md +100 -206
- package/AGENT_NATIVE.md +0 -602
- package/Instructions_for_agents.md +0 -83
- package/TODO.md +0 -662
- package/assets/hero.png +0 -0
- package/dist/index-x2Cj1dVv.d.ts +0 -1089
- package/docs/agent-api-cookbook.md +0 -308
- package/docs/agent-mutation-policy.md +0 -104
- package/docs/agent-workflow-examples.md +0 -46
- package/docs/api.md +0 -203
- package/docs/ascii.md +0 -103
- package/docs/assets/improvements/box-start-connector.png +0 -0
- package/docs/assets/improvements/comment-dropped-lint.png +0 -0
- package/docs/assets/improvements/er-content-loss.png +0 -0
- package/docs/assets/improvements/fan-in-trunks.png +0 -0
- package/docs/assets/improvements/gantt-family.png +0 -0
- package/docs/assets/improvements/gantt-milestone-clamp.png +0 -0
- package/docs/assets/improvements/gantt-verify-seam.png +0 -0
- package/docs/assets/improvements/subgraph-container-edges.png +0 -0
- package/docs/assets/improvements/wrapper-frontmatter.png +0 -0
- package/docs/assets/improvements/wrapper-init-directive.png +0 -0
- package/docs/assets/improvements/wrapper-leading-comment.png +0 -0
- package/docs/assets/style-cookbook/mid-century-report.png +0 -0
- package/docs/assets/style-cookbook/star-chart-atlas.png +0 -0
- package/docs/assets/style-cookbook/transit-route-map.png +0 -0
- package/docs/comparison.md +0 -94
- package/docs/config.md +0 -105
- package/docs/contributing/adding-diagram-types.md +0 -144
- package/docs/contributing/diagram-family-citizenship.matrix.json +0 -2127
- package/docs/contributing/diagram-family-citizenship.md +0 -82
- package/docs/contributing/harvesting-upstream-tests.md +0 -126
- package/docs/contributing/lessons-learned.md +0 -276
- package/docs/contributing/releasing.md +0 -71
- package/docs/contributing/visual-review-evidence.md +0 -53
- package/docs/custom-style-cookbook.md +0 -154
- package/docs/design/families/README.md +0 -26
- package/docs/design/families/architecture-beta.md +0 -48
- package/docs/design/families/flowchart-parser-conformance.md +0 -22
- package/docs/design/families/gantt-research.md +0 -137
- package/docs/design/families/gantt.md +0 -329
- package/docs/design/families/journey-agentic-cards-before.png +0 -0
- package/docs/design/families/journey-mermaid-classic-implementation.png +0 -0
- package/docs/design/families/journey-mermaid-classic-prototype.png +0 -0
- package/docs/design/families/journey-mermaid-classic-prototype.svg +0 -163
- package/docs/design/families/journey-mermaid-classic-prototype.svg.png +0 -0
- package/docs/design/families/journey-migration-parity.md +0 -433
- package/docs/design/families/journey-usage-research.md +0 -423
- package/docs/design/families/journey.md +0 -125
- package/docs/design/families/xychart.md +0 -85
- package/docs/design/system/README.md +0 -45
- package/docs/design/system/abstraction-audit.md +0 -224
- package/docs/design/system/abstraction-recommendations.md +0 -655
- package/docs/design/system/architecture.mmd +0 -29
- package/docs/design/system/architecture.svg +0 -137
- package/docs/design/system/layout-guarantees-and-robustness.md +0 -351
- package/docs/design/system/layout-rubric.md +0 -138
- package/docs/design/system/route-contracts.md +0 -848
- package/docs/design/system/source-preservation-ladder.md +0 -52
- package/docs/design/system/styles-rollout.md +0 -216
- package/docs/design/system/ugly-layouts.md +0 -119
- package/docs/diagram-families.md +0 -193
- package/docs/features.md +0 -147
- package/docs/fork-differences.md +0 -130
- package/docs/getting-started.md +0 -175
- package/docs/issue-derived-test-cases.md +0 -156
- package/docs/layout-characterization/README.md +0 -245
- package/docs/layout-characterization/contact-sheet-families.md +0 -496
- package/docs/layout-characterization/contact-sheet.md +0 -638
- package/docs/layout-characterization/properties.md +0 -281
- package/docs/layout-characterization/visual-quality.md +0 -160
- package/docs/layout-characterization/visual-snapshots/architecture.svg +0 -79
- package/docs/layout-characterization/visual-snapshots/class.svg +0 -60
- package/docs/layout-characterization/visual-snapshots/er.svg +0 -61
- package/docs/layout-characterization/visual-snapshots/flowchart.svg +0 -58
- package/docs/layout-characterization/visual-snapshots/gantt.svg +0 -52
- package/docs/layout-characterization/visual-snapshots/journey.svg +0 -118
- package/docs/layout-characterization/visual-snapshots/pie.svg +0 -36
- package/docs/layout-characterization/visual-snapshots/quadrant.svg +0 -47
- package/docs/layout-characterization/visual-snapshots/sequence.svg +0 -59
- package/docs/layout-characterization/visual-snapshots/state.svg +0 -52
- package/docs/layout-characterization/visual-snapshots/timeline.svg +0 -64
- package/docs/layout-characterization/visual-snapshots/xychart.svg +0 -97
- package/docs/mcp-code-mode-rationale.md +0 -101
- package/docs/mcp-http-transport.md +0 -223
- package/docs/mermaid-layout-complaints.md +0 -837
- package/docs/mutation-testing.md +0 -206
- package/docs/project/divergences.md +0 -98
- package/docs/project/dogfooding-docs-strategy.md +0 -66
- package/docs/project/hosted-mcp-cloudflare-plan.md +0 -338
- package/docs/project/lessons-learned.md +0 -1019
- package/docs/project/remove-role-styling-plan.md +0 -176
- package/docs/quality.md +0 -212
- package/docs/react.md +0 -97
- package/docs/style-authoring.md +0 -133
- package/docs/testing-strategy.md +0 -335
- package/docs/theming.md +0 -162
- package/examples/agent-improve-auth-flow.ts +0 -206
- package/examples/agent-loop.ts +0 -53
- package/examples/mcp-vs-cli-complex-diagrams.ts +0 -133
- package/llms.txt +0 -104
- package/skill-evals/README.md +0 -77
- package/skill-evals/fixtures/architecture-cache/input.mmd +0 -5
- package/skill-evals/fixtures/class-payment/input.mmd +0 -4
- package/skill-evals/fixtures/er-orders/input.mmd +0 -10
- package/skill-evals/fixtures/flowchart-cache/input.mmd +0 -3
- package/skill-evals/fixtures/gantt-release/input.mmd +0 -7
- package/skill-evals/fixtures/journey-checkout/input.mmd +0 -6
- package/skill-evals/fixtures/pie-exports/input.mmd +0 -5
- package/skill-evals/fixtures/quadrant-priorities/input.mmd +0 -11
- package/skill-evals/fixtures/sequence-retry/input.mmd +0 -8
- package/skill-evals/fixtures/state-lifecycle/input.mmd +0 -5
- package/skill-evals/fixtures/timeline-release/input.mmd +0 -6
- package/skill-evals/fixtures/xychart-growth/input.mmd +0 -5
- package/skill-evals/shared-benchmark.json +0 -510
- package/src/agent/analyze.ts +0 -157
- package/src/agent/apply.ts +0 -146
- package/src/agent/architecture-body.ts +0 -458
- package/src/agent/certificates.ts +0 -110
- package/src/agent/class-body.ts +0 -319
- package/src/agent/core.ts +0 -207
- package/src/agent/create.ts +0 -106
- package/src/agent/describe.ts +0 -364
- package/src/agent/er-body.ts +0 -224
- package/src/agent/facts.ts +0 -337
- package/src/agent/families-builtin.ts +0 -934
- package/src/agent/families.ts +0 -232
- package/src/agent/family-layouts.ts +0 -826
- package/src/agent/flowchart-body.ts +0 -372
- package/src/agent/flowchart-unsupported.ts +0 -243
- package/src/agent/gantt-body.ts +0 -495
- package/src/agent/index.ts +0 -10
- package/src/agent/journey-body.ts +0 -414
- package/src/agent/label-metrics.ts +0 -28
- package/src/agent/layout-to-rendered.ts +0 -63
- package/src/agent/mutate.ts +0 -97
- package/src/agent/mutation-ops.ts +0 -51
- package/src/agent/op-schema.ts +0 -439
- package/src/agent/parse.ts +0 -223
- package/src/agent/pie-body.ts +0 -270
- package/src/agent/png.ts +0 -117
- package/src/agent/quadrant-body.ts +0 -336
- package/src/agent/quality.ts +0 -363
- package/src/agent/readability-audit.ts +0 -92
- package/src/agent/rendered-route-audit.ts +0 -61
- package/src/agent/sequence-body.ts +0 -345
- package/src/agent/serialize.ts +0 -214
- package/src/agent/state-body.ts +0 -589
- package/src/agent/structural-count.ts +0 -150
- package/src/agent/timeline-body.ts +0 -280
- package/src/agent/trace-log.ts +0 -43
- package/src/agent/types.ts +0 -979
- package/src/agent/verify.ts +0 -571
- package/src/agent/xychart-body.ts +0 -472
- package/src/architecture/config.ts +0 -282
- package/src/architecture/layout.ts +0 -496
- package/src/architecture/parser.ts +0 -375
- package/src/architecture/renderer.ts +0 -611
- package/src/architecture/types.ts +0 -113
- package/src/ascii/ansi.ts +0 -423
- package/src/ascii/architecture.ts +0 -210
- package/src/ascii/canvas.ts +0 -443
- package/src/ascii/class-diagram.ts +0 -697
- package/src/ascii/converter.ts +0 -475
- package/src/ascii/draw.ts +0 -1693
- package/src/ascii/edge-bundling.ts +0 -328
- package/src/ascii/edge-routing.ts +0 -330
- package/src/ascii/er-diagram.ts +0 -439
- package/src/ascii/gantt.ts +0 -276
- package/src/ascii/grid.ts +0 -747
- package/src/ascii/index.ts +0 -196
- package/src/ascii/journey.ts +0 -189
- package/src/ascii/meta.ts +0 -244
- package/src/ascii/multiline-utils.ts +0 -80
- package/src/ascii/pathfinder.ts +0 -301
- package/src/ascii/pie.ts +0 -67
- package/src/ascii/quadrant.ts +0 -158
- package/src/ascii/reverse.ts +0 -216
- package/src/ascii/sequence.ts +0 -499
- package/src/ascii/shapes/circle.ts +0 -27
- package/src/ascii/shapes/corners.ts +0 -143
- package/src/ascii/shapes/diamond.ts +0 -27
- package/src/ascii/shapes/hexagon.ts +0 -27
- package/src/ascii/shapes/index.ts +0 -106
- package/src/ascii/shapes/rectangle.ts +0 -168
- package/src/ascii/shapes/rounded.ts +0 -27
- package/src/ascii/shapes/special.ts +0 -332
- package/src/ascii/shapes/stadium.ts +0 -110
- package/src/ascii/shapes/state.ts +0 -192
- package/src/ascii/shapes/types.ts +0 -73
- package/src/ascii/timeline.ts +0 -128
- package/src/ascii/types.ts +0 -312
- package/src/ascii/validate.ts +0 -120
- package/src/ascii/width.ts +0 -81
- package/src/ascii/xychart.ts +0 -919
- package/src/browser.ts +0 -29
- package/src/class/layout.ts +0 -240
- package/src/class/parser.ts +0 -332
- package/src/class/renderer.ts +0 -638
- package/src/class/types.ts +0 -129
- package/src/cli/agent-instructions.ts +0 -1
- package/src/cli/am-bin.ts +0 -6
- package/src/cli/exit-codes.ts +0 -18
- package/src/cli/index.ts +0 -1117
- package/src/cli/init-agent.ts +0 -147
- package/src/color-resolver.ts +0 -152
- package/src/elk-instance.ts +0 -114
- package/src/er/layout.ts +0 -187
- package/src/er/parser.ts +0 -226
- package/src/er/renderer.ts +0 -792
- package/src/er/types.ts +0 -99
- package/src/font-manifest.ts +0 -27
- package/src/gantt/layout.ts +0 -365
- package/src/gantt/parser.ts +0 -282
- package/src/gantt/pipeline.ts +0 -27
- package/src/gantt/renderer.ts +0 -414
- package/src/gantt/schedule.ts +0 -513
- package/src/gantt/types.ts +0 -255
- package/src/index.ts +0 -368
- package/src/journey/layout.ts +0 -520
- package/src/journey/parser.ts +0 -218
- package/src/journey/renderer.ts +0 -811
- package/src/journey/types.ts +0 -144
- package/src/layout/geometry.ts +0 -182
- package/src/layout/pass.ts +0 -142
- package/src/layout/passes/index.ts +0 -3916
- package/src/layout-engine.ts +0 -1565
- package/src/layout-rubric.ts +0 -659
- package/src/mcp/artifacts.ts +0 -137
- package/src/mcp/dynamic-harness.ts +0 -31
- package/src/mcp/dynamic-modules.d.ts +0 -7
- package/src/mcp/facade.ts +0 -608
- package/src/mcp/harness-runtime.ts +0 -203
- package/src/mcp/hosted-server.ts +0 -468
- package/src/mcp/mcp-bin.ts +0 -3
- package/src/mcp/mcp-cli.ts +0 -82
- package/src/mcp/protocol.ts +0 -13
- package/src/mcp/sandbox.ts +0 -195
- package/src/mcp/sdk-decl.ts +0 -387
- package/src/mcp/server.ts +0 -362
- package/src/mcp/tool-surface.ts +0 -146
- package/src/mermaid-source.ts +0 -655
- package/src/multiline-utils.ts +0 -228
- package/src/parser.ts +0 -1031
- package/src/pie/layout.ts +0 -168
- package/src/pie/parser.ts +0 -136
- package/src/pie/renderer.ts +0 -234
- package/src/pie/types.ts +0 -82
- package/src/quadrant/layout.ts +0 -191
- package/src/quadrant/parser.ts +0 -183
- package/src/quadrant/renderer.ts +0 -322
- package/src/quadrant/types.ts +0 -113
- package/src/render-family-hooks.ts +0 -244
- package/src/renderer.ts +0 -1099
- package/src/route-contracts.ts +0 -2723
- package/src/scene/backend.ts +0 -76
- package/src/scene/fidelity.ts +0 -183
- package/src/scene/hybrid-backend.ts +0 -174
- package/src/scene/ir.ts +0 -181
- package/src/scene/marks.ts +0 -127
- package/src/scene/rough-backend.ts +0 -378
- package/src/scene/seed.ts +0 -46
- package/src/scene/style-registry.ts +0 -556
- package/src/sequence/layout.ts +0 -456
- package/src/sequence/parser.ts +0 -255
- package/src/sequence/renderer.ts +0 -604
- package/src/sequence/types.ts +0 -154
- package/src/shape-clipping.ts +0 -351
- package/src/shared/accessibility-directives.ts +0 -22
- package/src/shared/batched.ts +0 -61
- package/src/shared/color-math.ts +0 -72
- package/src/shared/svg-a11y.ts +0 -29
- package/src/shared/syntax-error.ts +0 -17
- package/src/shared/unicode-ranges.ts +0 -135
- package/src/styles.ts +0 -318
- package/src/svg-paths.ts +0 -28
- package/src/text-metrics.ts +0 -248
- package/src/theme.ts +0 -639
- package/src/timeline/layout.ts +0 -381
- package/src/timeline/parser.ts +0 -215
- package/src/timeline/renderer.ts +0 -538
- package/src/timeline/types.ts +0 -105
- package/src/types.ts +0 -454
- package/src/website-worker-modules.d.ts +0 -18
- package/src/xychart/axis-utils.ts +0 -109
- package/src/xychart/colors.ts +0 -124
- package/src/xychart/config.ts +0 -88
- package/src/xychart/layout.ts +0 -656
- package/src/xychart/parser.ts +0 -504
- package/src/xychart/renderer.ts +0 -640
- 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.
|
package/docs/diagram-families.md
DELETED
|
@@ -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
|
-
```
|