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,245 +0,0 @@
|
|
|
1
|
-
# Characterising the layout system
|
|
2
|
-
|
|
3
|
-
This folder bootstraps a **characterisation-test** suite for the layout
|
|
4
|
-
algorithm, in the sense of
|
|
5
|
-
[adewale/testing-best-practices](https://github.com/adewale/testing-best-practices):
|
|
6
|
-
pin what the code does today, with worked examples + property-based tests, so
|
|
7
|
-
the algorithm can be refactored safely and improved deliberately.
|
|
8
|
-
|
|
9
|
-
It contains three layers — a **deep** characterisation of the flowchart/state
|
|
10
|
-
grid engine, a **breadth** layer spanning every renderer, and a **visual-quality**
|
|
11
|
-
approval layer for reviewable layout drift:
|
|
12
|
-
|
|
13
|
-
| File | What it is |
|
|
14
|
-
|------|------------|
|
|
15
|
-
| [`contact-sheet.md`](./contact-sheet.md) | **Depth** — the minimum set of worked examples that exercise every load-bearing decision in the grid engine. One phenomenon per example. (Generated by `scripts/characterization/contact-sheet.ts`.) |
|
|
16
|
-
| [`properties.md`](./properties.md) | **Depth** — the smallest load-bearing set of properties for the grid engine, with a minimality (mutation-kill) argument and academic grounding. |
|
|
17
|
-
| [`../../src/__tests__/characterization-layout.test.ts`](../../src/__tests__/characterization-layout.test.ts) | **Depth** — those properties as executable `fast-check` tests (13 tests). |
|
|
18
|
-
| [`contact-sheet-families.md`](./contact-sheet-families.md) | **Breadth** — one canonical example per renderer (all 12 families) + the universal-invariant coverage matrix. (Generated by `scripts/characterization/contact-sheet-families.ts`.) |
|
|
19
|
-
| [`../../src/__tests__/characterization-families.test.ts`](../../src/__tests__/characterization-families.test.ts) | **Breadth** — the universal invariants extended across every family and public output surface, asserting only what holds per family (17 tests). |
|
|
20
|
-
| [`visual-quality.md`](./visual-quality.md) | **Visual approval** — SVG snapshots, SVG/PNG fingerprints, and advisory graph-drawing metrics for all 12 families. (Generated by `scripts/characterization/visual-quality.ts`.) |
|
|
21
|
-
| [`../../src/__tests__/characterization-generated-artifacts.test.ts`](../../src/__tests__/characterization-generated-artifacts.test.ts) | **Drift check** — fails when generated contact sheets, visual report, or SVG snapshots are stale. |
|
|
22
|
-
|
|
23
|
-
No implementation code was changed to produce any of this.
|
|
24
|
-
|
|
25
|
-
## Visual testing rule
|
|
26
|
-
|
|
27
|
-
Snapshots and contact sheets are approval evidence, not the whole oracle. When a
|
|
28
|
-
bug report says something **looks** wrong, add at least one executable visual
|
|
29
|
-
contract that would fail before updating any golden file. Pick the cheapest
|
|
30
|
-
contract that observes the thing users actually see:
|
|
31
|
-
|
|
32
|
-
| Visual risk | Preferred contract | Examples |
|
|
33
|
-
|-------------|--------------------|----------|
|
|
34
|
-
| Route geometry, ports, label lanes, overlaps | Geometry/rubric invariant over positioned layout | `route-contracts*.test.ts`, `layout-rubric.test.ts`, `contact-sheet.test.ts` hard metrics |
|
|
35
|
-
| Effective color, stroke thickness, blank/collapsed render, visible endpoint glyphs | Raster invariant with `@resvg/resvg-js` pixels | `visual-rendering-contracts.test.ts`, `helpers/raster.ts` |
|
|
36
|
-
| ASCII/Unicode line style or marker placement | Row/region assertion on the rendered character grid | `ascii-edge-styles.test.ts` connector-row contracts |
|
|
37
|
-
| Broad family drift that needs human judgement | Golden/snapshot/contact sheet after an invariant already guards the principle | `visual-quality.md`, `visual-snapshots/*.svg`, PR screenshots |
|
|
38
|
-
| Parser, escaping, config, IDs, public API shape | Structural/string assertion | Parser/security/integration tests |
|
|
39
|
-
|
|
40
|
-
The red-green loop for visual work is:
|
|
41
|
-
|
|
42
|
-
1. Reproduce the bad rendering with the smallest diagram that shows the fault.
|
|
43
|
-
2. Encode the visual principle as geometry, raster, or row-level evidence.
|
|
44
|
-
3. Prove the test is sensitive: where practical, simulate the old behaviour or
|
|
45
|
-
run a temporary source-level sabotage before trusting the green run.
|
|
46
|
-
4. Fix the implementation.
|
|
47
|
-
5. Regenerate approval artifacts only after the invariant test passes and the
|
|
48
|
-
visual diff has been reviewed.
|
|
49
|
-
|
|
50
|
-
## Relationship to PR 30
|
|
51
|
-
|
|
52
|
-
PR 30 changed the right baseline for layout characterisation. It introduced the
|
|
53
|
-
route-contract layer (`src/route-contracts.ts`), the deterministic graph-drawing
|
|
54
|
-
rubric (`src/layout-rubric.ts`), route/contact-sheet gates
|
|
55
|
-
(`src/__tests__/contact-sheet.test.ts`, `src/__tests__/layout-rubric.test.ts`),
|
|
56
|
-
and the heuristic tracker (`eval/heuristic-tracker/`). Those tests now own the
|
|
57
|
-
question "is this flowchart/state/architecture route geometrically valid and
|
|
58
|
-
free of hitches, stale certificates, off-outline endpoints, and label-route
|
|
59
|
-
ambiguity?"
|
|
60
|
-
|
|
61
|
-
This directory owns a different question: "what observable layout behaviour did
|
|
62
|
-
we approve, and did it drift deliberately?" After rebasing this PR over PR 30,
|
|
63
|
-
`bun run characterization:check` reported only the visual-quality report plus
|
|
64
|
-
the flowchart/state SVG snapshots as stale. That is the intended signal:
|
|
65
|
-
flowchart/state are exactly the families PR 30's route-contract work should
|
|
66
|
-
move, while the other renderer-family snapshots stayed unchanged. The correct
|
|
67
|
-
course is therefore to approve the new flowchart/state baselines after the PR 30
|
|
68
|
-
route gates pass, rather than add duplicate route-contract assertions here.
|
|
69
|
-
|
|
70
|
-
For future layout changes:
|
|
71
|
-
|
|
72
|
-
| If this changes | Use this gate | Review action |
|
|
73
|
-
|-----------------|---------------|---------------|
|
|
74
|
-
| Flowchart/state/architecture routing geometry | `bun test src/__tests__/contact-sheet.test.ts src/__tests__/layout-rubric.test.ts` and `bun run track` | Hard rubric violations must stay zero; baseline deltas must be explained as improvement or intended drift. |
|
|
75
|
-
| Generated characterisation artifacts | `bun run characterization:check` | Regenerate the contact sheets / visual snapshots only after reviewing the visual diff. |
|
|
76
|
-
| ASCII grid mechanics | `bun test src/__tests__/characterization-layout.test.ts` plus `bun run mutation-test:characterization` | Update P-properties only when the algorithm deliberately changes. |
|
|
77
|
-
| Renderer-family dispatch/output surfaces | `bun test src/__tests__/characterization-families.test.ts` | Drift outside the PR's claimed layout surface is suspicious and needs a separate explanation. |
|
|
78
|
-
|
|
79
|
-
## Coverage across renderers
|
|
80
|
-
|
|
81
|
-
The **depth** layer targets the flowchart + `stateDiagram-v2` family (the
|
|
82
|
-
hand-written grid + A\* engine — see next section for why). The **breadth** layer
|
|
83
|
-
extends the universal invariants to every diagram family and public output
|
|
84
|
-
surface: text (`renderMermaidASCII`), SVG (`renderMermaidSVG`), and PNG
|
|
85
|
-
(`renderMermaidPNG`, which rasterizes the SVG path). It asserts only what is
|
|
86
|
-
empirically true for each:
|
|
87
|
-
|
|
88
|
-
| Invariant | Holds for |
|
|
89
|
-
|-----------|-----------|
|
|
90
|
-
| Dispatch totality (non-empty text/SVG and valid PNG signature) | **every** family and public output surface |
|
|
91
|
-
| Sentinel label conservation | **every** family on text/SVG surfaces |
|
|
92
|
-
| Determinism (byte-identical) | **every** family on text/SVG/PNG matrix cases (also pinned corpus-wide for ASCII by `ascii-determinism.test.ts`) |
|
|
93
|
-
| Output hygiene (no `NaN` / `Infinity` / `undefined`, no ANSI when color is disabled) | **every** family on text/SVG surfaces |
|
|
94
|
-
| No diagonals | **every** family on text output (xychart plots with block glyphs, not `/\`) |
|
|
95
|
-
| Rectangular canvas (all rows one width) | box/graph families only: flowchart, state, sequence, class, er |
|
|
96
|
-
| Layered placement, non-overlap, round-trip (P5–P10) | flowchart/state grid engine only |
|
|
97
|
-
|
|
98
|
-
The chart, list, schedule, and architecture families (timeline, journey, xychart,
|
|
99
|
-
pie, quadrant, gantt, architecture) emit ragged rows by design, so rectangularity is **not**
|
|
100
|
-
asserted there — and that boundary is pinned as a known limit. The deep
|
|
101
|
-
structural and layering properties are specific to the grid engine and do not
|
|
102
|
-
generalise; each non-grid family has its own layout strategy (documented in
|
|
103
|
-
`contact-sheet-families.md`) whose deep per-family invariants are the natural
|
|
104
|
-
next increment.
|
|
105
|
-
|
|
106
|
-
The visual-quality layer deliberately sits beside, not inside, the minimal
|
|
107
|
-
property kernel. It records SVG snapshots, PNG hashes, crossings, bends, route
|
|
108
|
-
length, area fill, label fit, and edge-label overlap risk for one canonical case
|
|
109
|
-
per family. Those values are approval signals: a diff should be inspected and
|
|
110
|
-
approved, not automatically interpreted as a semantic bug. PR 30's rubric is the
|
|
111
|
-
hard correctness oracle for route-contract families; these snapshots are the
|
|
112
|
-
cross-family drift ledger.
|
|
113
|
-
|
|
114
|
-
---
|
|
115
|
-
|
|
116
|
-
## What "the layout algorithm" means here
|
|
117
|
-
|
|
118
|
-
This project has **two** distinct layout engines:
|
|
119
|
-
|
|
120
|
-
1. **ELK-based engine** (`src/layout-engine.ts`) — wraps Eclipse Layout Kernel's
|
|
121
|
-
*layered* (Sugiyama) algorithm to produce pixel coordinates for **SVG/PNG**.
|
|
122
|
-
The placement is a configured third-party black box; the bespoke part is the
|
|
123
|
-
post-processing (layer snapping, edge bundling, margin routing, shape
|
|
124
|
-
clipping).
|
|
125
|
-
2. **ASCII grid engine** (`src/ascii/grid.ts` + `pathfinder.ts` +
|
|
126
|
-
`edge-routing.ts` + `edge-bundling.ts`) — a **hand-written** grid layout with
|
|
127
|
-
**A\* orthogonal edge routing** that renders flowcharts and state diagrams as
|
|
128
|
-
character art. It is a TypeScript port and extension of
|
|
129
|
-
[`AlexanderGrooff/mermaid-ascii`](https://github.com/AlexanderGrooff/mermaid-ascii).
|
|
130
|
-
|
|
131
|
-
**This characterisation targets the ASCII grid engine.** It is the genuinely
|
|
132
|
-
"ours" algorithm (the ELK one delegates placement), it is pure / synchronous /
|
|
133
|
-
deterministic / dependency-free, and it is the surface the project already
|
|
134
|
-
mutation-tests (`stryker.ascii.config.json`). It is therefore the ideal
|
|
135
|
-
characterisation subject. The flowchart and `stateDiagram-v2` families share
|
|
136
|
-
this exact pipeline (`src/ascii/index.ts`); the other families (sequence, class,
|
|
137
|
-
ER, pie, quadrant, xychart, timeline, journey, architecture) have their own
|
|
138
|
-
renderers and are out of scope here.
|
|
139
|
-
|
|
140
|
-
### The pipeline in one line
|
|
141
|
-
|
|
142
|
-
```
|
|
143
|
-
parseMermaid → convertToAsciiGraph → createMapping (grid + A*) → drawGraph → canvasToString
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
`createMapping` (`grid.ts`) is the heart: it places each node as a **3×3 grid
|
|
147
|
-
block**, assigns layers along the flow axis with a **stride of 4**, routes every
|
|
148
|
-
edge with a **bounded, deterministic A\***, and bundles fan-in/fan-out edges onto
|
|
149
|
-
shared trunks.
|
|
150
|
-
|
|
151
|
-
---
|
|
152
|
-
|
|
153
|
-
## How the layout works (the load-bearing mechanics)
|
|
154
|
-
|
|
155
|
-
- **Grid model.** Every node owns a 3×3 block of an integer grid; `gridCoord` is
|
|
156
|
-
its top-left cell, and the eight surrounding cells are edge attachment points.
|
|
157
|
-
Blocks are placed 4 grid units apart (3 cells + a 1-cell routing gutter).
|
|
158
|
-
- **Layer assignment.** Roots (nodes with no incoming edge) go at level 0;
|
|
159
|
-
each child is placed one level (stride 4) along the **flow axis** (y for
|
|
160
|
-
TD/BT, x for LR/RL). TD and LR are the same code with x/y transposed; **BT =
|
|
161
|
-
TD then vertical flip**; **RL is currently treated as LR**.
|
|
162
|
-
- **A\* routing.** Edges are routed cell-by-cell with A\* over the same grid that
|
|
163
|
-
tracks node occupancy. Moves are 4-directional only (⇒ **orthogonal**, no
|
|
164
|
-
diagonals); the heuristic is Manhattan distance + a corner penalty (prefers
|
|
165
|
-
straight runs); ties break FIFO (⇒ **deterministic**); the search is bounded
|
|
166
|
-
(⇒ **terminates**, returns `null` + a straight fallback if walled off).
|
|
167
|
-
- **Edge bundling.** Sibling fan-out / fan-in edges of the same style merge onto
|
|
168
|
-
a single shared trunk that splits at one junction; labelled siblings (which
|
|
169
|
-
can't bundle) share a trunk prefix instead.
|
|
170
|
-
- **Best-effort, not a solver.** For cyclic / dense graphs the multi-pass
|
|
171
|
-
placement can drop or overlap nodes. That limitation is real, current, and
|
|
172
|
-
pinned by property **P10** rather than hidden.
|
|
173
|
-
|
|
174
|
-
A fuller mechanical anatomy (with `file:line` citations for all 30+ invariants)
|
|
175
|
-
informed `properties.md`; the citations are inlined there.
|
|
176
|
-
|
|
177
|
-
---
|
|
178
|
-
|
|
179
|
-
## How this connects to the testing literature
|
|
180
|
-
|
|
181
|
-
- **Characterisation tests** (Feathers, *WELC* ch. 13): tests that document the
|
|
182
|
-
system's *actual* behaviour, not its intended behaviour — the safety net for
|
|
183
|
-
refactoring. The contact sheet is the worked-example form; the property suite
|
|
184
|
-
is the generalised form.
|
|
185
|
-
- **Approval / golden tests** (Falco): the contact sheet is generated and
|
|
186
|
-
reviewed as a diff — a surprising change is a regression, an expected change
|
|
187
|
-
is the new approved baseline. The repo's `src/__tests__/testdata/` corpus is
|
|
188
|
-
the byte-level golden layer beneath it.
|
|
189
|
-
- **Property-based testing** (fast-check): the kernel asserts **invariants** and
|
|
190
|
-
**metamorphic relations** rather than exact outputs, so it generalises across
|
|
191
|
-
thousands of generated graphs instead of a handful of fixtures.
|
|
192
|
-
- **Mutation testing** (Stryker, already configured): the oracle for *which*
|
|
193
|
-
properties are load-bearing — a property is kept only if it kills a mutant no
|
|
194
|
-
other test kills. See the minimality argument in `properties.md`.
|
|
195
|
-
- **Visual approval / metric drift:** `visual-quality.md` keeps the literature's
|
|
196
|
-
aesthetic objectives visible (crossings, bends, area, label overlap) without
|
|
197
|
-
turning them into brittle universal laws.
|
|
198
|
-
|
|
199
|
-
Together: **goldens characterise, properties generalise, mutation proves which
|
|
200
|
-
assertions do work, visual snapshots make quality drift reviewable.**
|
|
201
|
-
|
|
202
|
-
---
|
|
203
|
-
|
|
204
|
-
## Reproduce
|
|
205
|
-
|
|
206
|
-
```bash
|
|
207
|
-
bun install
|
|
208
|
-
|
|
209
|
-
# Executable characterisation kernels
|
|
210
|
-
bun test src/__tests__/characterization-layout.test.ts # grid engine (depth)
|
|
211
|
-
bun test src/__tests__/characterization-families.test.ts # all families (breadth)
|
|
212
|
-
bun test src/__tests__/characterization-generated-artifacts.test.ts
|
|
213
|
-
|
|
214
|
-
# Regenerate the contact sheets / visual report, then review the diff and commit
|
|
215
|
-
bun run scripts/characterization/contact-sheet.ts
|
|
216
|
-
bun run scripts/characterization/contact-sheet-families.ts
|
|
217
|
-
bun run scripts/characterization/visual-quality.ts
|
|
218
|
-
git diff docs/layout-characterization/
|
|
219
|
-
|
|
220
|
-
# CI-friendly generated-artifact drift check
|
|
221
|
-
bun run characterization:check
|
|
222
|
-
|
|
223
|
-
# Route-contract correctness gates introduced by PR 30
|
|
224
|
-
bun test src/__tests__/contact-sheet.test.ts src/__tests__/layout-rubric.test.ts
|
|
225
|
-
bun run track
|
|
226
|
-
|
|
227
|
-
# (optional) quick mutation evidence for the load-bearing ranges
|
|
228
|
-
bun run mutation-test:characterization
|
|
229
|
-
|
|
230
|
-
# exhaustive but slow: mutates the whole ASCII layout core
|
|
231
|
-
bun run mutation-test:ascii
|
|
232
|
-
```
|
|
233
|
-
|
|
234
|
-
## Sources
|
|
235
|
-
|
|
236
|
-
Layered graph drawing: Sugiyama–Tagawa–Toda (1981); Gansner–Koutsofios–North–Vo
|
|
237
|
-
(1993, the `dot` algorithm, <https://www.graphviz.org/documentation/TSE93.pdf>);
|
|
238
|
-
Brandes–Köpf (2002). A\*: Hart–Nilsson–Raphael (1968). Orthogonal routing:
|
|
239
|
-
Tamassia (1987); Wybrow–Marriott–Stuckey (2009),
|
|
240
|
-
<https://users.monash.edu/~mwybrow/papers/wybrow-gd-2009.pdf>. ELK:
|
|
241
|
-
<https://eclipse.dev/elk/>. ASCII prior art: mermaid-ascii
|
|
242
|
-
(<https://github.com/AlexanderGrooff/mermaid-ascii>), Graph::Easy. Testing:
|
|
243
|
-
Feathers, *Working Effectively with Legacy Code* (2004); Falco, ApprovalTests
|
|
244
|
-
(<https://approvaltests.com/>); Bartocci et al., property-based mutation testing
|
|
245
|
-
(2023, <https://arxiv.org/pdf/2301.13615>).
|