@eventmodelers/cli 1.0.77 → 1.0.79
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/README.md +52 -2
- package/RELEASE_NOTES.md +9 -0
- package/cli.js +65 -24
- package/lib/adapters/spec-kitty-adapter.js +1 -1
- package/lib/fetch.js +1 -1
- package/lib/modeling-local-ai.js +283 -0
- package/package.json +1 -1
- package/shared/build-kit/lib/ralph.js +2 -2
- package/shared/skills/connect/SKILL.md +1 -3
- package/shared/skills/learn-eventmodelers-api/SKILL.md +2 -2
- package/shared/skills/load-slice/SKILL.md +0 -1
- package/shared/skills/request-feedback/SKILL.md +0 -2
- package/shared/skills/update-slice-status/SKILL.md +0 -2
- package/stacks/modeling-kit/templates/.claude/skills/analyze-existing-model/references/api-fallback.md +0 -6
- package/stacks/modeling-kit/templates/.claude/skills/attributes/references/api-fallback.md +1 -2
- package/stacks/modeling-kit/templates/.claude/skills/discover-storyboard/references/api-fallback.md +0 -2
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-brainstorming-events/references/api-fallback.md +7 -7
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-checking-completeness/references/api-fallback.md +4 -4
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-designing-automation-chains/references/api-fallback.md +1 -1
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-inputs/references/api-fallback.md +7 -7
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-identifying-outputs/references/api-fallback.md +7 -7
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-orchestrating-event-modeling/references/api-fallback.md +5 -5
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-plotting-events/references/api-fallback.md +1 -1
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-storyboarding-events/references/api-fallback.md +7 -7
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models/references/api-fallback.md +3 -3
- package/stacks/modeling-kit/templates/.claude/skills/eventmodeling-validating-event-models-checklist/references/api-fallback.md +3 -3
- package/stacks/modeling-kit/templates/.claude/skills/examples/references/api-fallback.md +0 -1
- package/stacks/modeling-kit/templates/.claude/skills/handle-comment/references/api-fallback.md +4 -4
- package/stacks/modeling-kit/templates/.claude/skills/html-screen/references/api-fallback.md +1 -4
- package/stacks/modeling-kit/templates/.claude/skills/place-element/SKILL.md +1 -1
- package/stacks/modeling-kit/templates/.claude/skills/place-element/references/api-fallback.md +2 -7
- package/stacks/modeling-kit/templates/.claude/skills/storyboard/references/api-fallback.md +1 -3
- package/stacks/modeling-kit/templates/.claude/skills/storyboard-screen/references/api-fallback.md +1 -3
- package/stacks/modeling-kit/templates/.claude/skills/wdyt/SKILL.md +1 -1
- package/stacks/react/templates/build-kit/lib/ralph.js +2 -2
|
@@ -22,7 +22,7 @@ After running, the following variables are available for the rest of the session
|
|
|
22
22
|
| Variable | Header sent to API | Description |
|
|
23
23
|
|----------|--------------------|-------------|
|
|
24
24
|
| `TOKEN` | `x-token` | API token UUID |
|
|
25
|
-
| `BOARD_ID` |
|
|
25
|
+
| `BOARD_ID` | — | Target board UUID (used in all board-scoped URLs) |
|
|
26
26
|
| `ORG_ID` | — | Organization UUID (used in all board-scoped URLs) |
|
|
27
27
|
| `BASE_URL` | — | Base URL, e.g. `http://localhost:3000` |
|
|
28
28
|
| `AGENT_ID` | `x-agent-id` | This agent process's own id, when running as one (Step 0.5). Optional — skip the header when there is no value. |
|
|
@@ -30,7 +30,6 @@ After running, the following variables are available for the rest of the session
|
|
|
30
30
|
Every curl-fallback call in every skill must include these headers:
|
|
31
31
|
```
|
|
32
32
|
x-token: <TOKEN>
|
|
33
|
-
x-board-id: <BOARD_ID>
|
|
34
33
|
x-user-id: <skill-name> ← set by each skill individually
|
|
35
34
|
x-agent-id: <AGENT_ID> ← only when AGENT_ID resolved; omit the line entirely otherwise
|
|
36
35
|
```
|
|
@@ -243,7 +242,6 @@ Otherwise (no MCP tools visible yet this session), fall back to the equivalent c
|
|
|
243
242
|
```bash
|
|
244
243
|
curl -s -o /dev/null -w "%{http_code}" \
|
|
245
244
|
-H "x-token: <TOKEN>" \
|
|
246
|
-
-H "x-board-id: <BOARD_ID>" \
|
|
247
245
|
-H "x-user-id: connect-skill" \
|
|
248
246
|
"<BASE_URL>/api/org/<ORG_ID>/boards/<BOARD_ID>/nodes?type=CHAPTER"
|
|
249
247
|
```
|
|
@@ -9,7 +9,7 @@ You now have complete knowledge of the eventmodelers platform API. This is a ref
|
|
|
9
9
|
|
|
10
10
|
**Load this once per session, on demand — not as a mandatory preamble.** Every other skill already documents the exact API calls it needs inline; none of them require this full reference to be loaded before they can run. Reach for this skill only when you hit a specific endpoint, field, or element type that a skill's own instructions don't cover, and don't reload it again later in the same session once you have.
|
|
11
11
|
|
|
12
|
-
**Two transports exist for board operations: MCP tools (preferred) and raw REST/curl (fallback).** The `connect` skill registers the MCP server in `.mcp.json`. Once `mcp__eventmodelers__*` tools are visible in your tool list, use them — they need no `x-token`/`x-
|
|
12
|
+
**Two transports exist for board operations: MCP tools (preferred) and raw REST/curl (fallback).** The `connect` skill registers the MCP server in `.mcp.json`. Once `mcp__eventmodelers__*` tools are visible in your tool list, use them — they need no `x-token`/`x-user-id` headers (auth and org resolution happen server-side from the registered token) and return the same data as the REST endpoints below. Fall back to the numbered REST sections only when MCP tools aren't connected yet, or for the handful of endpoints (prompts lifecycle, snapshots, user management, board/extension CRUD) the MCP server intentionally doesn't expose — it only covers board-content operations (nodes, timelines, slices, comments, screens). This preference is about *which transport a skill's own instructions should use*, never about whether to invoke the skill in the first place.
|
|
13
13
|
|
|
14
14
|
---
|
|
15
15
|
|
|
@@ -996,7 +996,7 @@ The same `agent_id` belongs in the `x-agent-id` header of every board call this
|
|
|
996
996
|
---
|
|
997
997
|
|
|
998
998
|
### GET `/api/org/:orgId/boards/:boardId/agent-alive`
|
|
999
|
-
Check whether an agent has pinged for a board within the last 45s. Auth:
|
|
999
|
+
Check whether an agent has pinged for a board within the last 45s. Auth: Supabase JWT (`Authorization: Bearer`) — same as the heartbeat above; a raw `x-token` alone is not accepted here either.
|
|
1000
1000
|
|
|
1001
1001
|
**Response**: `200` — `{ alive: boolean, agentTypes: string[], agents: { agentId: string, agentType: string, agentName: string | null }[] }` — one `agents` entry per live agent process, `agentTypes` the de-duplicated set of their types
|
|
1002
1002
|
|
|
@@ -43,7 +43,6 @@ mcp__eventmodelers__get_slice_data { "boardId": "<BOARD_ID>", "contextName": "<n
|
|
|
43
43
|
```bash
|
|
44
44
|
curl -s \
|
|
45
45
|
-H "x-token: <TOKEN>" \
|
|
46
|
-
-H "x-board-id: <BOARD_ID>" \
|
|
47
46
|
-H "x-user-id: load-slice-skill" \
|
|
48
47
|
"<BASE_URL>/api/org/<ORG_ID>/boards/<BOARD_ID>/slicedata/slices"
|
|
49
48
|
```
|
|
@@ -72,7 +72,6 @@ mcp__eventmodelers__list_slices { "boardId": "<BOARD_ID>" }
|
|
|
72
72
|
```bash
|
|
73
73
|
curl -s \
|
|
74
74
|
-H "x-token: <TOKEN>" \
|
|
75
|
-
-H "x-board-id: <BOARD_ID>" \
|
|
76
75
|
-H "x-user-id: request-feedback-skill" \
|
|
77
76
|
"<BASE_URL>/api/org/<ORG_ID>/boards/<BOARD_ID>/slicedata/slices"
|
|
78
77
|
```
|
|
@@ -124,7 +123,6 @@ SLICE_BORDER node's meta directly:
|
|
|
124
123
|
curl -s -X POST "<BASE_URL>/api/org/<ORG_ID>/boards/<BOARD_ID>/nodes/events" \
|
|
125
124
|
-H "Content-Type: application/json" \
|
|
126
125
|
-H "x-token: <TOKEN>" \
|
|
127
|
-
-H "x-board-id: <BOARD_ID>" \
|
|
128
126
|
-H "x-user-id: request-feedback-skill" \
|
|
129
127
|
-d '[{
|
|
130
128
|
"id": "<new-random-uuid>",
|
|
@@ -48,7 +48,6 @@ mcp__eventmodelers__list_slices { "boardId": "<BOARD_ID>" }
|
|
|
48
48
|
```bash
|
|
49
49
|
curl -s \
|
|
50
50
|
-H "x-token: <TOKEN>" \
|
|
51
|
-
-H "x-board-id: <BOARD_ID>" \
|
|
52
51
|
-H "x-user-id: update-slice-status-skill" \
|
|
53
52
|
"<BASE_URL>/api/org/<ORG_ID>/boards/<BOARD_ID>/slicedata/slices"
|
|
54
53
|
```
|
|
@@ -85,7 +84,6 @@ A slice that is being *created* takes its status straight from `create_slice`/`c
|
|
|
85
84
|
curl -s -X POST "<BASE_URL>/api/org/<ORG_ID>/boards/<BOARD_ID>/nodes/events" \
|
|
86
85
|
-H "Content-Type: application/json" \
|
|
87
86
|
-H "x-token: <TOKEN>" \
|
|
88
|
-
-H "x-board-id: <BOARD_ID>" \
|
|
89
87
|
-H "x-user-id: update-slice-status-skill" \
|
|
90
88
|
-d '[{
|
|
91
89
|
"id": "<new-random-uuid>",
|
|
@@ -7,7 +7,6 @@ Only needed when MCP is not connected. Every call below has an MCP equivalent in
|
|
|
7
7
|
```bash
|
|
8
8
|
curl -s \
|
|
9
9
|
-H "x-token: $TOKEN" \
|
|
10
|
-
-H "x-board-id: $BOARD_ID" \
|
|
11
10
|
-H "x-user-id: analyze-existing-model" \
|
|
12
11
|
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/slicedata/slices"
|
|
13
12
|
```
|
|
@@ -19,7 +18,6 @@ Response: `{ "slices": [{ "id": "<uuid>", "title": "<name>", "status": "<status>
|
|
|
19
18
|
```bash
|
|
20
19
|
curl -s \
|
|
21
20
|
-H "x-token: $TOKEN" \
|
|
22
|
-
-H "x-board-id: $BOARD_ID" \
|
|
23
21
|
-H "x-user-id: analyze-existing-model" \
|
|
24
22
|
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=MODEL_CONTEXT"
|
|
25
23
|
```
|
|
@@ -29,7 +27,6 @@ curl -s \
|
|
|
29
27
|
```bash
|
|
30
28
|
curl -s \
|
|
31
29
|
-H "x-token: $TOKEN" \
|
|
32
|
-
-H "x-board-id: $BOARD_ID" \
|
|
33
30
|
-H "x-user-id: analyze-existing-model" \
|
|
34
31
|
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/slicedata?contextName=<CONTEXT_NAME>"
|
|
35
32
|
```
|
|
@@ -46,21 +43,18 @@ Each response contains a `slices` array. Each slice entry includes:
|
|
|
46
43
|
# 1. List slices
|
|
47
44
|
curl -s \
|
|
48
45
|
-H "x-token: $TOKEN" \
|
|
49
|
-
-H "x-board-id: $BOARD_ID" \
|
|
50
46
|
-H "x-user-id: analyze-existing-model" \
|
|
51
47
|
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/slicedata/slices"
|
|
52
48
|
|
|
53
49
|
# 2. Fetch MODEL_CONTEXT nodes
|
|
54
50
|
curl -s \
|
|
55
51
|
-H "x-token: $TOKEN" \
|
|
56
|
-
-H "x-board-id: $BOARD_ID" \
|
|
57
52
|
-H "x-user-id: analyze-existing-model" \
|
|
58
53
|
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=MODEL_CONTEXT"
|
|
59
54
|
|
|
60
55
|
# 3. Fetch full slice data for a context
|
|
61
56
|
curl -s \
|
|
62
57
|
-H "x-token: $TOKEN" \
|
|
63
|
-
-H "x-board-id: $BOARD_ID" \
|
|
64
58
|
-H "x-user-id: analyze-existing-model" \
|
|
65
59
|
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/slicedata?contextName=Ordering"
|
|
66
60
|
```
|
|
@@ -6,7 +6,7 @@ Only needed when MCP is not connected. Every call below has an MCP equivalent in
|
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
8
|
curl -s "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/$EDGE_SOURCE_ID" \
|
|
9
|
-
-H "x-token: $TOKEN" -H "x-
|
|
9
|
+
-H "x-token: $TOKEN" -H "x-user-id: attributes-skill"
|
|
10
10
|
```
|
|
11
11
|
|
|
12
12
|
## Step 4 — Apply the Change to Each Node in the Chain
|
|
@@ -33,7 +33,6 @@ EOF
|
|
|
33
33
|
curl -s -w "\n%{http_code}" -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
|
|
34
34
|
-H "Content-Type: application/json" \
|
|
35
35
|
-H "x-token: $TOKEN" \
|
|
36
|
-
-H "x-board-id: $BOARD_ID" \
|
|
37
36
|
-H "x-user-id: attributes-skill" \
|
|
38
37
|
--data-binary @/tmp/attributes_payload.json
|
|
39
38
|
```
|
package/stacks/modeling-kit/templates/.claude/skills/discover-storyboard/references/api-fallback.md
CHANGED
|
@@ -16,7 +16,6 @@ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/chapters" \
|
|
|
16
16
|
```bash
|
|
17
17
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
|
|
18
18
|
-H "x-token: $TOKEN" \
|
|
19
|
-
-H "x-board-id: $BOARD_ID" \
|
|
20
19
|
-H "x-user-id: discover-storyboard" \
|
|
21
20
|
-H "Content-Type: application/json" \
|
|
22
21
|
-d '[{
|
|
@@ -43,7 +42,6 @@ curl -s -H "x-token: $TOKEN" \
|
|
|
43
42
|
```bash
|
|
44
43
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/timelines/$CHAPTER_ID/columns" \
|
|
45
44
|
-H "x-token: $TOKEN" \
|
|
46
|
-
-H "x-board-id: $BOARD_ID" \
|
|
47
45
|
-H "x-user-id: discover-storyboard" \
|
|
48
46
|
-H "Content-Type: application/json" \
|
|
49
47
|
-d '{}'
|
|
@@ -5,14 +5,14 @@ Only needed when MCP is not connected. Every call below has an MCP equivalent in
|
|
|
5
5
|
## Board Context — Check existing EVENT nodes
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
curl -s -H "x-token: $TOKEN"
|
|
8
|
+
curl -s -H "x-token: $TOKEN" \
|
|
9
9
|
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=EVENT"
|
|
10
10
|
```
|
|
11
11
|
|
|
12
12
|
## Board Context — Check existing CHAPTER nodes
|
|
13
13
|
|
|
14
14
|
```bash
|
|
15
|
-
curl -s -H "x-token: $TOKEN"
|
|
15
|
+
curl -s -H "x-token: $TOKEN" \
|
|
16
16
|
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=CHAPTER"
|
|
17
17
|
```
|
|
18
18
|
|
|
@@ -20,7 +20,7 @@ curl -s -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" \
|
|
|
20
20
|
|
|
21
21
|
```bash
|
|
22
22
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/chapters" \
|
|
23
|
-
-H "x-token: $TOKEN"
|
|
23
|
+
-H "x-token: $TOKEN" \
|
|
24
24
|
-H "Content-Type: application/json" -d '{}'
|
|
25
25
|
# → { timelineId: "<chapterId>", ... }
|
|
26
26
|
```
|
|
@@ -29,7 +29,7 @@ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/chapters" \
|
|
|
29
29
|
|
|
30
30
|
```bash
|
|
31
31
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
|
|
32
|
-
-H "x-token: $TOKEN"
|
|
32
|
+
-H "x-token: $TOKEN" \
|
|
33
33
|
-H "x-user-id: brainstorming-events" -H "Content-Type: application/json" \
|
|
34
34
|
-d '[{
|
|
35
35
|
"id": "<uuid>",
|
|
@@ -45,7 +45,7 @@ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
|
|
|
45
45
|
|
|
46
46
|
```bash
|
|
47
47
|
curl -s -X PUT "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/timelines/$TL/position" \
|
|
48
|
-
-H "x-token: $TOKEN"
|
|
48
|
+
-H "x-token: $TOKEN" \
|
|
49
49
|
-H "Content-Type: application/json" \
|
|
50
50
|
-d '{"x": 0, "y": 1200}' # first chapter: y=0, second: y=1200, third: y=2400, …
|
|
51
51
|
```
|
|
@@ -56,7 +56,7 @@ No batch form exists over REST; one call per event:
|
|
|
56
56
|
|
|
57
57
|
```bash
|
|
58
58
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/timelines/$CHAPTER_ID/columns" \
|
|
59
|
-
-H "x-token: $TOKEN" -H "x-
|
|
59
|
+
-H "x-token: $TOKEN" -H "x-user-id: brainstorming-events" \
|
|
60
60
|
-H "Content-Type: application/json" -d '{}'
|
|
61
61
|
# → { "columnId": "<colUuid>", "index": <n>, "totalColumns": <n> }
|
|
62
62
|
```
|
|
@@ -64,7 +64,7 @@ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/timelines/$CHAPTER_I
|
|
|
64
64
|
## Mode A — Step B: Fetch the chapter to find the swimlane row ID
|
|
65
65
|
|
|
66
66
|
```bash
|
|
67
|
-
curl -s -H "x-token: $TOKEN"
|
|
67
|
+
curl -s -H "x-token: $TOKEN" \
|
|
68
68
|
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/$CHAPTER_ID"
|
|
69
69
|
# → node.meta.timelineData.rows — find the row where type === "swimlane"
|
|
70
70
|
```
|
|
@@ -6,17 +6,17 @@ Only needed when MCP is not connected. Every call below has an MCP equivalent in
|
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
8
|
# All nodes (events, commands, read models, screens)
|
|
9
|
-
curl -s -H "x-token: $TOKEN"
|
|
9
|
+
curl -s -H "x-token: $TOKEN" \
|
|
10
10
|
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=EVENT"
|
|
11
|
-
curl -s -H "x-token: $TOKEN"
|
|
11
|
+
curl -s -H "x-token: $TOKEN" \
|
|
12
12
|
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=COMMAND"
|
|
13
|
-
curl -s -H "x-token: $TOKEN"
|
|
13
|
+
curl -s -H "x-token: $TOKEN" \
|
|
14
14
|
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=READMODEL"
|
|
15
15
|
```
|
|
16
16
|
|
|
17
17
|
## 4. Check Slice Coverage
|
|
18
18
|
|
|
19
19
|
```bash
|
|
20
|
-
curl -s -H "x-token: $TOKEN"
|
|
20
|
+
curl -s -H "x-token: $TOKEN" \
|
|
21
21
|
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=SLICE_BORDER"
|
|
22
22
|
```
|
|
@@ -10,7 +10,7 @@ Only needed when MCP is not connected. Every call below has an MCP equivalent in
|
|
|
10
10
|
4. Create the node:
|
|
11
11
|
```bash
|
|
12
12
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
|
|
13
|
-
-H "x-token: $TOKEN" -H "x-
|
|
13
|
+
-H "x-token: $TOKEN" -H "x-user-id: designing-automation-chains" \
|
|
14
14
|
-H "Content-Type: application/json" \
|
|
15
15
|
-d '[{
|
|
16
16
|
"id":"<event-uuid>","eventType":"node:created","nodeId":"<node-uuid>",
|
|
@@ -6,14 +6,14 @@ Only needed when MCP is not connected. Every call below has an MCP equivalent in
|
|
|
6
6
|
|
|
7
7
|
**Step A — Find the event's column ID.** Query the event node to read its current cell:
|
|
8
8
|
```bash
|
|
9
|
-
curl -s -H "x-token: $TOKEN"
|
|
9
|
+
curl -s -H "x-token: $TOKEN" \
|
|
10
10
|
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/$EVENT_NODE_ID"
|
|
11
11
|
# → node.meta.cellId is "<someRowId>-<columnId>" — extract the columnId part
|
|
12
12
|
```
|
|
13
13
|
|
|
14
14
|
**Step B — Fetch the chapter to find the interaction row ID:**
|
|
15
15
|
```bash
|
|
16
|
-
curl -s -H "x-token: $TOKEN"
|
|
16
|
+
curl -s -H "x-token: $TOKEN" \
|
|
17
17
|
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/$CHAPTER_ID"
|
|
18
18
|
# → timelineData.rows — find the row where type === "interaction"
|
|
19
19
|
```
|
|
@@ -28,7 +28,7 @@ cellId = interactionRow.id + "-" + columnId
|
|
|
28
28
|
|
|
29
29
|
```bash
|
|
30
30
|
curl -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
|
|
31
|
-
-H "x-token: $TOKEN" -H "x-
|
|
31
|
+
-H "x-token: $TOKEN" -H "x-user-id: identifying-inputs" \
|
|
32
32
|
-H "Content-Type: application/json" \
|
|
33
33
|
-d '[{
|
|
34
34
|
"id": "<event-uuid>",
|
|
@@ -54,12 +54,12 @@ curl -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
|
|
|
54
54
|
|
|
55
55
|
```bash
|
|
56
56
|
curl -s "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?cellId=<actorRowId>-<columnId>" \
|
|
57
|
-
-H "x-token: $TOKEN" -H "x-
|
|
57
|
+
-H "x-token: $TOKEN" -H "x-user-id: eventmodeling-identifying-inputs"
|
|
58
58
|
```
|
|
59
59
|
If a SCREEN node exists, connect it:
|
|
60
60
|
```bash
|
|
61
61
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/connections" \
|
|
62
|
-
-H "x-token: $TOKEN" -H "x-
|
|
62
|
+
-H "x-token: $TOKEN" -H "x-user-id: eventmodeling-identifying-inputs" \
|
|
63
63
|
-H "Content-Type: application/json" \
|
|
64
64
|
-d '{"source":"<screenNodeId>","target":"<commandNodeId>"}'
|
|
65
65
|
```
|
|
@@ -68,12 +68,12 @@ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/connections" \
|
|
|
68
68
|
|
|
69
69
|
```bash
|
|
70
70
|
curl -s "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?cellId=<swimlaneRowId>-<columnId>" \
|
|
71
|
-
-H "x-token: $TOKEN" -H "x-
|
|
71
|
+
-H "x-token: $TOKEN" -H "x-user-id: eventmodeling-identifying-inputs"
|
|
72
72
|
```
|
|
73
73
|
Connect command to its resulting event:
|
|
74
74
|
```bash
|
|
75
75
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/connections" \
|
|
76
|
-
-H "x-token: $TOKEN" -H "x-
|
|
76
|
+
-H "x-token: $TOKEN" -H "x-user-id: eventmodeling-identifying-inputs" \
|
|
77
77
|
-H "Content-Type: application/json" \
|
|
78
78
|
-d '{"source":"<commandNodeId>","target":"<eventNodeId>"}'
|
|
79
79
|
```
|
|
@@ -6,21 +6,21 @@ Only needed when MCP is not connected. Every call below has an MCP equivalent in
|
|
|
6
6
|
|
|
7
7
|
1. Find the column where the consumer SCREEN or AUTOMATION lives. For an AUTOMATION, the read model's target column is always the one immediately **before** it (skip straight to inserting that column — its interaction row is guaranteed occupied by the automation's own COMMAND). For a SCREEN, target the screen's own column. Fetch the timeline to get the interaction row ID:
|
|
8
8
|
```bash
|
|
9
|
-
curl -s -H "x-token: $TOKEN"
|
|
9
|
+
curl -s -H "x-token: $TOKEN" \
|
|
10
10
|
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/$CHAPTER_ID"
|
|
11
11
|
# → timelineData.rows — find the row where type === "interaction"
|
|
12
12
|
```
|
|
13
13
|
2. Check if the target interaction cell is already occupied (existing COMMAND):
|
|
14
14
|
```bash
|
|
15
15
|
curl -s "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?cellId=<interactionRowId>-<columnId>" \
|
|
16
|
-
-H "x-token: $TOKEN"
|
|
16
|
+
-H "x-token: $TOKEN"
|
|
17
17
|
```
|
|
18
18
|
If a COMMAND occupies that cell, insert a new column immediately **before** it (`{"index": currentIndex}` — this shifts the consumer's column, and everything after it, one to the right) and use that new column's ID instead. The read model must end up upstream of (to the left of) its consumer, never downstream of it.
|
|
19
19
|
3. `cellId = interactionRow.id + "-" + columnId`
|
|
20
20
|
4. Create the READMODEL:
|
|
21
21
|
```bash
|
|
22
22
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
|
|
23
|
-
-H "x-token: $TOKEN" -H "x-
|
|
23
|
+
-H "x-token: $TOKEN" -H "x-user-id: identifying-outputs" \
|
|
24
24
|
-H "Content-Type: application/json" \
|
|
25
25
|
-d '[{
|
|
26
26
|
"id": "<event-uuid>",
|
|
@@ -38,12 +38,12 @@ Only needed when MCP is not connected. Every call below has an MCP equivalent in
|
|
|
38
38
|
|
|
39
39
|
```bash
|
|
40
40
|
curl -s "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?cellId=<swimlaneRowId>-<columnId>" \
|
|
41
|
-
-H "x-token: $TOKEN" -H "x-
|
|
41
|
+
-H "x-token: $TOKEN" -H "x-user-id: eventmodeling-identifying-outputs"
|
|
42
42
|
```
|
|
43
43
|
Connect it:
|
|
44
44
|
```bash
|
|
45
45
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/connections" \
|
|
46
|
-
-H "x-token: $TOKEN" -H "x-
|
|
46
|
+
-H "x-token: $TOKEN" -H "x-user-id: eventmodeling-identifying-outputs" \
|
|
47
47
|
-H "Content-Type: application/json" \
|
|
48
48
|
-d '{"source":"<eventNodeId>","target":"<readmodelNodeId>"}'
|
|
49
49
|
```
|
|
@@ -52,7 +52,7 @@ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/connections" \
|
|
|
52
52
|
|
|
53
53
|
```bash
|
|
54
54
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/connections" \
|
|
55
|
-
-H "x-token: $TOKEN" -H "x-
|
|
55
|
+
-H "x-token: $TOKEN" -H "x-user-id: eventmodeling-identifying-outputs" \
|
|
56
56
|
-H "Content-Type: application/json" \
|
|
57
57
|
-d '{"source":"<readmodelNodeId>","target":"<screenNodeId>"}'
|
|
58
58
|
```
|
|
@@ -61,7 +61,7 @@ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/connections" \
|
|
|
61
61
|
|
|
62
62
|
```bash
|
|
63
63
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/connections" \
|
|
64
|
-
-H "x-token: $TOKEN" -H "x-
|
|
64
|
+
-H "x-token: $TOKEN" -H "x-user-id: eventmodeling-identifying-outputs" \
|
|
65
65
|
-H "Content-Type: application/json" \
|
|
66
66
|
-d '{"source":"<readmodelNodeId>","target":"<automationNodeId>"}'
|
|
67
67
|
```
|
|
@@ -6,7 +6,7 @@ Only needed when MCP is not connected. Every call below has an MCP equivalent in
|
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
8
|
for TYPE in EVENT COMMAND READMODEL SCREEN AUTOMATION; do
|
|
9
|
-
curl -s -H "x-token: $TOKEN"
|
|
9
|
+
curl -s -H "x-token: $TOKEN" \
|
|
10
10
|
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=$TYPE"
|
|
11
11
|
done
|
|
12
12
|
```
|
|
@@ -15,7 +15,7 @@ done
|
|
|
15
15
|
|
|
16
16
|
```bash
|
|
17
17
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
|
|
18
|
-
-H "x-token: $TOKEN" -H "x-
|
|
18
|
+
-H "x-token: $TOKEN" -H "x-user-id: orchestrator" \
|
|
19
19
|
-H "Content-Type: application/json" \
|
|
20
20
|
-d '[{"id":"<uuid>","eventType":"node:changed","nodeId":"<nodeId>","boardId":"<BOARD_ID>",
|
|
21
21
|
"timestamp":1234567890,"chapterId":"<chapterId>","cellId":"<rowId>-<colId>",
|
|
@@ -26,14 +26,14 @@ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
|
|
|
26
26
|
|
|
27
27
|
```bash
|
|
28
28
|
curl -s -X DELETE "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/<nodeId>" \
|
|
29
|
-
-H "x-token: $TOKEN"
|
|
29
|
+
-H "x-token: $TOKEN"
|
|
30
30
|
```
|
|
31
31
|
|
|
32
32
|
## Step 11 — Document Reasoning — Add a feedback lane
|
|
33
33
|
|
|
34
34
|
```bash
|
|
35
35
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/timelines/$CHAPTER_ID/lanes" \
|
|
36
|
-
-H "x-token: $TOKEN" -H "x-
|
|
36
|
+
-H "x-token: $TOKEN" -H "x-user-id: orchestrator" \
|
|
37
37
|
-H "Content-Type: application/json" \
|
|
38
38
|
-d '{"type":"feedback","label":"Notes"}'
|
|
39
39
|
# → { laneId, type, label, index, totalLanes }
|
|
@@ -43,7 +43,7 @@ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/timelines/$CHAPTER_I
|
|
|
43
43
|
|
|
44
44
|
```bash
|
|
45
45
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
|
|
46
|
-
-H "x-token: $TOKEN" -H "x-
|
|
46
|
+
-H "x-token: $TOKEN" -H "x-user-id: orchestrator" \
|
|
47
47
|
-H "Content-Type: application/json" \
|
|
48
48
|
-d '[{"id":"<event-uuid>","eventType":"node:created","nodeId":"<node-uuid>","boardId":"<BOARD_ID>",
|
|
49
49
|
"timestamp":1234567890,"chapterId":"<CHAPTER_ID>","cellId":"<feedbackLaneId>-<firstColumnId>",
|
|
@@ -5,6 +5,6 @@ Only needed when MCP is not connected. Every call below has an MCP equivalent in
|
|
|
5
5
|
## Chapters and Timelines — Resolve the Target Timeline
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
curl -s -H "x-token: $TOKEN"
|
|
8
|
+
curl -s -H "x-token: $TOKEN" \
|
|
9
9
|
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=CHAPTER"
|
|
10
10
|
```
|
|
@@ -5,16 +5,16 @@ Only needed when MCP is not connected. Every call below has an MCP equivalent in
|
|
|
5
5
|
## Board Integration — Check existing screen nodes
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
curl -s -H "x-token: $TOKEN"
|
|
8
|
+
curl -s -H "x-token: $TOKEN" \
|
|
9
9
|
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=HTML_SCREEN"
|
|
10
|
-
curl -s -H "x-token: $TOKEN"
|
|
10
|
+
curl -s -H "x-token: $TOKEN" \
|
|
11
11
|
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=SCREEN"
|
|
12
12
|
```
|
|
13
13
|
|
|
14
14
|
## Resolve One Actor Lane Per Human Role — Step 1: Fetch the chapter's actor rows
|
|
15
15
|
|
|
16
16
|
```bash
|
|
17
|
-
curl -s -H "x-token: $TOKEN"
|
|
17
|
+
curl -s -H "x-token: $TOKEN" \
|
|
18
18
|
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/$CHAPTER_ID"
|
|
19
19
|
```
|
|
20
20
|
|
|
@@ -22,7 +22,7 @@ curl -s -H "x-token: $TOKEN" -H "x-board-id: $BOARD_ID" \
|
|
|
22
22
|
|
|
23
23
|
```bash
|
|
24
24
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/timelines/$CHAPTER_ID/lanes" \
|
|
25
|
-
-H "x-token: $TOKEN" -H "x-
|
|
25
|
+
-H "x-token: $TOKEN" -H "x-user-id: storyboarding-events" \
|
|
26
26
|
-H "Content-Type: application/json" \
|
|
27
27
|
-d '{"type": "actor", "label": "<Role Name>"}'
|
|
28
28
|
```
|
|
@@ -31,7 +31,7 @@ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/timelines/$CHAPTER_I
|
|
|
31
31
|
|
|
32
32
|
```bash
|
|
33
33
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/html-screen-nodes/<node-uuid>" \
|
|
34
|
-
-H "x-token: $TOKEN" -H "x-
|
|
34
|
+
-H "x-token: $TOKEN" -H "x-user-id: storyboarding-events" \
|
|
35
35
|
-H "Content-Type: application/json" \
|
|
36
36
|
-d '{
|
|
37
37
|
"chapterId": "<CHAPTER_ID>",
|
|
@@ -46,7 +46,7 @@ Then, over REST only (no `fields` param on the HTML-screen endpoint), still set
|
|
|
46
46
|
|
|
47
47
|
```bash
|
|
48
48
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
|
|
49
|
-
-H "x-token: $TOKEN" -H "x-
|
|
49
|
+
-H "x-token: $TOKEN" -H "x-user-id: storyboarding-events" \
|
|
50
50
|
-H "Content-Type: application/json" \
|
|
51
51
|
-d '[{
|
|
52
52
|
"id": "<event-uuid>",
|
|
@@ -64,7 +64,7 @@ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
|
|
|
64
64
|
|
|
65
65
|
```bash
|
|
66
66
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/images/$NODE_ID/sketch" \
|
|
67
|
-
-H "x-token: $TOKEN" -H "x-
|
|
67
|
+
-H "x-token: $TOKEN" -H "x-user-id: storyboarding-events" \
|
|
68
68
|
-H "Content-Type: application/json" \
|
|
69
69
|
-d '{
|
|
70
70
|
"description": "<concise description of what this screen shows>",
|
|
@@ -5,10 +5,10 @@ Only needed when MCP is not connected. Every call below has an MCP equivalent in
|
|
|
5
5
|
## Board Context
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
curl -s -H "x-token: $TOKEN"
|
|
8
|
+
curl -s -H "x-token: $TOKEN" \
|
|
9
9
|
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=EVENT"
|
|
10
|
-
curl -s -H "x-token: $TOKEN"
|
|
10
|
+
curl -s -H "x-token: $TOKEN" \
|
|
11
11
|
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=COMMAND"
|
|
12
|
-
curl -s -H "x-token: $TOKEN"
|
|
12
|
+
curl -s -H "x-token: $TOKEN" \
|
|
13
13
|
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=READMODEL"
|
|
14
14
|
```
|
|
@@ -5,10 +5,10 @@ Only needed when MCP is not connected. Every call below has an MCP equivalent in
|
|
|
5
5
|
## Board Context
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
curl -s -H "x-token: $TOKEN"
|
|
8
|
+
curl -s -H "x-token: $TOKEN" \
|
|
9
9
|
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=EVENT"
|
|
10
|
-
curl -s -H "x-token: $TOKEN"
|
|
10
|
+
curl -s -H "x-token: $TOKEN" \
|
|
11
11
|
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=COMMAND"
|
|
12
|
-
curl -s -H "x-token: $TOKEN"
|
|
12
|
+
curl -s -H "x-token: $TOKEN" \
|
|
13
13
|
"$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes?type=READMODEL"
|
|
14
14
|
```
|
|
@@ -112,7 +112,6 @@ EOF
|
|
|
112
112
|
curl -s -w "\n%{http_code}" -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
|
|
113
113
|
-H "Content-Type: application/json" \
|
|
114
114
|
-H "x-token: $TOKEN" \
|
|
115
|
-
-H "x-board-id: $BOARD_ID" \
|
|
116
115
|
-H "x-user-id: examples-skill" \
|
|
117
116
|
--data-binary @/tmp/examples_payload.json
|
|
118
117
|
```
|
package/stacks/modeling-kit/templates/.claude/skills/handle-comment/references/api-fallback.md
CHANGED
|
@@ -6,7 +6,7 @@ Only needed when MCP is not connected. Every call below has an MCP equivalent in
|
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
8
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/$NODE_ID/comments" \
|
|
9
|
-
-H "x-token: $TOKEN"
|
|
9
|
+
-H "x-token: $TOKEN" \
|
|
10
10
|
-H "Content-Type: application/json" \
|
|
11
11
|
-d '{"text":"<text>","type":"<type>","author":"<author>"}'
|
|
12
12
|
```
|
|
@@ -17,19 +17,19 @@ Response: `201 {"id":"<commentId>"}`
|
|
|
17
17
|
|
|
18
18
|
```bash
|
|
19
19
|
curl -s "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/$NODE_ID/comments" \
|
|
20
|
-
-H "x-token: $TOKEN"
|
|
20
|
+
-H "x-token: $TOKEN"
|
|
21
21
|
```
|
|
22
22
|
|
|
23
23
|
## Action: resolve — Step B (resolve)
|
|
24
24
|
|
|
25
25
|
```bash
|
|
26
26
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/$NODE_ID/comments/$COMMENT_ID/resolve" \
|
|
27
|
-
-H "x-token: $TOKEN"
|
|
27
|
+
-H "x-token: $TOKEN"
|
|
28
28
|
```
|
|
29
29
|
|
|
30
30
|
## Action: delete — Step C (delete)
|
|
31
31
|
|
|
32
32
|
```bash
|
|
33
33
|
curl -s -X DELETE "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/$NODE_ID/comments/$COMMENT_ID" \
|
|
34
|
-
-H "x-token: $TOKEN"
|
|
34
|
+
-H "x-token: $TOKEN"
|
|
35
35
|
```
|
|
@@ -7,7 +7,6 @@ Only needed when MCP is not connected. Every call below has an MCP equivalent in
|
|
|
7
7
|
```bash
|
|
8
8
|
curl -s "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/$NODE_ID" \
|
|
9
9
|
-H "x-token: $TOKEN" \
|
|
10
|
-
-H "x-board-id: $BOARD_ID" \
|
|
11
10
|
-H "x-user-id: agent"
|
|
12
11
|
```
|
|
13
12
|
|
|
@@ -16,7 +15,6 @@ curl -s "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/$NODE_ID" \
|
|
|
16
15
|
```bash
|
|
17
16
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/html-screens/$NODE_ID" \
|
|
18
17
|
-H "x-token: $TOKEN" \
|
|
19
|
-
-H "x-board-id: $BOARD_ID" \
|
|
20
18
|
-H "x-user-id: agent" \
|
|
21
19
|
-H "Content-Type: application/json" \
|
|
22
20
|
-d '{"pages": ["<div>...</div>", "<div>...</div>"]}'
|
|
@@ -28,7 +26,6 @@ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/html-screens/$NODE_I
|
|
|
28
26
|
NODE_ID=$(uuidgen)
|
|
29
27
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/html-screen-nodes/$NODE_ID" \
|
|
30
28
|
-H "x-token: $TOKEN" \
|
|
31
|
-
-H "x-board-id: $BOARD_ID" \
|
|
32
29
|
-H "x-user-id: agent" \
|
|
33
30
|
-H "Content-Type: application/json" \
|
|
34
31
|
-d '{"chapterId": "'"$CHAPTER_ID"'", "cellName": "'"$CELL_NAME"'", "title": "<Screen Title>", "pages": ["<div>...</div>"]}'
|
|
@@ -38,7 +35,7 @@ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/html-screen-nodes/$N
|
|
|
38
35
|
|
|
39
36
|
```bash
|
|
40
37
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
|
|
41
|
-
-H "x-token: $TOKEN" -H "x-
|
|
38
|
+
-H "x-token: $TOKEN" -H "x-user-id: agent" \
|
|
42
39
|
-H "Content-Type: application/json" \
|
|
43
40
|
-d '[{
|
|
44
41
|
"id": "<event-uuid>", "eventType": "node:changed", "nodeId": "<NODE_ID>",
|
|
@@ -309,7 +309,7 @@ Pass whichever cell reference you already resolved — `CELL_ID` from Step 6, or
|
|
|
309
309
|
|
|
310
310
|
### Step 7b — All other element types
|
|
311
311
|
|
|
312
|
-
Include `x-token
|
|
312
|
+
Include `x-token` and `x-user-id: agent` on every call to `/nodes/events`.
|
|
313
313
|
|
|
314
314
|
This step applies to `SCREEN` (view/output conflict case), `AUTOMATION`, `SCENARIO`-adjacent cleanup, and to `COMMAND`/`READMODEL`/`EVENT` whenever the "Prefer MCP — `place_element`" fast path above doesn't apply (explicit `cellName`, `"after <title>"` positioning, or conflict-insertion cases resolved manually in Step 6).
|
|
315
315
|
|