agentic-mermaid 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENT_NATIVE.md +155 -91
- package/CHANGELOG.md +163 -4
- package/Instructions_for_agents.md +10 -10
- package/LICENSES/Apache-2.0.txt +202 -0
- package/README.md +31 -38
- package/THIRD_PARTY_NOTICES.md +29 -0
- package/assets/hero.png +0 -0
- package/dist/agent-core.d.ts +463 -0
- package/dist/agent-core.js +397 -0
- package/dist/agent.d.ts +73 -1868
- package/dist/agent.js +336 -37325
- package/dist/agentic-mermaid-mcp.js +7 -38399
- package/dist/am.js +33626 -40446
- package/dist/chunk-2P5FKUQC.js +3485 -0
- package/dist/chunk-2S3VSS6I.js +149 -0
- package/dist/chunk-2SILJDW2.js +37 -0
- package/dist/chunk-BJYMBT4I.js +61963 -0
- package/dist/chunk-FDM43XU7.js +615 -0
- package/dist/chunk-MYPDVZCO.js +4702 -0
- package/dist/index-DWPa2MJs.d.ts +6780 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +310 -33014
- package/dist/mcp-cli-5J47WEY3.js +17 -0
- package/docs/README.md +39 -31
- package/docs/agent-api-cookbook.md +44 -35
- package/docs/agent-mutation-policy.md +1 -1
- package/docs/agent-workflow-examples.md +2 -2
- package/docs/api.md +284 -77
- package/docs/ascii.md +26 -16
- package/docs/code-mode-impact.md +214 -0
- package/docs/comparison.md +23 -11
- package/docs/computational-aesthetics-prototype-plan.md +252 -0
- package/docs/config.md +26 -10
- package/docs/custom-fonts.md +265 -0
- package/docs/custom-style-cookbook.md +130 -9
- package/docs/diagram-families.md +48 -23
- package/docs/features.md +59 -52
- package/docs/fork-differences.md +6 -3
- package/docs/getting-started.md +23 -16
- package/docs/issue-derived-test-cases.md +29 -22
- package/docs/mcp-code-mode-rationale.md +13 -6
- package/docs/mcp-http-transport.md +20 -13
- package/docs/mermaid-layout-complaints.md +66 -52
- package/docs/mutation-testing.md +145 -66
- package/docs/quality.md +23 -14
- package/docs/react.md +2 -2
- package/docs/schemas/style-spec.schema.json +1221 -30
- package/docs/style-authoring.md +241 -38
- package/docs/svg-semantic-contract.md +49 -0
- package/docs/testing-strategy.md +166 -58
- package/docs/theming.md +19 -32
- 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 +85 -45
- package/server.json +2 -2
- 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/TODO.md +0 -684
- package/dist/index-wjRjbsP-.d.ts +0 -1102
- 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/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 -82
- package/docs/contributing/visual-review-evidence.md +0 -53
- 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-experience-curve-implementation.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 -439
- package/docs/design/families/journey-section-overlap-after.png +0 -0
- package/docs/design/families/journey-section-overlap-before.png +0 -0
- package/docs/design/families/journey-usage-research.md +0 -423
- package/docs/design/families/journey.md +0 -153
- 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/layout-characterization/README.md +0 -245
- package/docs/layout-characterization/contact-sheet-families.md +0 -498
- 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 -98
- 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/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/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 -368
- package/src/agent/er-body.ts +0 -224
- package/src/agent/facts.ts +0 -360
- package/src/agent/families-builtin.ts +0 -920
- package/src/agent/families.ts +0 -232
- package/src/agent/family-layouts.ts +0 -832
- package/src/agent/flowchart-body.ts +0 -372
- package/src/agent/flowchart-unsupported.ts +0 -243
- package/src/agent/font-coverage.ts +0 -288
- package/src/agent/gantt-body.ts +0 -495
- package/src/agent/index.ts +0 -10
- package/src/agent/journey-body.ts +0 -374
- 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 -443
- package/src/agent/parse.ts +0 -223
- package/src/agent/pie-body.ts +0 -270
- package/src/agent/png.ts +0 -171
- 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 -995
- package/src/agent/verify.ts +0 -603
- 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 -169
- 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 -141
- package/src/ascii/types.ts +0 -312
- package/src/ascii/validate.ts +0 -120
- package/src/ascii/width.ts +0 -81
- package/src/ascii/wrap.ts +0 -131
- 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 -1132
- package/src/cli/init-agent.ts +0 -147
- package/src/cli/run-entrypoint.ts +0 -10
- 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/family-rubric.ts +0 -425
- package/src/font-manifest.ts +0 -31
- 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 -554
- package/src/journey/parse-core.ts +0 -251
- package/src/journey/parser.ts +0 -101
- package/src/journey/renderer.ts +0 -917
- 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 -391
- 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 -93
- 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 -710
- 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 -462
- 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
package/src/agent/families.ts
DELETED
|
@@ -1,232 +0,0 @@
|
|
|
1
|
-
// ============================================================================
|
|
2
|
-
// Family plugin registry.
|
|
3
|
-
//
|
|
4
|
-
// Provides a registration point so new diagram families can plug in without
|
|
5
|
-
// modifying core parse/serialize/verify dispatchers. The registry primarily
|
|
6
|
-
// powers universal source-based Tier 1 checks (LABEL_OVERFLOW for opaque
|
|
7
|
-
// bodies) and offers a forward path for full per-family ownership.
|
|
8
|
-
//
|
|
9
|
-
// Built-in families register themselves at import time (see ./families-builtin.ts).
|
|
10
|
-
// External code can call `registerFamily(plugin)` to add new kinds.
|
|
11
|
-
// ============================================================================
|
|
12
|
-
|
|
13
|
-
import type {
|
|
14
|
-
DiagramKind, DiagramBody, ValidDiagramMeta, ParseError, SourceMap,
|
|
15
|
-
AnyMutationOp, MutationError, LayoutWarning, VerifyOptions, Result,
|
|
16
|
-
} from './types.ts'
|
|
17
|
-
import type { PositionedDiagram, RenderContext, RenderOptions } from '../types.ts'
|
|
18
|
-
import type { DiagramColors } from '../theme.ts'
|
|
19
|
-
import type { SceneDoc } from '../scene/ir.ts'
|
|
20
|
-
import type { NormalizedMermaidSource } from '../mermaid-source.ts'
|
|
21
|
-
import type { AsciiConfig, AsciiTheme, ColorMode } from '../ascii/types.ts'
|
|
22
|
-
|
|
23
|
-
export interface ExtractedLabel {
|
|
24
|
-
/** The label text, with quotes stripped. */
|
|
25
|
-
text: string
|
|
26
|
-
/** Best-effort target identifier (node id, participant, period, etc.). */
|
|
27
|
-
target: string
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export interface FamilyLayoutContext {
|
|
31
|
-
source: NormalizedMermaidSource
|
|
32
|
-
options: RenderOptions
|
|
33
|
-
/** Render options after public-entrypoint normalization, e.g. security/font/config threading. */
|
|
34
|
-
renderOptions: RenderOptions
|
|
35
|
-
colors: DiagramColors
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export interface FamilyLayoutResult<TPositioned extends PositionedDiagram = PositionedDiagram> {
|
|
39
|
-
positioned: TPositioned
|
|
40
|
-
/** Optional family-specific palette override for rendering/finalization. */
|
|
41
|
-
colors?: DiagramColors
|
|
42
|
-
/** Optional family-specific render options override for RenderContext. */
|
|
43
|
-
options?: RenderOptions
|
|
44
|
-
/** False when the family renderer already owns SVG accessibility metadata. */
|
|
45
|
-
injectAccessibility?: boolean
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export interface AsciiContext {
|
|
49
|
-
source: NormalizedMermaidSource
|
|
50
|
-
config: AsciiConfig
|
|
51
|
-
colorMode: ColorMode
|
|
52
|
-
theme: AsciiTheme
|
|
53
|
-
options: {
|
|
54
|
-
maxWidth?: number
|
|
55
|
-
ganttToday?: string
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export interface FamilyPlugin {
|
|
60
|
-
/** The DiagramKind this plugin owns. */
|
|
61
|
-
id: DiagramKind
|
|
62
|
-
/** First-non-blank-line predicate. Lowercase, leading whitespace stripped. */
|
|
63
|
-
detect: (firstLineLower: string) => boolean
|
|
64
|
-
/**
|
|
65
|
-
* Source-based label extractor for universal Tier 1 LABEL_OVERFLOW on opaque
|
|
66
|
-
* bodies. Each plugin should extract everything an agent would consider a
|
|
67
|
-
* label — node text, edge text, message text, axis names, section titles.
|
|
68
|
-
* The generic fallback (extractLabelsGeneric) is used when a family doesn't
|
|
69
|
-
* provide its own.
|
|
70
|
-
*/
|
|
71
|
-
extractLabels?: (source: string) => ExtractedLabel[]
|
|
72
|
-
/**
|
|
73
|
-
* Family-specific structured parser. `lines` are the normalized source
|
|
74
|
-
* lines including the header; `opaqueSource` is the original body for
|
|
75
|
-
* lossless fallback; `canonicalSource` is the full normalized text (the
|
|
76
|
-
* legacy flowchart parser consumes it whole). Structured-or-opaque
|
|
77
|
-
* families return ok(structured ?? opaque); error-semantics families
|
|
78
|
-
* (flowchart/state) return err(ParseError[]).
|
|
79
|
-
*/
|
|
80
|
-
parse?: (lines: string[], opaqueSource: string, meta: ValidDiagramMeta, canonicalSource: string) => Result<DiagramBody, ParseError[]>
|
|
81
|
-
/**
|
|
82
|
-
* Optional source-map builder, run after a successful parse. Today only
|
|
83
|
-
* flowchart/state index node positions; other families return no map.
|
|
84
|
-
*/
|
|
85
|
-
buildSourceMap?: (body: DiagramBody, canonicalSource: string) => SourceMap
|
|
86
|
-
/** Optional: family-specific serializer for a structured body. */
|
|
87
|
-
serialize?: (body: DiagramBody) => string
|
|
88
|
-
/** Optional: family-specific structured mutation. */
|
|
89
|
-
mutate?: (body: DiagramBody, op: AnyMutationOp) => Result<DiagramBody, MutationError>
|
|
90
|
-
/** Optional: family-specific verify (Tier 1 + Tier 2). Returns warnings only. */
|
|
91
|
-
verify?: (body: DiagramBody, opts: VerifyOptions) => LayoutWarning[]
|
|
92
|
-
/** Optional: family-specific source-to-positioned layout for public SVG rendering. */
|
|
93
|
-
layout?: (ctx: FamilyLayoutContext) => FamilyLayoutResult | PositionedDiagram
|
|
94
|
-
/** Optional: family-specific SVG renderer fed by a positioned layout result. */
|
|
95
|
-
renderSvg?: (ctx: RenderContext<PositionedDiagram>) => string
|
|
96
|
-
/**
|
|
97
|
-
* Optional: family-specific SceneGraph lowering (SPEC §3.1). Produces the
|
|
98
|
-
* semantic render-mark tree that style backends consume; renderSvg for a
|
|
99
|
-
* lowered family is DefaultBackend serialization of this scene.
|
|
100
|
-
*/
|
|
101
|
-
lowerScene?: (ctx: RenderContext<PositionedDiagram>) => SceneDoc
|
|
102
|
-
/** Optional: family-specific ASCII renderer. */
|
|
103
|
-
renderAscii?: (ctx: AsciiContext) => string
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
export interface BuiltinFamilyMetadata {
|
|
107
|
-
/** Built-in DiagramKind exposed by Agentic Mermaid. */
|
|
108
|
-
id: DiagramKind
|
|
109
|
-
/** Human-facing family name used in docs and editor examples. */
|
|
110
|
-
label: string
|
|
111
|
-
/** Mermaid headers routed to this family. */
|
|
112
|
-
headers: readonly string[]
|
|
113
|
-
/** SDK narrower advertised for structured mutation. */
|
|
114
|
-
narrower: `as${string}`
|
|
115
|
-
/** Editor example category label. */
|
|
116
|
-
editorDiagramType: string
|
|
117
|
-
/** Basic editor example that must exist for this family. */
|
|
118
|
-
editorExampleId: string
|
|
119
|
-
/** Short glyph used by the editor example picker. */
|
|
120
|
-
editorGlyph: string
|
|
121
|
-
/** Minimal canonical source: correct header + core syntax. Exposed via
|
|
122
|
-
* `am capabilities` so agents learn each family's dialect from the
|
|
123
|
-
* discovery envelope instead of error-message trial-and-error (the
|
|
124
|
-
* onboarding probes burned most of their iterations on exactly this —
|
|
125
|
-
* architecture-beta headers, quadrant [x, y] brackets). A test pins
|
|
126
|
-
* every example to parse, verify, and render clean. */
|
|
127
|
-
example: string
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
export const BUILTIN_FAMILY_METADATA = [
|
|
131
|
-
{ id: 'flowchart', label: 'Flowchart', headers: ['flowchart', 'graph'], narrower: 'asFlowchart', editorDiagramType: 'Flowchart', editorExampleId: 'flowchart-basic', editorGlyph: 'F',
|
|
132
|
-
example: 'flowchart TD\n A[Start] --> B{Ship?}\n B -->|yes| C[Deploy]\n B -->|no| D[Fix]' },
|
|
133
|
-
{ id: 'state', label: 'State', headers: ['stateDiagram', 'stateDiagram-v2'], narrower: 'asState', editorDiagramType: 'State', editorExampleId: 'state-basic', editorGlyph: 'S',
|
|
134
|
-
example: 'stateDiagram-v2\n [*] --> Draft\n Draft --> Review : submit\n Review --> [*] : approve' },
|
|
135
|
-
{ id: 'sequence', label: 'Sequence', headers: ['sequenceDiagram'], narrower: 'asSequence', editorDiagramType: 'Sequence', editorExampleId: 'sequence-basic', editorGlyph: 'Q',
|
|
136
|
-
example: 'sequenceDiagram\n participant U as User\n participant S as Server\n U->>S: request\n S-->>U: response' },
|
|
137
|
-
{ id: 'timeline', label: 'Timeline', headers: ['timeline'], narrower: 'asTimeline', editorDiagramType: 'Timeline', editorExampleId: 'timeline-basic', editorGlyph: 'T',
|
|
138
|
-
example: 'timeline\n title Roadmap\n 2025 : Alpha : Beta\n 2026 : GA' },
|
|
139
|
-
{ id: 'class', label: 'Class', headers: ['classDiagram'], narrower: 'asClass', editorDiagramType: 'Class', editorExampleId: 'class-basic', editorGlyph: 'C',
|
|
140
|
-
example: 'classDiagram\n class Account {\n +id: string\n +close() void\n }\n Account <|-- Savings\n Account "1" o-- "*" Transaction : logs' },
|
|
141
|
-
{ id: 'er', label: 'ER', headers: ['erDiagram'], narrower: 'asEr', editorDiagramType: 'ER', editorExampleId: 'er-basic', editorGlyph: 'ER',
|
|
142
|
-
example: 'erDiagram\n CUSTOMER ||--o{ ORDER : places\n ORDER {\n string id\n }' },
|
|
143
|
-
{ id: 'journey', label: 'Journey', headers: ['journey'], narrower: 'asJourney', editorDiagramType: 'Journey', editorExampleId: 'journey-basic', editorGlyph: 'J',
|
|
144
|
-
example: 'journey\n title Checkout\n section Browse\n Find product: 4: Shopper\n section Buy\n Pay: 3: Shopper' },
|
|
145
|
-
{ id: 'architecture', label: 'Architecture', headers: ['architecture-beta'], narrower: 'asArchitecture', editorDiagramType: 'Architecture', editorExampleId: 'architecture-basic', editorGlyph: 'A',
|
|
146
|
-
example: 'architecture-beta\n group backend(cloud)[Backend]\n service api(server)[API] in backend\n service db(database)[Database] in backend\n service cache(disk)[Cache] in backend\n api:R --> L:db\n api:B -[reads]-> T:cache' },
|
|
147
|
-
{ id: 'xychart', label: 'XY chart', headers: ['xychart', 'xychart-beta'], narrower: 'asXyChart', editorDiagramType: 'XY Chart', editorExampleId: 'xychart-basic', editorGlyph: 'XY',
|
|
148
|
-
example: 'xychart-beta\n title "Revenue"\n x-axis [Q1, Q2, Q3]\n y-axis "USD" 0 --> 100\n bar [45, 62, 80]' },
|
|
149
|
-
{ id: 'pie', label: 'Pie', headers: ['pie'], narrower: 'asPie', editorDiagramType: 'Pie', editorExampleId: 'pie-basic', editorGlyph: 'P',
|
|
150
|
-
example: 'pie title Plans\n "Free" : 60\n "Pro" : 30\n "Enterprise" : 10' },
|
|
151
|
-
{ id: 'quadrant', label: 'Quadrant', headers: ['quadrantChart'], narrower: 'asQuadrant', editorDiagramType: 'Quadrant', editorExampleId: 'quadrant-basic', editorGlyph: '4Q',
|
|
152
|
-
example: 'quadrantChart\n title Prioritize\n x-axis Low Effort --> High Effort\n y-axis Low Value --> High Value\n Quick win: [0.2, 0.8]\n Money pit: [0.8, 0.2]' },
|
|
153
|
-
{ id: 'gantt', label: 'Gantt', headers: ['gantt'], narrower: 'asGantt', editorDiagramType: 'Gantt', editorExampleId: 'gantt-basic', editorGlyph: 'G',
|
|
154
|
-
example: 'gantt\n title Plan\n dateFormat YYYY-MM-DD\n section Build\n Implement :a1, 2026-01-05, 5d\n Review :after a1, 2d' },
|
|
155
|
-
] as const satisfies readonly BuiltinFamilyMetadata[]
|
|
156
|
-
|
|
157
|
-
export type BuiltinFamilyId = typeof BUILTIN_FAMILY_METADATA[number]['id']
|
|
158
|
-
|
|
159
|
-
type BuiltinFamilyMetadataCoversDiagramKind =
|
|
160
|
-
[Exclude<DiagramKind, BuiltinFamilyId>, Exclude<BuiltinFamilyId, DiagramKind>] extends [never, never]
|
|
161
|
-
? true
|
|
162
|
-
: never
|
|
163
|
-
|
|
164
|
-
export const BUILTIN_FAMILY_METADATA_COVERS_DIAGRAM_KIND: BuiltinFamilyMetadataCoversDiagramKind = true
|
|
165
|
-
|
|
166
|
-
export function builtinFamilyMetadata(kind: DiagramKind): BuiltinFamilyMetadata | undefined {
|
|
167
|
-
return BUILTIN_FAMILY_METADATA.find(f => f.id === kind)
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
const REGISTRY = new Map<DiagramKind, FamilyPlugin>()
|
|
171
|
-
|
|
172
|
-
export function registerFamily(plugin: FamilyPlugin): void {
|
|
173
|
-
REGISTRY.set(plugin.id, plugin)
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
export function getFamily(kind: DiagramKind): FamilyPlugin | undefined {
|
|
177
|
-
return REGISTRY.get(kind)
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
export function knownFamilies(): DiagramKind[] {
|
|
181
|
-
const builtinIds = new Set<DiagramKind>(BUILTIN_FAMILY_METADATA.map(f => f.id))
|
|
182
|
-
const builtins = BUILTIN_FAMILY_METADATA
|
|
183
|
-
.map(f => f.id)
|
|
184
|
-
.filter(id => REGISTRY.has(id))
|
|
185
|
-
const external = Array.from(REGISTRY.keys())
|
|
186
|
-
.filter(id => !builtinIds.has(id))
|
|
187
|
-
.sort()
|
|
188
|
-
return [...builtins, ...external]
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
// ---- Generic label extractor ----------------------------------------------
|
|
192
|
-
//
|
|
193
|
-
// Catches the common Mermaid label idioms used across families:
|
|
194
|
-
// - quoted strings: "Foo", 'Foo'
|
|
195
|
-
// - bracketed text: [Foo], (Foo), {Foo}, [[Foo]], [(Foo)], [/Foo/], etc.
|
|
196
|
-
// - colon-separated text: `A->>B: Foo`, `2020 : Foo`, `title Foo`
|
|
197
|
-
//
|
|
198
|
-
// Best-effort by design — used as a fallback when a family doesn't ship its
|
|
199
|
-
// own extractor. Over-counting (some matches are syntax, not labels) is
|
|
200
|
-
// acceptable because LABEL_OVERFLOW only fires on text exceeding the cap.
|
|
201
|
-
// ---------------------------------------------------------------------------
|
|
202
|
-
|
|
203
|
-
export function extractLabelsGeneric(source: string): ExtractedLabel[] {
|
|
204
|
-
const out: ExtractedLabel[] = []
|
|
205
|
-
const lines = source.split(/\r?\n/)
|
|
206
|
-
let i = 0
|
|
207
|
-
for (const raw of lines) {
|
|
208
|
-
i++
|
|
209
|
-
const line = raw.trim()
|
|
210
|
-
if (!line || line.startsWith('%%')) continue
|
|
211
|
-
// Quoted strings first (highest precedence — they're explicit labels).
|
|
212
|
-
for (const m of line.matchAll(/"([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)'/g)) {
|
|
213
|
-
const text = m[1] ?? m[2] ?? ''
|
|
214
|
-
if (text) out.push({ text, target: `line${i}` })
|
|
215
|
-
}
|
|
216
|
-
// Bracketed text (square, paren, curly — any nesting depth handled flatly).
|
|
217
|
-
for (const m of line.matchAll(/[\[\(\{]+([^\[\]\(\)\{\}]+?)[\]\)\}]+/g)) {
|
|
218
|
-
const text = (m[1] ?? '').trim()
|
|
219
|
-
if (text && !text.match(/^[A-Za-z_][\w-]*$/)) out.push({ text, target: `line${i}` })
|
|
220
|
-
}
|
|
221
|
-
// Colon-separated suffix (`A->>B: text`, `2020 : text`, `title: text`).
|
|
222
|
-
const colon = line.indexOf(':')
|
|
223
|
-
if (colon >= 0 && colon < line.length - 1) {
|
|
224
|
-
const after = line.slice(colon + 1).trim()
|
|
225
|
-
// Filter: not a CSS-ish value, not another keyword
|
|
226
|
-
if (after && !after.match(/^[\d.]+$/) && after.length >= 2) {
|
|
227
|
-
out.push({ text: after, target: `line${i}` })
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
return out
|
|
232
|
-
}
|