@eventmodelers/cli 1.0.124 → 1.0.125
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/package.json +1 -1
- package/stacks/modeling-kit/templates/.claude/skills/detect-model-drift/SKILL.md +4 -6
- package/stacks/modeling-kit/templates/.claude/skills/discover-storyboard/SKILL.md +2 -1
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-brainstorming-events/SKILL.md +4 -2
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-automation-chains/SKILL.md +6 -4
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-inputs/SKILL.md +6 -4
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-outputs/SKILL.md +7 -5
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-orchestrating-event-modeling/SKILL.md +3 -2
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-storyboarding-events/SKILL.md +2 -1
- package/stacks/modeling-kit/templates/.claude/skills/examples/SKILL.md +2 -1
- package/stacks/modeling-kit/templates/.claude/skills/html-screen/SKILL.md +4 -2
- package/stacks/modeling-kit/templates/.claude/skills/place-element/SKILL.md +10 -6
- package/stacks/modeling-kit/templates/.claude/skills/storyboard/SKILL.md +2 -1
- package/stacks/modeling-kit/templates/.claude/skills/storyboard-screen/SKILL.md +2 -1
- package/stacks/modeling-kit/templates/.claude/skills/timeline/SKILL.md +5 -3
- package/stacks/modeling-kit/templates/.claude/skills/walkthrough/SKILL.md +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eventmodelers/cli",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.125",
|
|
4
4
|
"description": "Eventmodelers CLI — real-time Claude agent + skills for Claude Code, for any stack (Node, Supabase, Axon, OpenCQRS, UmaDB, Kurrent, or modeling-only)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -65,11 +65,10 @@ Index the result in memory: per slice → commands, events, read models, screens
|
|
|
65
65
|
|
|
66
66
|
The code base is the directory resolved in Step 0 (`$EVENTMODELERS_CODE_DIR`, else the current directory) — every path below is relative to it, and it may hold any stack. Find out which, don't assume.
|
|
67
67
|
|
|
68
|
-
**With a `branch` other than the one checked out, read the code from git, never from the working tree:** `git ls-tree -r --name-only $REF [<dir>]` lists the files, `git show $REF:<path>` reads one. That applies to everything below — `.build-kit/CLAUDE.md`, the
|
|
68
|
+
**With a `branch` other than the one checked out, read the code from git, never from the working tree:** `git ls-tree -r --name-only $REF [<dir>]` lists the files, `git show $REF:<path>` reads one. That applies to everything below — `.build-kit/CLAUDE.md`, the slice folders. Never `git checkout`/`git switch`: the working tree may hold someone's uncommitted work. Without `branch`, or when it is the current branch, read the working tree as usual.
|
|
69
69
|
|
|
70
70
|
1. Read `.build-kit/CLAUDE.md` (and `.build-kit/AGENTS.md` if present) — its *Structure* section says where slices live and how they're named (e.g. `src/slices/{slice}/` for Node, `src/main/java/.../slices/{context}/{slice}/` for Axon).
|
|
71
|
-
2.
|
|
72
|
-
3. Without a build kit, infer the layout from the repo (folders named after slices, `*Command*`, `*Event*`, projection/read-model files, route/UI files). If you cannot find any slice structure, stop and tell the user what you looked at — do not fabricate a mapping.
|
|
71
|
+
2. Without a build kit, infer the layout from the repo (folders named after slices, `*Command*`, `*Event*`, projection/read-model files, route/UI files). If you cannot find any slice structure, stop and tell the user what you looked at — do not fabricate a mapping.
|
|
73
72
|
|
|
74
73
|
Build a **code inventory** per slice folder: the command type and its fields, the events it emits and their fields, read-model/projection types and fields, the screens/components/routes wired to it, tests and what they assert, and what each handler/projection/automation reads and writes.
|
|
75
74
|
|
|
@@ -109,9 +108,7 @@ For every finding, pick who should move:
|
|
|
109
108
|
|
|
110
109
|
| Evidence | Fix goes to | How it's done |
|
|
111
110
|
|----------|-------------|---------------|
|
|
112
|
-
|
|
|
113
|
-
| Board differs from the snapshot, code still equals it | **Code** — the model moved on | Set the slice back to `Planned` with `/update-slice-status` so the build kit picks it up again and diffs code against `slice.json` |
|
|
114
|
-
| Both moved, or no snapshot | **Judgement call** — present both options, recommend one | Recommend by which side is more specific/complete |
|
|
111
|
+
| A field, element, spec, screen or edge differs | **Judgement call** — present both options, recommend one | Recommend by which side is more specific/complete. Model fix: `/attributes` (fields), `/timeline` / `/place-element` (elements), `/eventmodeling-elaborating-scenarios` (specs), `/storyboard-screen` or `/html-screen` (screens — including updating every existing screen connected to a changed element, see below). Code fix: set the slice back to `Planned` with `/update-slice-status` so the build kit picks it up again |
|
|
115
112
|
| Slice only in code | **Model** | Add the slice, via `/eventmodeling-slicing-event-models` after placing its elements |
|
|
116
113
|
| Slice missing in code, board says `Done` | **Model status** (it isn't done) | `/update-slice-status` → `Planned` |
|
|
117
114
|
|
|
@@ -190,3 +187,4 @@ Omit empty sections. Say plainly when nothing drifted.
|
|
|
190
187
|
- Fixing drift on the model side means updating the existing screens connected to the changed elements too (pages and `meta.fields`), in place — not just the command/event/read model.
|
|
191
188
|
- `--branch` reads the code via `git ls-tree`/`git show` from that ref — never check it out, the working tree may hold someone's uncommitted work. No `--branch` = the working tree, as before.
|
|
192
189
|
- Always read the MARKDOWN note in the feedback lane of each chapter's first column first — it is the chapter's context, and differences it explains are not drift.
|
|
190
|
+
- `.build-kit/.slices` is no evidence for the direction of a fix: every fetch, `/load-slice` and runner loop rewrites it, so it holds the last fetch, not what the code was built from — reading it as "the build" recommends undoing board changes. The direction is a judgement call.
|
package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-brainstorming-events/SKILL.md
CHANGED
|
@@ -116,7 +116,8 @@ mcp__eventmodelers__submit_node_events {
|
|
|
116
116
|
"eventType": "node:changed",
|
|
117
117
|
"nodeId": "<chapterId>",
|
|
118
118
|
"meta": {"type": "CHAPTER", "title": "Reservation & Lending"}
|
|
119
|
-
}]
|
|
119
|
+
}],
|
|
120
|
+
"compact": true
|
|
120
121
|
}
|
|
121
122
|
```
|
|
122
123
|
|
|
@@ -219,7 +220,8 @@ mcp__eventmodelers__submit_node_events {
|
|
|
219
220
|
{"name": "reservedAt", "type": "DateTime", "example": "2026-05-29T10:00:00Z"}
|
|
220
221
|
]
|
|
221
222
|
}
|
|
222
|
-
}]
|
|
223
|
+
}],
|
|
224
|
+
"compact": true
|
|
223
225
|
}
|
|
224
226
|
```
|
|
225
227
|
|
|
@@ -88,7 +88,8 @@ mcp__eventmodelers__place_element {
|
|
|
88
88
|
"elementType": "READMODEL",
|
|
89
89
|
"title": "NotificationsToSend",
|
|
90
90
|
"columnIndex": <automationColumnIndex - 1>
|
|
91
|
-
}]
|
|
91
|
+
}],
|
|
92
|
+
"compact": true
|
|
92
93
|
}
|
|
93
94
|
```
|
|
94
95
|
Then set `meta.fields` and `meta.listElement: true` on the returned node id:
|
|
@@ -98,7 +99,8 @@ mcp__eventmodelers__submit_node_events {
|
|
|
98
99
|
"events": [{
|
|
99
100
|
"id": "<event-uuid>", "eventType": "node:changed", "nodeId": "<returned-node-id>",
|
|
100
101
|
"meta": {"type": "READMODEL", "title": "NotificationsToSend", "fields": [...], "listElement": true}
|
|
101
|
-
}]
|
|
102
|
+
}],
|
|
103
|
+
"compact": true
|
|
102
104
|
}
|
|
103
105
|
```
|
|
104
106
|
|
|
@@ -114,11 +116,11 @@ For a **translation-chain automation**, place its three columns left to right in
|
|
|
114
116
|
|
|
115
117
|
1. **READMODEL → AUTOMATION first** — the automation reads its own todo list. The closing connection below is only accepted once this edge exists.
|
|
116
118
|
```
|
|
117
|
-
mcp__eventmodelers__set_connection { "boardId": "<BOARD_ID>", "connections": [{ "source": "<readmodelNodeId>", "target": "<automationNodeId>", "action": "connect" }] }
|
|
119
|
+
mcp__eventmodelers__set_connection { "boardId": "<BOARD_ID>", "connections": [{ "source": "<readmodelNodeId>", "target": "<automationNodeId>", "action": "connect" }], "compact": true }
|
|
118
120
|
```
|
|
119
121
|
2. **Every opening EVENT → READMODEL.**
|
|
120
122
|
```
|
|
121
|
-
mcp__eventmodelers__set_connection { "boardId": "<BOARD_ID>", "connections": [{ "source": "<openingEventNodeId>", "target": "<readmodelNodeId>", "action": "connect" }] }
|
|
123
|
+
mcp__eventmodelers__set_connection { "boardId": "<BOARD_ID>", "connections": [{ "source": "<openingEventNodeId>", "target": "<readmodelNodeId>", "action": "connect" }], "compact": true }
|
|
122
124
|
```
|
|
123
125
|
3. **Every closing EVENT → READMODEL — worker-stage todo lists only.** Including the automation's own resulting event, even though that event is produced by the command this same automation issues. This is not a backward arrow: `EVENT → READMODEL` connections are exempt from column ordering when the read model already has a `READMODEL → AUTOMATION` edge (see `learn-eventmodelers-api` §3) — this todo-list read model qualifies because of the edge from step 1 above. A read model in this shape is a live projection, not a frozen snapshot — a later event closing an earlier-opened item is the normal case, not an exception to reach for only when convenient. **Do not add this edge for a translation automation's todo list** — it has no closing event at all (see the translation-chain rule above); wiring one back is a modeling error, not a convenience.
|
|
124
126
|
|
package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-inputs/SKILL.md
CHANGED
|
@@ -151,7 +151,8 @@ mcp__eventmodelers__place_element {
|
|
|
151
151
|
"elements": [{
|
|
152
152
|
"elementType": "COMMAND",
|
|
153
153
|
"title": "ReserveBike"
|
|
154
|
-
}]
|
|
154
|
+
}],
|
|
155
|
+
"compact": true
|
|
155
156
|
}
|
|
156
157
|
```
|
|
157
158
|
`place_element` finds/creates the empty cell in the interaction lane in the correct column and places the node. Pass each entry's `fields` in the same call when the attributes are already known; otherwise follow up with `submit_node_events` (`node:changed`) to set `meta.fields` (with `mapping`/`generated`/`cardinality` per the rules above) on the node it returned:
|
|
@@ -171,7 +172,8 @@ mcp__eventmodelers__submit_node_events {
|
|
|
171
172
|
{"name": "startTime", "type": "DateTime", "example": "2026-06-01T09:00:00Z","mapping": "user-input"}
|
|
172
173
|
]
|
|
173
174
|
}
|
|
174
|
-
}]
|
|
175
|
+
}],
|
|
176
|
+
"compact": true
|
|
175
177
|
}
|
|
176
178
|
```
|
|
177
179
|
|
|
@@ -203,7 +205,7 @@ After `place-element` returns the COMMAND node ID, create the arrows that comple
|
|
|
203
205
|
```
|
|
204
206
|
Read `cells["<actorRowId>-<columnId>"]` for the occupying node id (a cell id absent from that sparse array is empty — no SCREEN placed yet). Then connect with the type-checked edge tool, which auto-corrects direction and skips duplicates:
|
|
205
207
|
```
|
|
206
|
-
mcp__eventmodelers__set_connection { "boardId": "<BOARD_ID>", "connections": [{ "source": "<screenNodeId>", "target": "<commandNodeId>", "action": "connect" }] }
|
|
208
|
+
mcp__eventmodelers__set_connection { "boardId": "<BOARD_ID>", "connections": [{ "source": "<screenNodeId>", "target": "<commandNodeId>", "action": "connect" }], "compact": true }
|
|
207
209
|
```
|
|
208
210
|
If wiring more than one COMMAND in the same pass, put every SCREEN→COMMAND and COMMAND→EVENT pair across all of them into one `set_connection` call's `connections` array (see step 2 below) instead of one call per pair.
|
|
209
211
|
|
|
@@ -219,7 +221,7 @@ After `place-element` returns the COMMAND node ID, create the arrows that comple
|
|
|
219
221
|
```
|
|
220
222
|
Read `cells["<swimlaneRowId>-<columnId>"]` for the occupying node id, then:
|
|
221
223
|
```
|
|
222
|
-
mcp__eventmodelers__set_connection { "boardId": "<BOARD_ID>", "connections": [{ "source": "<commandNodeId>", "target": "<eventNodeId>", "action": "connect" }] }
|
|
224
|
+
mcp__eventmodelers__set_connection { "boardId": "<BOARD_ID>", "connections": [{ "source": "<commandNodeId>", "target": "<eventNodeId>", "action": "connect" }], "compact": true }
|
|
223
225
|
```
|
|
224
226
|
|
|
225
227
|
**Fallback (no MCP):** see `references/api-fallback.md` — "Wire connections — Step 2: COMMAND → EVENT".
|
package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-outputs/SKILL.md
CHANGED
|
@@ -260,7 +260,8 @@ mcp__eventmodelers__place_element {
|
|
|
260
260
|
"elementType": "READMODEL",
|
|
261
261
|
"title": "ActiveReservationView",
|
|
262
262
|
"columnIndex": <consumerScreenColumnIndex> // or <automationColumnIndex - 1> for an AUTOMATION consumer
|
|
263
|
-
}]
|
|
263
|
+
}],
|
|
264
|
+
"compact": true
|
|
264
265
|
}
|
|
265
266
|
```
|
|
266
267
|
Then set `meta.fields` (with `mapping`/`generated`/`cardinality`) — and `meta.listElement: true` if this read model is list-shaped — on the returned node id:
|
|
@@ -270,7 +271,8 @@ mcp__eventmodelers__submit_node_events {
|
|
|
270
271
|
"events": [{
|
|
271
272
|
"id": "<event-uuid>", "eventType": "node:changed", "nodeId": "<returned-node-id>",
|
|
272
273
|
"meta": {"type": "READMODEL", "title": "ActiveReservationView", "fields": [...]}
|
|
273
|
-
}]
|
|
274
|
+
}],
|
|
275
|
+
"compact": true
|
|
274
276
|
}
|
|
275
277
|
```
|
|
276
278
|
To determine the consumer's column index beforehand, or to check whether a specific interaction cell is already occupied (`get_nodes` filters by `type`, `name`, `chapterId` and `nodeIds`, but has no `cellId` filter — see the note under "Wire connections" below), fetch the chapter and read its cell map — `projection: "cells"` returns just `{rows, columns, cells}`, not the whole chapter node:
|
|
@@ -327,7 +329,7 @@ After `place-element` returns the READMODEL node ID, create the arrows that comp
|
|
|
327
329
|
```
|
|
328
330
|
mcp__eventmodelers__get_node { "boardId": "<BOARD_ID>", "nodeId": "<CHAPTER_ID>", "projection": "cells" }
|
|
329
331
|
# → read cells["<swimlaneRowId>-<columnId>"] for the occupying node id
|
|
330
|
-
mcp__eventmodelers__set_connection { "boardId": "<BOARD_ID>", "connections": [{ "source": "<eventNodeId>", "target": "<readmodelNodeId>", "action": "connect" }] }
|
|
332
|
+
mcp__eventmodelers__set_connection { "boardId": "<BOARD_ID>", "connections": [{ "source": "<eventNodeId>", "target": "<readmodelNodeId>", "action": "connect" }], "compact": true }
|
|
331
333
|
```
|
|
332
334
|
|
|
333
335
|
**Fallback (no MCP):** see `references/api-fallback.md` — "Step 5h.1 — Wire EVENT → READMODEL".
|
|
@@ -336,7 +338,7 @@ After `place-element` returns the READMODEL node ID, create the arrows that comp
|
|
|
336
338
|
|
|
337
339
|
**Prefer MCP:**
|
|
338
340
|
```
|
|
339
|
-
mcp__eventmodelers__set_connection { "boardId": "<BOARD_ID>", "connections": [{ "source": "<readmodelNodeId>", "target": "<screenNodeId>", "action": "connect" }] }
|
|
341
|
+
mcp__eventmodelers__set_connection { "boardId": "<BOARD_ID>", "connections": [{ "source": "<readmodelNodeId>", "target": "<screenNodeId>", "action": "connect" }], "compact": true }
|
|
340
342
|
```
|
|
341
343
|
|
|
342
344
|
**Fallback (no MCP):** see `references/api-fallback.md` — "Step 5h.2 — Wire READMODEL → SCREEN".
|
|
@@ -347,7 +349,7 @@ After `place-element` returns the READMODEL node ID, create the arrows that comp
|
|
|
347
349
|
|
|
348
350
|
**Prefer MCP:**
|
|
349
351
|
```
|
|
350
|
-
mcp__eventmodelers__set_connection { "boardId": "<BOARD_ID>", "connections": [{ "source": "<readmodelNodeId>", "target": "<automationNodeId>", "action": "connect" }] }
|
|
352
|
+
mcp__eventmodelers__set_connection { "boardId": "<BOARD_ID>", "connections": [{ "source": "<readmodelNodeId>", "target": "<automationNodeId>", "action": "connect" }], "compact": true }
|
|
351
353
|
```
|
|
352
354
|
|
|
353
355
|
**Fallback (no MCP):** see `references/api-fallback.md` — "Step 5h.3 — Wire READMODEL → AUTOMATION".
|
|
@@ -163,7 +163,7 @@ For a "what is on the board and how is it wired right now" check between steps
|
|
|
163
163
|
|
|
164
164
|
**Structural validation is one call, not a scan.** `validate_model` (`{boardId, chapterId}`) runs the whole structural checklist server-side — unplaced nodes, backward arrows (todo-list exception applied), zero/multi-issuer commands, sourceless read models, two-screens-in-a-column, missing scenarios — and returns only `findings`. Use it for the mandatory post-step unplaced check and as the first move in Step 9, instead of per-type `get_nodes` loops and `get_node` `projection: "edges"` spot-checks.
|
|
165
165
|
|
|
166
|
-
**Ask echo-heavy write tools for less.** `add_scenario`, `add_storyline`, `set_connection` and `submit_node_events` each accept `compact: true`, which drops the full-object echo from the response (returning `{specNodeId, added, count, isNewNode}`, a `{connected, existed, removed, notFound, failed, errors}` tally, or `{persisted: <count>}` respectively). Pass it
|
|
166
|
+
**Ask echo-heavy write tools for less.** `place_element`, `add_scenario`, `add_storyline`, `set_connection` and `submit_node_events` each accept `compact: true`, which drops the full-object echo from the response (returning `{nodeId, cellName, columnIndex}` per placed node, `{specNodeId, added, count, isNewNode}`, a `{connected, existed, removed, notFound, failed, errors}` tally, or `{persisted: <count>}` respectively). Pass it by default — every example in these skills does — and drop it only when a later step reads a field the compact form leaves out (e.g. `place_element`'s `autoConnected` edge list). Failures are still reported in full either way.
|
|
167
167
|
|
|
168
168
|
### Documenting decisions inline, at any step
|
|
169
169
|
|
|
@@ -440,7 +440,8 @@ Not delegated to a separate skill — performed directly by this orchestrating s
|
|
|
440
440
|
"id": "<event-uuid>", "eventType": "node:created", "nodeId": "<node-uuid>",
|
|
441
441
|
"chapterId": "$CHAPTER_ID", "cellId": "<feedbackLaneId>-<firstColumnId>",
|
|
442
442
|
"meta": { "type": "MARKDOWN", "title": "Modeling Reasoning — <Chapter Name>", "description": "<full markdown body>" }
|
|
443
|
-
}]
|
|
443
|
+
}],
|
|
444
|
+
"compact": true
|
|
444
445
|
}
|
|
445
446
|
```
|
|
446
447
|
|
|
@@ -105,7 +105,8 @@ mcp__eventmodelers__submit_node_events {
|
|
|
105
105
|
"marks": [{"id": "em-abc123", "color": "#e74c3c", "pageIndex": 0, "blurOutside": true, "whiteOutside": false}],
|
|
106
106
|
"fields": [...]
|
|
107
107
|
}
|
|
108
|
-
}]
|
|
108
|
+
}],
|
|
109
|
+
"compact": true
|
|
109
110
|
}
|
|
110
111
|
```
|
|
111
112
|
|
|
@@ -181,7 +182,8 @@ mcp__eventmodelers__submit_node_events {
|
|
|
181
182
|
"meta": { "type": "HTML_SCREEN", "fields": [
|
|
182
183
|
{"name": "status", "type": "String", "example": "confirmed", "mapping": "ActiveReservationView.status", "cardinality": "Single"}
|
|
183
184
|
] }
|
|
184
|
-
}]
|
|
185
|
+
}],
|
|
186
|
+
"compact": true
|
|
185
187
|
}
|
|
186
188
|
```
|
|
187
189
|
|
|
@@ -50,7 +50,8 @@ mcp__eventmodelers__place_element {
|
|
|
50
50
|
"columnIndex": <position,
|
|
51
51
|
if given>,
|
|
52
52
|
"fields": [{ "name": "orderId", "type": "String", "example": "ord-1" }]
|
|
53
|
-
}]
|
|
53
|
+
}],
|
|
54
|
+
"compact": true
|
|
54
55
|
}
|
|
55
56
|
```
|
|
56
57
|
|
|
@@ -132,7 +133,8 @@ mcp__eventmodelers__add_scenario {
|
|
|
132
133
|
"boardId": "<BOARD_ID>",
|
|
133
134
|
"timelineId": "<TL>",
|
|
134
135
|
"columnId": "<COL>",
|
|
135
|
-
"scenarios": [ /* same scenario objects as the curl body below */ ]
|
|
136
|
+
"scenarios": [ /* same scenario objects as the curl body below */ ],
|
|
137
|
+
"compact": true
|
|
136
138
|
}
|
|
137
139
|
```
|
|
138
140
|
|
|
@@ -335,7 +337,8 @@ mcp__eventmodelers__submit_node_events {
|
|
|
335
337
|
"cellId": "<CELL_ID>",
|
|
336
338
|
"meta": { "type": "<ELEMENT_TYPE>", "title": "<title>" },
|
|
337
339
|
"node": { "data": { "title": "<title>" } }
|
|
338
|
-
}]
|
|
340
|
+
}],
|
|
341
|
+
"compact": true
|
|
339
342
|
}
|
|
340
343
|
```
|
|
341
344
|
|
|
@@ -356,7 +359,8 @@ mcp__eventmodelers__submit_node_events {
|
|
|
356
359
|
"cellName": "<CELL_NAME>",
|
|
357
360
|
"meta": { "type": "<ELEMENT_TYPE>", "title": "<title>" },
|
|
358
361
|
"node": { "data": { "title": "<title>" } }
|
|
359
|
-
}]
|
|
362
|
+
}],
|
|
363
|
+
"compact": true
|
|
360
364
|
}
|
|
361
365
|
```
|
|
362
366
|
|
|
@@ -385,7 +389,7 @@ Take the inbound edges (`target === COMMAND_NODE_ID`) and resolve their source t
|
|
|
385
389
|
- **2 or more** → keep the edge whose source sits in the COMMAND's own column (the deliberate, same-slice issuer) and remove every other one:
|
|
386
390
|
|
|
387
391
|
```
|
|
388
|
-
mcp__eventmodelers__set_connection { "boardId": "<BOARD_ID>", "connections": [{ "source": "<extra-issuer-node-id>", "target": "<COMMAND_NODE_ID>", "action": "remove" }] }
|
|
392
|
+
mcp__eventmodelers__set_connection { "boardId": "<BOARD_ID>", "connections": [{ "source": "<extra-issuer-node-id>", "target": "<COMMAND_NODE_ID>", "action": "remove" }], "compact": true }
|
|
389
393
|
```
|
|
390
394
|
|
|
391
395
|
If it's not clear which edge is the deliberate one (e.g. neither source sits in the COMMAND's own column), do not guess — leave both edges and post a comment on the COMMAND node via `handle-comment` instead, describing the ambiguity.
|
|
@@ -416,4 +420,4 @@ Timeline: <timelineId>
|
|
|
416
420
|
|
|
417
421
|
## Example — place an EVENT via curl
|
|
418
422
|
|
|
419
|
-
A full worked example (add column → fetch chapter → create node) placing an EVENT called "Order Placed" at the end of a timeline lives in `references/api-fallback.md`'s "Full worked example" section. With MCP connected, the same result is one call: `mcp__eventmodelers__place_element { "boardId": "<BOARD_ID>", "timelineId": "<TIMELINE_ID>", "elements": [{ "elementType": "EVENT", "title": "Order Placed" }] }` (see "Prefer MCP" above).
|
|
423
|
+
A full worked example (add column → fetch chapter → create node) placing an EVENT called "Order Placed" at the end of a timeline lives in `references/api-fallback.md`'s "Full worked example" section. With MCP connected, the same result is one call: `mcp__eventmodelers__place_element { "boardId": "<BOARD_ID>", "timelineId": "<TIMELINE_ID>", "elements": [{ "elementType": "EVENT", "title": "Order Placed" }], "compact": true }` (see "Prefer MCP" above).
|
|
@@ -230,7 +230,8 @@ mcp__eventmodelers__submit_node_events {
|
|
|
230
230
|
"id": "<event-uuid>", "eventType": "node:changed", "nodeId": "<SCREEN_NODE_ID>",
|
|
231
231
|
"changedAttributes": ["meta.fields"],
|
|
232
232
|
"meta": { "type": "HTML_SCREEN", "fields": [ /* planned fields */ ] }
|
|
233
|
-
}]
|
|
233
|
+
}],
|
|
234
|
+
"compact": true
|
|
234
235
|
}
|
|
235
236
|
```
|
|
236
237
|
|
|
@@ -126,7 +126,8 @@ mcp__eventmodelers__submit_node_events {
|
|
|
126
126
|
"meta": { "type": "SCREEN", "fields": [
|
|
127
127
|
{"name": "status", "type": "String", "example": "confirmed", "mapping": "ActiveReservationView.status", "cardinality": "Single"}
|
|
128
128
|
] }
|
|
129
|
-
}]
|
|
129
|
+
}],
|
|
130
|
+
"compact": true
|
|
130
131
|
}
|
|
131
132
|
```
|
|
132
133
|
|
|
@@ -290,7 +290,8 @@ mcp__eventmodelers__submit_node_events {
|
|
|
290
290
|
"cellId": "<CELL_ID>",
|
|
291
291
|
"meta": { "type": "EVENT", "title": "<EventName>" },
|
|
292
292
|
"node": { "id": "<node-uuid>", "data": { "title": "<EventName>" } }
|
|
293
|
-
}]
|
|
293
|
+
}],
|
|
294
|
+
"compact": true
|
|
294
295
|
}
|
|
295
296
|
```
|
|
296
297
|
|
|
@@ -300,7 +301,7 @@ mcp__eventmodelers__submit_node_events {
|
|
|
300
301
|
|
|
301
302
|
**Prefer MCP:** this whole "find/create a column, compute the cell, place the node" sequence collapses into one call:
|
|
302
303
|
```
|
|
303
|
-
mcp__eventmodelers__place_element { "boardId": "<BOARD_ID>", "timelineId": "<CHAPTER_ID>", "elements": [{ "elementType": "EVENT", "title": "<EventName>", "columnIndex": <index> }] }
|
|
304
|
+
mcp__eventmodelers__place_element { "boardId": "<BOARD_ID>", "timelineId": "<CHAPTER_ID>", "elements": [{ "elementType": "EVENT", "title": "<EventName>", "columnIndex": <index> }], "compact": true }
|
|
304
305
|
```
|
|
305
306
|
Extract `nodeId` and `columnId` directly from the tool result.
|
|
306
307
|
|
|
@@ -343,7 +344,8 @@ mcp__eventmodelers__submit_node_events {
|
|
|
343
344
|
"changedAttributes": ["meta.title"],
|
|
344
345
|
"meta": { "type": "EVENT", "title": "<NewTitle>" },
|
|
345
346
|
"node": { "id": "<eventNodeId>", "data": {} }
|
|
346
|
-
}]
|
|
347
|
+
}],
|
|
348
|
+
"compact": true
|
|
347
349
|
}
|
|
348
350
|
```
|
|
349
351
|
|
|
@@ -111,7 +111,7 @@ Per step:
|
|
|
111
111
|
mcp__eventmodelers__post_chat_message {
|
|
112
112
|
"boardId": "$BOARD_ID",
|
|
113
113
|
"replyTo": "<message_id>",
|
|
114
|
-
"text": "Registration in 5 steps —
|
|
114
|
+
"text": "Registration in 5 steps — step through it here, or press Play.",
|
|
115
115
|
"snippet": {
|
|
116
116
|
"kind": "walkthrough",
|
|
117
117
|
"title": "How registration works",
|