@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.
- package/package.json +1 -1
- package/shared/skills/learn-eventmodelers-api/SKILL.md +12 -10
- package/stacks/modeling-kit/templates/.claude/skills/add-next-slice/SKILL.md +2 -23
- package/stacks/modeling-kit/templates/.claude/skills/add-next-slice/references/api-fallback.md +11 -0
- package/stacks/modeling-kit/templates/.claude/skills/analyze-existing-model/SKILL.md +6 -57
- package/stacks/modeling-kit/templates/.claude/skills/analyze-existing-model/references/api-fallback.md +68 -0
- package/stacks/modeling-kit/templates/.claude/skills/attributes/SKILL.md +4 -61
- package/stacks/modeling-kit/templates/.claude/skills/attributes/references/api-fallback.md +39 -0
- package/stacks/modeling-kit/templates/.claude/skills/discover-storyboard/SKILL.md +9 -53
- package/stacks/modeling-kit/templates/.claude/skills/discover-storyboard/references/api-fallback.md +63 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-applying-conways-law/SKILL.md +9 -319
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-applying-conways-law/references/examples.md +329 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-brainstorming-events/SKILL.md +23 -199
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-brainstorming-events/references/api-fallback.md +97 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-brainstorming-events/references/examples.md +35 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-checking-completeness/SKILL.md +13 -410
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-checking-completeness/references/api-fallback.md +22 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-checking-completeness/references/examples.md +397 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-automation-chains/SKILL.md +132 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-automation-chains/references/api-fallback.md +21 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-event-models/SKILL.md +9 -236
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-event-models/references/examples.md +257 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-elaborating-scenarios/SKILL.md +28 -302
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-elaborating-scenarios/references/api-fallback.md +31 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-elaborating-scenarios/references/examples.md +216 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-inputs/SKILL.md +30 -343
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-inputs/references/api-fallback.md +79 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-inputs/references/examples.md +282 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-outputs/SKILL.md +51 -400
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-outputs/references/api-fallback.md +67 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-outputs/references/examples.md +273 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/SKILL.md +45 -152
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/domain-patterns.md +49 -90
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-optimizing-stream-design/references/patterns.md +64 -137
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-orchestrating-event-modeling/SKILL.md +74 -65
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-orchestrating-event-modeling/references/api-fallback.md +51 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-plotting-events/SKILL.md +1 -5
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-plotting-events/references/api-fallback.md +10 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/SKILL.md +19 -36
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/references/api-fallback.md +41 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/references/examples.md +12 -9
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-slicing-event-models/references/patterns.md +1 -10
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-storyboarding-events/SKILL.md +26 -332
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-storyboarding-events/references/api-fallback.md +77 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-storyboarding-events/references/examples.md +271 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-translating-external-events/SKILL.md +9 -294
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-translating-external-events/references/examples.md +306 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models/SKILL.md +12 -11
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models/references/api-fallback.md +14 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models-checklist/SKILL.md +6 -36
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models-checklist/references/api-fallback.md +14 -0
- package/stacks/modeling-kit/templates/.claude/skills/examples/SKILL.md +3 -110
- package/stacks/modeling-kit/templates/.claude/skills/examples/references/api-fallback.md +118 -0
- package/stacks/modeling-kit/templates/.claude/skills/handle-comment/SKILL.md +5 -25
- package/stacks/modeling-kit/templates/.claude/skills/handle-comment/references/api-fallback.md +35 -0
- package/stacks/modeling-kit/templates/.claude/skills/html-screen/SKILL.md +9 -44
- package/stacks/modeling-kit/templates/.claude/skills/html-screen/references/api-fallback.md +51 -0
- package/stacks/modeling-kit/templates/.claude/skills/place-element/SKILL.md +23 -183
- package/stacks/modeling-kit/templates/.claude/skills/place-element/references/api-fallback.md +193 -0
- package/stacks/modeling-kit/templates/.claude/skills/storyboard/SKILL.md +14 -81
- package/stacks/modeling-kit/templates/.claude/skills/storyboard/references/api-fallback.md +74 -0
- package/stacks/modeling-kit/templates/.claude/skills/storyboard-screen/SKILL.md +4 -45
- package/stacks/modeling-kit/templates/.claude/skills/storyboard-screen/references/api-fallback.md +44 -0
- package/stacks/modeling-kit/templates/.claude/skills/timeline/SKILL.md +19 -88
- package/stacks/modeling-kit/templates/.claude/skills/timeline/references/api-fallback.md +91 -0
- package/stacks/modeling-kit/templates/.claude/skills/update-prompt-status/SKILL.md +1 -9
- package/stacks/modeling-kit/templates/.claude/skills/update-prompt-status/references/api-fallback.md +14 -0
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-integrating-legacy-systems/SKILL.md +0 -674
- 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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
package/stacks/modeling-kit/templates/.claude/skills/storyboard-screen/references/api-fallback.md
ADDED
|
@@ -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
|
|
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 `
|
|
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
|
+
```
|