@eventmodelers/cli 1.0.36 → 1.0.37

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.
Files changed (69) hide show
  1. package/package.json +1 -1
  2. package/shared/skills/learn-eventmodelers-api/SKILL.md +12 -10
  3. package/stacks/modeling-kit/templates/.claude/skills/add-next-slice/SKILL.md +2 -23
  4. package/stacks/modeling-kit/templates/.claude/skills/add-next-slice/references/api-fallback.md +11 -0
  5. package/stacks/modeling-kit/templates/.claude/skills/analyze-existing-model/SKILL.md +6 -57
  6. package/stacks/modeling-kit/templates/.claude/skills/analyze-existing-model/references/api-fallback.md +68 -0
  7. package/stacks/modeling-kit/templates/.claude/skills/attributes/SKILL.md +4 -61
  8. package/stacks/modeling-kit/templates/.claude/skills/attributes/references/api-fallback.md +39 -0
  9. package/stacks/modeling-kit/templates/.claude/skills/discover-storyboard/SKILL.md +9 -53
  10. package/stacks/modeling-kit/templates/.claude/skills/discover-storyboard/references/api-fallback.md +63 -0
  11. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-applying-conways-law/SKILL.md +9 -319
  12. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-applying-conways-law/references/examples.md +329 -0
  13. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-brainstorming-events/SKILL.md +23 -199
  14. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-brainstorming-events/references/api-fallback.md +97 -0
  15. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-brainstorming-events/references/examples.md +35 -0
  16. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-checking-completeness/SKILL.md +13 -410
  17. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-checking-completeness/references/api-fallback.md +22 -0
  18. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-checking-completeness/references/examples.md +397 -0
  19. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-automation-chains/SKILL.md +132 -0
  20. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-automation-chains/references/api-fallback.md +21 -0
  21. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-event-models/SKILL.md +9 -236
  22. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-event-models/references/examples.md +257 -0
  23. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-elaborating-scenarios/SKILL.md +28 -302
  24. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-elaborating-scenarios/references/api-fallback.md +31 -0
  25. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-elaborating-scenarios/references/examples.md +216 -0
  26. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-inputs/SKILL.md +30 -343
  27. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-inputs/references/api-fallback.md +79 -0
  28. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-inputs/references/examples.md +282 -0
  29. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-outputs/SKILL.md +51 -400
  30. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-outputs/references/api-fallback.md +67 -0
  31. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-outputs/references/examples.md +273 -0
  32. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/SKILL.md +45 -152
  33. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/domain-patterns.md +49 -90
  34. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/patterns.md +64 -137
  35. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-orchestrating-event-modeling/SKILL.md +74 -65
  36. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-orchestrating-event-modeling/references/api-fallback.md +51 -0
  37. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-plotting-events/SKILL.md +1 -5
  38. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-plotting-events/references/api-fallback.md +10 -0
  39. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/SKILL.md +19 -36
  40. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/references/api-fallback.md +41 -0
  41. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/references/examples.md +12 -9
  42. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/references/patterns.md +1 -10
  43. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-storyboarding-events/SKILL.md +26 -332
  44. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-storyboarding-events/references/api-fallback.md +77 -0
  45. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-storyboarding-events/references/examples.md +271 -0
  46. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-translating-external-events/SKILL.md +9 -294
  47. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-translating-external-events/references/examples.md +306 -0
  48. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models/SKILL.md +12 -11
  49. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models/references/api-fallback.md +14 -0
  50. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models-checklist/SKILL.md +6 -36
  51. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models-checklist/references/api-fallback.md +14 -0
  52. package/stacks/modeling-kit/templates/.claude/skills/examples/SKILL.md +3 -110
  53. package/stacks/modeling-kit/templates/.claude/skills/examples/references/api-fallback.md +118 -0
  54. package/stacks/modeling-kit/templates/.claude/skills/handle-comment/SKILL.md +5 -25
  55. package/stacks/modeling-kit/templates/.claude/skills/handle-comment/references/api-fallback.md +35 -0
  56. package/stacks/modeling-kit/templates/.claude/skills/html-screen/SKILL.md +9 -44
  57. package/stacks/modeling-kit/templates/.claude/skills/html-screen/references/api-fallback.md +51 -0
  58. package/stacks/modeling-kit/templates/.claude/skills/place-element/SKILL.md +23 -183
  59. package/stacks/modeling-kit/templates/.claude/skills/place-element/references/api-fallback.md +193 -0
  60. package/stacks/modeling-kit/templates/.claude/skills/storyboard/SKILL.md +14 -81
  61. package/stacks/modeling-kit/templates/.claude/skills/storyboard/references/api-fallback.md +74 -0
  62. package/stacks/modeling-kit/templates/.claude/skills/storyboard-screen/SKILL.md +4 -45
  63. package/stacks/modeling-kit/templates/.claude/skills/storyboard-screen/references/api-fallback.md +44 -0
  64. package/stacks/modeling-kit/templates/.claude/skills/timeline/SKILL.md +19 -88
  65. package/stacks/modeling-kit/templates/.claude/skills/timeline/references/api-fallback.md +91 -0
  66. package/stacks/modeling-kit/templates/.claude/skills/update-prompt-status/SKILL.md +1 -9
  67. package/stacks/modeling-kit/templates/.claude/skills/update-prompt-status/references/api-fallback.md +14 -0
  68. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-integrating-legacy-systems/SKILL.md +0 -674
  69. package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/snapshotting.md +0 -204
@@ -7,7 +7,7 @@ description: Build a complete visual storyboard with AI-generated screens from a
7
7
 
8
8
  > **Before doing anything else**, invoke the `connect` skill — if not already connected — to resolve `TOKEN`, `BOARD_ID`, and `BASE_URL`. Do not proceed until the connect skill has completed.
9
9
 
10
- Prefer `mcp__eventmodelers__*` tools when available (registered by the `connect` skill) — the curl blocks below are the fallback for sessions without MCP connected.
10
+ Prefer `mcp__eventmodelers__*` tools when available (registered by the `connect` skill) — `references/api-fallback.md` has the curl fallback for every MCP call below, for sessions without MCP connected.
11
11
 
12
12
  > **HTML is the default content type**: every screen this skill creates is a real HTML/CSS mockup (`contentType: "html"`, HTML_SCREEN node) unless the user's request explicitly asks for a "sketch", "wireframe", or "low-fidelity mockup" — only then does a screen use the sketch path (`contentType: "sketch"`, plain SCREEN node) described under "Sketch path (explicit request only)" below. Decide this once per storyboard, before Step 2 — do not mix content types across screens in the same storyboard unless the user asked for that mix.
13
13
 
@@ -43,14 +43,7 @@ Then **create one task per screen** using TaskCreate, naming each task after the
43
43
 
44
44
  ## HTML page design (default)
45
45
 
46
- Write normal, full-size HTML/CSS for each screen as if designing a real webpage, not a tiny thumbnail. The canvas node renders this at a real page width and visually scales it down to fit, so there is no need to shrink font sizes or padding.
47
-
48
- - Each page is one complete, standalone HTML fragment — not a `data-step` div nested inside a shared blob. A multi-step flow is multiple pages, each fully self-contained.
49
- - Inline styles (`style="..."`) are the simplest way to keep each page self-contained.
50
- - No `<script>` tags, no inline event handlers (`onclick`, `onload`, ...), no `javascript:` URIs — these are stripped server-side before persisting. This is a static visual mockup, not an interactive prototype.
51
- - A real page background (e.g. a light gray full-bleed background behind a centered white card) reads more realistically than a bare form floating on white.
52
- - Don't add `<html>`/`<head>`/`<body>` tags — every page is a body-only fragment; the canvas wraps it at render time.
53
- - Bulma CSS (0.9.4) is loaded by default — classes like `title`, `button`, `is-primary`, `field`/`control`/`input` etc. all work out of the box. Headings need a size modifier too, e.g. `class="title is-1"`.
46
+ Design each page as real, full-size HTML/CSS following the `html-screen` skill's conventions: full-size markup (16px body text, generous padding the canvas scales it down, don't shrink it yourself), one complete self-contained fragment per page (no `<html>`/`<head>`/`<body>` wrapper), no `<script>`/inline handlers (stripped server-side), and Bulma CSS classes (`title`, `button`, `is-primary`, `field`/`control`/`input`, etc. remember heading size modifiers like `class="title is-1"`) since Bulma 0.9.4 is loaded by default.
54
47
 
55
48
  ## Sketch path (explicit request only)
56
49
 
@@ -116,33 +109,21 @@ Keep all coordinates within bounds: gridX 0–50, gridY 0–40.
116
109
  mcp__eventmodelers__create_chapter { "boardId": "<BOARD_ID>", "x": 0, "y": 0 }
117
110
  ```
118
111
 
119
- **Fallback (no MCP):**
120
-
121
- ```bash
122
- curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/chapters" \
123
- -H "Content-Type: application/json" \
124
- -d '{"position":{"x":0,"y":0}}'
125
- ```
126
-
127
- Extract `id` from the response → `CHAPTER_ID`.
112
+ **Fallback (no MCP):** see `references/api-fallback.md` — "Step 3 — Create a chapter".
128
113
 
129
114
  **You now have exactly one `CHAPTER_ID`. Do not create another chapter.**
130
115
 
131
116
  ### Step 4 — Fetch chapter state and build empty-column queue
132
117
 
133
- **Prefer MCP:**
118
+ **Prefer MCP** — `projection: "cells"` returns just `{rows, columns, cells}`, not the whole chapter node:
134
119
 
135
120
  ```
136
- mcp__eventmodelers__get_node { "boardId": "<BOARD_ID>", "nodeId": "<CHAPTER_ID>" }
121
+ mcp__eventmodelers__get_node { "boardId": "<BOARD_ID>", "nodeId": "<CHAPTER_ID>", "projection": "cells" }
137
122
  ```
138
123
 
139
- **Fallback (no MCP):**
124
+ **Fallback (no MCP):** see `references/api-fallback.md` — "Step 4 — Fetch the chapter's grid state".
140
125
 
141
- ```bash
142
- curl -s "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/$CHAPTER_ID"
143
- ```
144
-
145
- Parse `meta.timelineData` from the response:
126
+ Parse the result (`{rows, columns, cells}` directly via MCP, or `meta.timelineData` via the REST fallback):
146
127
  - `rows` — list of row objects, each with `id` and `type`
147
128
  - `columns` — list of column objects, each with `id`
148
129
  - `cells` — list of cell objects, each with `rowId`, `colId`, and optionally `nodeId` (used only to check occupancy)
@@ -159,6 +140,8 @@ Build an **empty-column queue**: for each column (in order), compute `actorCellI
159
140
 
160
141
  Process screens **one at a time**. Do not start the next screen until the current one is fully complete (node created + sketch rendered).
161
142
 
143
+ **Before starting the loop**, if the empty-column queue (Step 4) has fewer entries than N screens, create the shortfall in one call — `mcp__eventmodelers__add_column { "boardId": "<BOARD_ID>", "timelineId": "<CHAPTER_ID>", "count": <N - queue.length> }` returns `columnIds: [...]` — and push each new column onto the queue, rather than calling `add_column` once per screen inside Step 5a whenever the queue runs dry.
144
+
162
145
  **You have ONE chapter (`CHAPTER_ID`). All screens go into this same chapter. Do NOT call the chapter creation endpoint again inside this loop.**
163
146
 
164
147
  Only SCREEN nodes are created. COMMAND and EVENT nodes are not created.
@@ -175,13 +158,7 @@ Only SCREEN nodes are created. COMMAND and EVENT nodes are not created.
175
158
  mcp__eventmodelers__add_column { "boardId": "<BOARD_ID>", "timelineId": "<CHAPTER_ID>" }
176
159
  ```
177
160
 
178
- **Fallback (no MCP):**
179
-
180
- ```bash
181
- curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/timelines/$CHAPTER_ID/columns" \
182
- -H "Content-Type: application/json" \
183
- -d '{}'
184
- ```
161
+ **Fallback (no MCP):** see `references/api-fallback.md` — "Step 5a — Add a column".
185
162
 
186
163
  Extract `columnId` from the response. Compute the actor cell ID directly:
187
164
 
@@ -211,20 +188,7 @@ mcp__eventmodelers__create_screen {
211
188
  }
212
189
  ```
213
190
 
214
- **Fallback (no MCP):**
215
-
216
- ```bash
217
- curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/html-screen-nodes/$SCREEN_NODE_ID" \
218
- -H "x-token: $TOKEN" \
219
- -H "x-board-id: $BOARD_ID" \
220
- -H "x-user-id: agent" \
221
- -H "Content-Type: application/json" \
222
- -d '{
223
- "chapterId": "<CHAPTER_ID>",
224
- "cellId": "<actorCellId>",
225
- "pages": ["<div>...</div>"]
226
- }'
227
- ```
191
+ **Fallback (no MCP):** see `references/api-fallback.md` — "Step 5b — Create the screen node and render it (HTML path)".
228
192
 
229
193
  **Sketch path (explicit request only) — `contentType: "sketch"`, plain SCREEN node:**
230
194
 
@@ -242,33 +206,13 @@ mcp__eventmodelers__create_screen {
242
206
  }
243
207
  ```
244
208
 
245
- **Fallback (no MCP):**
246
-
247
- ```bash
248
- curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/image-nodes/$SCREEN_NODE_ID/sketch" \
249
- -H "x-token: $TOKEN" \
250
- -H "x-board-id: $BOARD_ID" \
251
- -H "x-user-id: agent" \
252
- -H "Content-Type: application/json" \
253
- -d '{
254
- "chapterId": "<CHAPTER_ID>",
255
- "cellId": "<actorCellId>",
256
- "description": {"elements": [...]},
257
- "semanticDescription": "<screenTitle — what this screen shows>"
258
- }'
259
- ```
209
+ **Fallback (no MCP):** see `references/api-fallback.md` — "Step 5b — Create the screen node and render it (sketch path, explicit request only)".
260
210
 
261
211
  Pass the already-computed `actorCellId` directly as `cellId` in either path. Expect success (MCP: `created: true`; curl: `204`). On failure, read the validation error, fix the payload, and retry once before reporting failure.
262
212
 
263
213
  ### Step 5b(ii) — Set field data lineage (mandatory)
264
214
 
265
- Push the `fields` planned in Step 2 onto the node with a `node:changed` call. Every field needs a `mapping`:
266
-
267
- | Field type | `mapping` | Example |
268
- |---|---|---|
269
- | User types a value, sent as a command | `"<CommandTitle>.<fieldName>"` | `"ReserveBike.bikeId"` |
270
- | Displayed data, sourced from a read model | `"<ReadModelTitle>.<fieldName>"` | `"ActiveReservationView.status"` |
271
- | Calculated/formatted only for display | `"derived:<expression>"` | `"derived:formatDuration(durationMinutes)"` |
215
+ Push the `fields` planned in Step 2 onto the node with a `node:changed` call. Every field needs a `mapping` — see the `html-screen` skill's "Step 5 — Define field data lineage" for the full `mapping`-format table (command/session/read-model/derived forms).
272
216
 
273
217
  Name the read model even if it doesn't exist as a board node yet — this skill only creates SCREEN/HTML_SCREEN nodes, never READMODEL nodes or connections. But naming the source is **not optional**: a screen displaying data should almost never have a field with no mapping. Set `cardinality` too (`"Single"` unless it's a repeated/list value).
274
218
 
@@ -285,18 +229,7 @@ mcp__eventmodelers__submit_node_events {
285
229
  }
286
230
  ```
287
231
 
288
- **Fallback (no MCP):**
289
- ```bash
290
- curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
291
- -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" -H "x-user-id: agent" \
292
- -H "Content-Type: application/json" \
293
- -d '[{
294
- "id": "<event-uuid>", "eventType": "node:changed", "nodeId": "<SCREEN_NODE_ID>",
295
- "boardId": "<BOARD_ID>", "timestamp": <NOW_MS>,
296
- "changedAttributes": ["meta.fields"],
297
- "meta": { "type": "HTML_SCREEN", "fields": [ /* planned fields */ ] }
298
- }]'
299
- ```
232
+ **Fallback (no MCP):** see `references/api-fallback.md` — "Step 5b(ii) — Set field data lineage".
300
233
 
301
234
  ### Step 5c — Mark the task complete
302
235
 
@@ -0,0 +1,74 @@
1
+ # Storyboard — curl Fallback Calls
2
+
3
+ Only needed when MCP is not connected. Every call below has an MCP equivalent in the main SKILL.md — always prefer that.
4
+
5
+ ## Step 3 — Create a chapter
6
+
7
+ ```bash
8
+ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/chapters" \
9
+ -H "Content-Type: application/json" \
10
+ -d '{"position":{"x":0,"y":0}}'
11
+ ```
12
+
13
+ Extract `id` from the response → `CHAPTER_ID`.
14
+
15
+ ## Step 4 — Fetch the chapter's grid state
16
+
17
+ ```bash
18
+ curl -s "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/$CHAPTER_ID"
19
+ ```
20
+
21
+ Read `meta.timelineData` for `{rows, columns, cells}`.
22
+
23
+ ## Step 5a — Add a column
24
+
25
+ ```bash
26
+ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/timelines/$CHAPTER_ID/columns" \
27
+ -H "Content-Type: application/json" \
28
+ -d '{}'
29
+ ```
30
+
31
+ ## Step 5b — Create the screen node and render it (HTML path)
32
+
33
+ ```bash
34
+ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/html-screen-nodes/$SCREEN_NODE_ID" \
35
+ -H "x-token: $TOKEN" \
36
+ -H "x-board-id: $BOARD_ID" \
37
+ -H "x-user-id: agent" \
38
+ -H "Content-Type: application/json" \
39
+ -d '{
40
+ "chapterId": "<CHAPTER_ID>",
41
+ "cellId": "<actorCellId>",
42
+ "pages": ["<div>...</div>"]
43
+ }'
44
+ ```
45
+
46
+ ## Step 5b — Create the screen node and render it (sketch path, explicit request only)
47
+
48
+ ```bash
49
+ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/image-nodes/$SCREEN_NODE_ID/sketch" \
50
+ -H "x-token: $TOKEN" \
51
+ -H "x-board-id: $BOARD_ID" \
52
+ -H "x-user-id: agent" \
53
+ -H "Content-Type: application/json" \
54
+ -d '{
55
+ "chapterId": "<CHAPTER_ID>",
56
+ "cellId": "<actorCellId>",
57
+ "description": {"elements": [...]},
58
+ "semanticDescription": "<screenTitle — what this screen shows>"
59
+ }'
60
+ ```
61
+
62
+ ## Step 5b(ii) — Set field data lineage
63
+
64
+ ```bash
65
+ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
66
+ -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" -H "x-user-id: agent" \
67
+ -H "Content-Type: application/json" \
68
+ -d '[{
69
+ "id": "<event-uuid>", "eventType": "node:changed", "nodeId": "<SCREEN_NODE_ID>",
70
+ "boardId": "<BOARD_ID>", "timestamp": <NOW_MS>,
71
+ "changedAttributes": ["meta.fields"],
72
+ "meta": { "type": "HTML_SCREEN", "fields": [ /* planned fields */ ] }
73
+ }]'
74
+ ```
@@ -38,17 +38,7 @@ If `nodeId` refers to a screen that has already been rendered (i.e. this is an a
38
38
  mcp__eventmodelers__get_image_snapshot_description { "boardId": "<BOARD_ID>", "nodeId": "<NODE_ID>" }
39
39
  ```
40
40
 
41
- **Fallback (no MCP):**
42
-
43
- ```bash
44
- curl -s "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/images/$NODE_ID/description" \
45
- -H "x-token: $TOKEN" \
46
- -H "x-board-id: $BOARD_ID" \
47
- -H "x-user-id: agent"
48
- ```
49
-
50
- - `200` — returns the previously stored `{ elements: [...] }`. Use this as the base and apply only the requested change (e.g. edit one element's `text`/`fill`, add/remove a specific element) — leave everything else untouched.
51
- - `404` — no description stored yet (e.g. an older screen rendered before this endpoint existed, or a placeholder node). Fall back to designing from scratch in Step 3.
41
+ **Fallback (no MCP):** see `references/api-fallback.md` — "Step 2 — Load existing description".
52
42
 
53
43
  Skip this step entirely when the node is brand-new (no prior render) — go straight to Step 3.
54
44
 
@@ -116,29 +106,11 @@ mcp__eventmodelers__render_screen {
116
106
  }
117
107
  ```
118
108
 
119
- **Fallback (no MCP):**
120
-
121
- ```bash
122
- curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/images/$NODE_ID/sketch" \
123
- -H "x-token: $TOKEN" \
124
- -H "x-board-id: $BOARD_ID" \
125
- -H "x-user-id: agent" \
126
- -H "Content-Type: application/json" \
127
- -d '{"description": "<what this screen shows>", "elements": [...]}'
128
- ```
129
-
130
- Expect `204 No Content` on success.
109
+ **Fallback (no MCP):** see `references/api-fallback.md` — "Step 4 — Render the sketch".
131
110
 
132
111
  ## Step 5 — Define field data lineage (mandatory)
133
112
 
134
- Every screen — new or updated — needs `meta.fields`: one entry per piece of data the screen displays or captures, each with a `mapping` naming where that data comes from. A screen with only a title and no fields is an empty placeholder from a data-lineage standpoint, even once the wireframe is rendered.
135
-
136
- | Field type | `mapping` | Example |
137
- |---|---|---|
138
- | User types a value, sent as a command | `"<CommandTitle>.<fieldName>"` | `"ReserveBike.bikeId"` |
139
- | Read from session | `"session:<fieldName>"` | `"session:customerId"` |
140
- | Displayed data, sourced from a read model | `"<ReadModelTitle>.<fieldName>"` | `"ActiveReservationView.status"` |
141
- | Calculated/formatted only for display | `"derived:<expression>"` | `"derived:formatDuration(durationMinutes)"` |
113
+ Every screen — new or updated — needs `meta.fields`: one entry per piece of data the screen displays or captures, each with a `mapping` naming where that data comes from. A screen with only a title and no fields is an empty placeholder from a data-lineage standpoint, even once the wireframe is rendered. See the `html-screen` skill's "Step 5 — Define field data lineage" for the full `mapping`-format table (command/session/read-model/derived forms).
142
114
 
143
115
  Name the read model even if it doesn't exist as a board node yet — this skill only renders the screen, it does not create READMODEL nodes or connections. But naming the source is **not optional**: a screen displaying data should almost never have a field with no mapping. If you can't say which read model a displayed field comes from, that's a sign the model is missing something — not a reason to skip the field.
144
116
 
@@ -159,20 +131,7 @@ mcp__eventmodelers__submit_node_events {
159
131
  }
160
132
  ```
161
133
 
162
- **Fallback (no MCP):**
163
- ```bash
164
- curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
165
- -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" -H "x-user-id: agent" \
166
- -H "Content-Type: application/json" \
167
- -d '[{
168
- "id": "<event-uuid>", "eventType": "node:changed", "nodeId": "<NODE_ID>",
169
- "boardId": "<BOARD_ID>", "timestamp": <NOW_MS>,
170
- "changedAttributes": ["meta.fields"],
171
- "meta": { "type": "SCREEN", "fields": [
172
- {"name": "status", "type": "String", "example": "confirmed", "mapping": "ActiveReservationView.status", "cardinality": "Single"}
173
- ] }
174
- }]'
175
- ```
134
+ **Fallback (no MCP):** see `references/api-fallback.md` — "Step 5 — Define field data lineage".
176
135
 
177
136
  ## Step 6 — Report back
178
137
 
@@ -0,0 +1,44 @@
1
+ # Storyboard Screen Designer — curl Fallback Calls
2
+
3
+ Only needed when MCP is not connected. Every call below has an MCP equivalent in the main SKILL.md — always prefer that.
4
+
5
+ ## Step 2 — Load existing description
6
+
7
+ ```bash
8
+ curl -s "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/images/$NODE_ID/description" \
9
+ -H "x-token: $TOKEN" \
10
+ -H "x-board-id: $BOARD_ID" \
11
+ -H "x-user-id: agent"
12
+ ```
13
+
14
+ - `200` — returns the previously stored `{ elements: [...] }`. Use this as the base and apply only the requested change (e.g. edit one element's `text`/`fill`, add/remove a specific element) — leave everything else untouched.
15
+ - `404` — no description stored yet (e.g. an older screen rendered before this endpoint existed, or a placeholder node). Fall back to designing from scratch in Step 3.
16
+
17
+ ## Step 4 — Render the sketch
18
+
19
+ ```bash
20
+ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/images/$NODE_ID/sketch" \
21
+ -H "x-token: $TOKEN" \
22
+ -H "x-board-id: $BOARD_ID" \
23
+ -H "x-user-id: agent" \
24
+ -H "Content-Type: application/json" \
25
+ -d '{"description": "<what this screen shows>", "elements": [...]}'
26
+ ```
27
+
28
+ Expect `204 No Content` on success.
29
+
30
+ ## Step 5 — Define field data lineage
31
+
32
+ ```bash
33
+ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
34
+ -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" -H "x-user-id: agent" \
35
+ -H "Content-Type: application/json" \
36
+ -d '[{
37
+ "id": "<event-uuid>", "eventType": "node:changed", "nodeId": "<NODE_ID>",
38
+ "boardId": "<BOARD_ID>", "timestamp": <NOW_MS>,
39
+ "changedAttributes": ["meta.fields"],
40
+ "meta": { "type": "SCREEN", "fields": [
41
+ {"name": "status", "type": "String", "example": "confirmed", "mapping": "ActiveReservationView.status", "cardinality": "Single"}
42
+ ] }
43
+ }]'
44
+ ```
@@ -7,7 +7,7 @@ description: Live event storming facilitator — asks questions about any busine
7
7
 
8
8
  > **Before doing anything else**, invoke the `connect` skill — if not already connected — to resolve `TOKEN`, `BOARD_ID`, and `BASE_URL`. Do not proceed until it has completed. Consult `learn-eventmodelers-api` only if you need to look up a specific endpoint or field this file doesn't cover — don't load it eagerly.
9
9
 
10
- > Prefer `mcp__eventmodelers__*` tools when available (registered by the `connect` skill) — the curl blocks below are the fallback for sessions without MCP connected.
10
+ > Prefer `mcp__eventmodelers__*` tools when available (registered by the `connect` skill) — `references/api-fallback.md` has the curl fallback for every MCP call below, for sessions without MCP connected.
11
11
 
12
12
  You are a live event storming facilitator. You discover domain events through conversation — or from any input (pasted text, documents, notes) — and **immediately place them on the board as they emerge**. The timeline grows and evolves in real time. You don't wait until the end.
13
13
 
@@ -38,10 +38,7 @@ Before doing anything else, fetch all chapters (timelines) on the board.
38
38
  mcp__eventmodelers__get_nodes { "boardId": "<BOARD_ID>", "type": "CHAPTER" }
39
39
  ```
40
40
 
41
- **Fallback (no MCP):**
42
- ```bash
43
- curl -s "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=CHAPTER"
44
- ```
41
+ **Fallback (no MCP):** see `references/api-fallback.md` — "Fetch all chapters".
45
42
 
46
43
  **If `timelineId` was provided** (UUID or name), skip directly to [1b — Continuing an existing timeline](#1b--continuing-an-existing-timeline).
47
44
 
@@ -65,28 +62,22 @@ If `timelineId` is provided, first resolve it to a UUID if a name was given inst
65
62
  mcp__eventmodelers__get_nodes { "boardId": "<BOARD_ID>", "type": "CHAPTER" }
66
63
  ```
67
64
 
68
- **Fallback (no MCP):**
69
- ```bash
70
- curl -s "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=CHAPTER"
71
- ```
65
+ **Fallback (no MCP):** see `references/api-fallback.md` — "Fetch all chapters".
72
66
 
73
67
  - If the value looks like a UUID, use it directly as `CHAPTER_ID`.
74
68
  - If it looks like a name, find the CHAPTER node whose `meta.title` matches (case-insensitive) and use its `id` as `CHAPTER_ID`.
75
69
  - If no match is found, tell the user and stop.
76
70
 
77
- Fetch the chapter node to read its grid structure.
71
+ Fetch the chapter node to read its grid structure — `projection: "cells"` returns just `{rows, columns, cells}`, not the whole chapter node.
78
72
 
79
73
  **Prefer MCP:**
80
74
  ```
81
- mcp__eventmodelers__get_node { "boardId": "<BOARD_ID>", "nodeId": "<CHAPTER_ID>" }
75
+ mcp__eventmodelers__get_node { "boardId": "<BOARD_ID>", "nodeId": "<CHAPTER_ID>", "projection": "cells" }
82
76
  ```
83
77
 
84
- **Fallback (no MCP):**
85
- ```bash
86
- curl -s "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/$CHAPTER_ID"
87
- ```
78
+ **Fallback (no MCP):** see `references/api-fallback.md` — "Fetch the chapter's grid state".
88
79
 
89
- From `meta.timelineData`:
80
+ From the result (`{rows, columns, cells}` via MCP's `projection: "cells"`, or `meta.timelineData` via the REST fallback):
90
81
  - `rows` — find the row with `type === "swimlane"` and save its `id` as `swimlaneRowId`
91
82
  - `columns` — ordered list of columns, each with an `id`
92
83
  - `cells` — each cell has `colId`, `rowId`, and optionally `nodeId`
@@ -98,10 +89,7 @@ Then load the existing EVENT nodes.
98
89
  mcp__eventmodelers__get_nodes { "boardId": "<BOARD_ID>", "type": "EVENT" }
99
90
  ```
100
91
 
101
- **Fallback (no MCP):**
102
- ```bash
103
- curl -s "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=EVENT"
104
- ```
92
+ **Fallback (no MCP):** see `references/api-fallback.md` — "Fetch all EVENT nodes".
105
93
 
106
94
  For each EVENT node, find its cell in `timelineData.cells` where `nodeId === event.id`. That cell's `colId` gives the `columnId`. Order events by their column's position in `timelineData.columns`.
107
95
 
@@ -126,12 +114,7 @@ If no `timelineId` is provided, **create the chapter immediately** — before an
126
114
  mcp__eventmodelers__create_chapter { "boardId": "<BOARD_ID>", "x": 0, "y": 0 }
127
115
  ```
128
116
 
129
- **Fallback (no MCP):**
130
- ```bash
131
- curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/chapters" \
132
- -H "Content-Type: application/json" \
133
- -d '{"position":{"x":0,"y":0}}'
134
- ```
117
+ **Fallback (no MCP):** see `references/api-fallback.md` — "Create a new chapter".
135
118
 
136
119
  Extract `id` from the response → `CHAPTER_ID`. If this fails, stop and report the error.
137
120
 
@@ -184,19 +167,16 @@ Compare against the current `events` state:
184
167
 
185
168
  ### 3c — Inspect the timeline and maintain continuity
186
169
 
187
- Before placing any new events, fetch the chapter node to get the current grid state.
170
+ Before placing any new events, fetch the chapter node to get the current grid state — `projection: "cells"` returns just `{rows, columns, cells}`, not the whole chapter node.
188
171
 
189
172
  **Prefer MCP:**
190
173
  ```
191
- mcp__eventmodelers__get_node { "boardId": "<BOARD_ID>", "nodeId": "<CHAPTER_ID>" }
174
+ mcp__eventmodelers__get_node { "boardId": "<BOARD_ID>", "nodeId": "<CHAPTER_ID>", "projection": "cells" }
192
175
  ```
193
176
 
194
- **Fallback (no MCP):**
195
- ```bash
196
- curl -s "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/$CHAPTER_ID"
197
- ```
177
+ **Fallback (no MCP):** see `references/api-fallback.md` — "Fetch the chapter's grid state".
198
178
 
199
- From `meta.timelineData`:
179
+ From the result (`rows`/`columns`/`cells` directly via MCP, or under `meta.timelineData` via the REST fallback):
200
180
  - Read `rows` to find and save `swimlaneRowId` (the row whose `type === "swimlane"`).
201
181
  - Identify **empty columns**: columns where no cell has a `nodeId` set.
202
182
 
@@ -214,10 +194,7 @@ emptyColumns = [columnId, ...] // in column order, ready to reuse
214
194
  mcp__eventmodelers__delete_column { "boardId": "<BOARD_ID>", "timelineId": "<CHAPTER_ID>", "columnId": "<columnId>" }
215
195
  ```
216
196
 
217
- **Fallback (no MCP):**
218
- ```bash
219
- curl -s -X DELETE "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/timelines/$CHAPTER_ID/columns/<columnId>"
220
- ```
197
+ **Fallback (no MCP):** see `references/api-fallback.md` — "Delete a column".
221
198
 
222
199
  Make all necessary API calls for this turn before responding to the user. The board is updated **before** you summarise what changed.
223
200
 
@@ -279,23 +256,7 @@ mcp__eventmodelers__submit_node_events {
279
256
  }
280
257
  ```
281
258
 
282
- **Fallback (no MCP):**
283
- ```bash
284
- curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
285
- -H "Content-Type: application/json" \
286
- -H "x-user-id: timeline-skill" \
287
- -d '[{
288
- "id": "<event-uuid>",
289
- "eventType": "node:created",
290
- "nodeId": "<node-uuid>",
291
- "boardId": "<BOARD_ID>",
292
- "timestamp": <Date.now()>,
293
- "chapterId": "<CHAPTER_ID>",
294
- "cellId": "<CELL_ID>",
295
- "meta": { "type": "EVENT", "title": "<EventName>" },
296
- "node": { "id": "<node-uuid>", "data": { "title": "<EventName>" } }
297
- }]'
298
- ```
259
+ **Fallback (no MCP):** see `references/api-fallback.md` — "Create an EVENT node in a reused empty column".
299
260
 
300
261
  #### If no empty column is available — create one
301
262
 
@@ -350,22 +311,7 @@ mcp__eventmodelers__submit_node_events {
350
311
  }
351
312
  ```
352
313
 
353
- **Fallback (no MCP):**
354
- ```bash
355
- curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
356
- -H "Content-Type: application/json" \
357
- -H "x-user-id: timeline-skill" \
358
- -d '[{
359
- "id": "<new-uuid>",
360
- "eventType": "node:changed",
361
- "nodeId": "<eventNodeId>",
362
- "boardId": "<BOARD_ID>",
363
- "timestamp": <Date.now()>,
364
- "changedAttributes": ["meta.title"],
365
- "meta": { "type": "EVENT", "title": "<NewTitle>" },
366
- "node": { "id": "<eventNodeId>", "data": {} }
367
- }]'
368
- ```
314
+ **Fallback (no MCP):** see `references/api-fallback.md` — "Rename an event".
369
315
 
370
316
  Update your local state: `events[i].title = "<NewTitle>"`.
371
317
 
@@ -380,19 +326,7 @@ Two steps — delete the node, then delete the column:
380
326
  mcp__eventmodelers__delete_node { "boardId": "<BOARD_ID>", "nodeId": "<eventNodeId>" }
381
327
  ```
382
328
 
383
- **Fallback (no MCP):**
384
- ```bash
385
- curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
386
- -H "Content-Type: application/json" \
387
- -H "x-user-id: timeline-skill" \
388
- -d '[{
389
- "id": "<new-uuid>",
390
- "eventType": "node:deleted",
391
- "nodeId": "<eventNodeId>",
392
- "boardId": "<BOARD_ID>",
393
- "timestamp": <Date.now()>
394
- }]'
395
- ```
329
+ **Fallback (no MCP):** see `references/api-fallback.md` — "Delete an event node".
396
330
 
397
331
  **2. Delete the column** using `columnId` from local state.
398
332
 
@@ -401,12 +335,9 @@ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
401
335
  mcp__eventmodelers__delete_column { "boardId": "<BOARD_ID>", "timelineId": "<CHAPTER_ID>", "columnId": "<columnId>" }
402
336
  ```
403
337
 
404
- **Fallback (no MCP):**
405
- ```bash
406
- curl -s -X DELETE "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/timelines/$CHAPTER_ID/columns/<columnId>"
407
- ```
338
+ **Fallback (no MCP):** see `references/api-fallback.md` — "Delete a column".
408
339
 
409
- If `columnId` is not in local state, fetch the chapter node (`mcp__eventmodelers__get_node { "boardId": "<BOARD_ID>", "nodeId": "<CHAPTER_ID>" }`, or the curl fallback above), scan `meta.timelineData.cells` for the cell where `nodeId === eventNodeId`, and use that cell's `colId`.
340
+ If `columnId` is not in local state, fetch the chapter node (`mcp__eventmodelers__get_node { "boardId": "<BOARD_ID>", "nodeId": "<CHAPTER_ID>", "projection": "cells" }`, or the curl fallback above), scan `cells` for the cell where `nodeId === eventNodeId`, and use that cell's `colId`.
410
341
 
411
342
  Remove from local state and re-number remaining indexes.
412
343
 
@@ -0,0 +1,91 @@
1
+ # Timeline — curl Fallback Calls
2
+
3
+ Only needed when MCP is not connected. Every call below has an MCP equivalent in the main SKILL.md — always prefer that.
4
+
5
+ ## Fetch all chapters (Steps 1a, 1b)
6
+
7
+ ```bash
8
+ curl -s "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=CHAPTER"
9
+ ```
10
+
11
+ ## Fetch the chapter's grid state (Steps 1b, 3c)
12
+
13
+ ```bash
14
+ curl -s "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/$CHAPTER_ID"
15
+ ```
16
+
17
+ Read `meta.timelineData` for `{rows, columns, cells}`.
18
+
19
+ ## Fetch all EVENT nodes (Step 1b)
20
+
21
+ ```bash
22
+ curl -s "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=EVENT"
23
+ ```
24
+
25
+ ## Create a new chapter (Step 1c)
26
+
27
+ ```bash
28
+ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/chapters" \
29
+ -H "Content-Type: application/json" \
30
+ -d '{"position":{"x":0,"y":0}}'
31
+ ```
32
+
33
+ Extract `id` from the response → `CHAPTER_ID`.
34
+
35
+ ## Delete a column (Steps 3c, 4c)
36
+
37
+ ```bash
38
+ curl -s -X DELETE "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/timelines/$CHAPTER_ID/columns/<columnId>"
39
+ ```
40
+
41
+ ## Create an EVENT node in a reused empty column (Step 4a)
42
+
43
+ ```bash
44
+ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
45
+ -H "Content-Type: application/json" \
46
+ -H "x-user-id: timeline-skill" \
47
+ -d '[{
48
+ "id": "<event-uuid>",
49
+ "eventType": "node:created",
50
+ "nodeId": "<node-uuid>",
51
+ "boardId": "<BOARD_ID>",
52
+ "timestamp": <Date.now()>,
53
+ "chapterId": "<CHAPTER_ID>",
54
+ "cellId": "<CELL_ID>",
55
+ "meta": { "type": "EVENT", "title": "<EventName>" },
56
+ "node": { "id": "<node-uuid>", "data": { "title": "<EventName>" } }
57
+ }]'
58
+ ```
59
+
60
+ ## Rename an event (Step 4b)
61
+
62
+ ```bash
63
+ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
64
+ -H "Content-Type: application/json" \
65
+ -H "x-user-id: timeline-skill" \
66
+ -d '[{
67
+ "id": "<new-uuid>",
68
+ "eventType": "node:changed",
69
+ "nodeId": "<eventNodeId>",
70
+ "boardId": "<BOARD_ID>",
71
+ "timestamp": <Date.now()>,
72
+ "changedAttributes": ["meta.title"],
73
+ "meta": { "type": "EVENT", "title": "<NewTitle>" },
74
+ "node": { "id": "<eventNodeId>", "data": {} }
75
+ }]'
76
+ ```
77
+
78
+ ## Delete an event node (Step 4c, part 1)
79
+
80
+ ```bash
81
+ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
82
+ -H "Content-Type: application/json" \
83
+ -H "x-user-id: timeline-skill" \
84
+ -d '[{
85
+ "id": "<new-uuid>",
86
+ "eventType": "node:deleted",
87
+ "nodeId": "<eventNodeId>",
88
+ "boardId": "<BOARD_ID>",
89
+ "timestamp": <Date.now()>
90
+ }]'
91
+ ```