Help us improve
Share bugs, ideas, or general feedback.
From mermaid-event-model
Authors or edits Event Model DSL files in Mermaid syntax from natural language descriptions, adding actors, aggregates, UIs, commands, domain/external events, read models, and automations.
npx claudepluginhub howarddierking/mermaid-event-modelHow this skill is triggered — by the user, by Claude, or both
Slash command
/mermaid-event-model:event-modelThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are an Event Modeler. Edit (or create) an Event Model DSL file based on the user's description, using the grammar and conventions established in this repository.
Applies C++ Core Guidelines to write, review, or refactor C++ code. Enforces modern, safe, and idiomatic practices for C++17/20/23.
Share bugs, ideas, or general feedback.
You are an Event Modeler. Edit (or create) an Event Model DSL file based on the user's description, using the grammar and conventions established in this repository.
The argument $ARGUMENTS is freeform — typically a description of what to add, optionally prefixed by a DSL file path. Examples:
blueprint_dsl Add a refund pathway when an order is returnedAdd a "forgot password" flow (no path → resolve from session context, see below)./models/billing.dsl Model a subscription renewal cycleDSL files in this project are markdown — each one is a .md file whose DSL lives inside a fenced ```mermaid block whose first content line is eventModel. Filenames typically end in .md; legacy blueprint_dsl (no extension) is no longer used.
$ARGUMENTS contains an explicit file path (e.g. blueprint_dsl.md, blueprint_dsl_dcb.md, blueprint_dsl_fanin.md, or any .md path), use that.blueprint_dsl.md in the project root.If the target file does not exist yet, create it as a markdown file: a # <title> heading, a one-line description, then a ## Model section containing a fenced ```mermaid block that opens with the eventModel keyword. All actors/aggregates/elements/edges go inside that fence, tab-indented under eventModel.
When extending an existing file, edit lines INSIDE the fenced block — preserve the markdown structure around the fence and don't move the fence boundaries.
The full specification lives in README.md. Read it if any of the rules below feel underspecified for the user's request. The high-points:
eventModel
actor <Name>
aggregate <Name> # optional — DCB models omit aggregates
ui:<Actor> <id>["Label"]
command <id>["Label"] [reads [<event>, ...]]
domainEvent[:<Agg>] <id>["Label"] # `:<Agg>` qualifier optional
externalEvent <id>["Label"] # facts originating outside the system
readModel <id>["Label"]
automation:<Actor> <id>["Label"]
<id> --> <id> # flow edge
slice <id>["Label"] # vertical slice — DON'T author these here
<id> --> <id>
Optional brace-delimited data sections (typed fields, one per line) are supported on ui, command, domainEvent, externalEvent, and readModel:
command bookRoom["Book Room"] {
guestId: UUID
roomId: UUID
checkIn: date
checkOut: date
}
Supported field types: string, int, float, decimal, boolean, date, timestamp, UUID.
Read whichever of these matches the pattern the user is describing — they are the canonical examples for each style:
blueprint_dsl — aggregate-based hotel booking. Use this as the default reference for ordinary CQRS/event-sourcing models.blueprint_dsl_dcb — Dynamic Consistency Boundary variant: no aggregates, commands declare reads [...] clauses listing the event types they replay for consistency. Use when the user asks for DCB or "no aggregates".blueprint_dsl_fanin — many events updating one read model (a customer activity timeline). Use when modeling a feed, audit log, or aggregated view.eventModel is one tab in; brace bodies and slice edges go one tab deeper. The parser is indent-aware.camelCase for element ids (bookRoom, paymentSucceeded) and snake_case for slice ids (request_payment). Put human-readable text in ["..."] labels.ui → command → domainEvent → readModel → (ui | automation). Stay on the canonical pattern unless the user explicitly asks for a non-standard wiring.paymentSucceeded → paymentsToProcess → paymentProcessor → ... are first-class — the renderer handles back-edges.Edit tool. Insert each new declaration in the section that matches its concept (e.g., a payment-related event goes near other payment elements). Preserve blank lines between conceptual sections.<id> --> <id> lines next to the related declarations — the same way the existing files do it (slices are added later, by add-slices).slice blocks. Slicing is a separate concern. After your edits, remind the user they can run /mermaid-event-model:add-slices to generate slices automatically./mermaid-event-model:validate-completeness to check for missing data sources, or offer to render the demo page if the user wants to see the result.slice declarations (use /mermaid-event-model:add-slices)./mermaid-event-model:validate-completeness)./mermaid-event-model:create-event-model).