@eventmodelers/cli 1.0.76 → 1.0.78
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/cli.js +0 -1
- package/lib/adapters/spec-kitty-adapter.js +1 -1
- package/lib/fetch.js +1 -1
- 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 +31 -5
- 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/SKILL.md +2 -0
- package/stacks/modeling-kit/templates/.claude/skills/discover-storyboard/references/api-fallback.md +2 -3
- 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 +8 -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 +2 -5
- package/stacks/modeling-kit/templates/.claude/skills/place-element/SKILL.md +3 -1
- package/stacks/modeling-kit/templates/.claude/skills/place-element/references/api-fallback.md +4 -7
- package/stacks/modeling-kit/templates/.claude/skills/storyboard/SKILL.md +2 -0
- package/stacks/modeling-kit/templates/.claude/skills/storyboard/references/api-fallback.md +3 -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
package/cli.js
CHANGED
|
@@ -51,7 +51,7 @@ async function fetchFullSliceData(cfg, contextName) {
|
|
|
51
51
|
const agentId = cfg.agentId || process.env.EVENTMODELERS_AGENT_ID || '';
|
|
52
52
|
const res = await fetch(url, {
|
|
53
53
|
headers: {
|
|
54
|
-
'x-token': cfg.token, 'x-
|
|
54
|
+
'x-token': cfg.token, 'x-user-id': 'spec-kitty-adapter',
|
|
55
55
|
...(agentId ? { 'x-agent-id': agentId } : {}),
|
|
56
56
|
},
|
|
57
57
|
});
|
package/lib/fetch.js
CHANGED
|
@@ -76,7 +76,7 @@ export async function runFetch({ cwd, kitDir, cfg, opts = {} }) {
|
|
|
76
76
|
// sending it everywhere keeps one rule instead of a per-call judgment about which calls count.
|
|
77
77
|
const agentId = cfg.agentId || process.env.EVENTMODELERS_AGENT_ID || '';
|
|
78
78
|
const headers = {
|
|
79
|
-
'x-token': cfg.token, 'x-
|
|
79
|
+
'x-token': cfg.token, 'x-user-id': 'cli-fetch',
|
|
80
80
|
...(agentId ? { 'x-agent-id': agentId } : {}),
|
|
81
81
|
};
|
|
82
82
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eventmodelers/cli",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.78",
|
|
4
4
|
"description": "Eventmodelers CLI — real-time Claude agent + skills for Claude Code, for any stack (Node, Supabase, Axon, OpenCQRS, UmaDB, Kurrent, or modeling-only)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -181,7 +181,7 @@ function slugify(str) {
|
|
|
181
181
|
async function fetchAndPersistSlices(cfg, kitDir) {
|
|
182
182
|
const url = `${cfg.baseUrl}/api/org/${cfg.organizationId}/boards/${cfg.boardId}/slicedata/slices`;
|
|
183
183
|
const { slices } = await fetchJSON(url, {
|
|
184
|
-
headers: { 'x-token': cfg.token,
|
|
184
|
+
headers: { 'x-token': cfg.token, ...agentHeaders(cfg) },
|
|
185
185
|
});
|
|
186
186
|
const slicesDir = join(kitDir, '.slices');
|
|
187
187
|
mkdirSync(slicesDir, { recursive: true });
|
|
@@ -498,7 +498,7 @@ async function blockStuckSlice(kitDir, cfg, credentialed, planned, attempts) {
|
|
|
498
498
|
try {
|
|
499
499
|
await fetchJSON(`${cfg.baseUrl}/api/org/${cfg.organizationId}/boards/${cfg.boardId}/nodes/events`, {
|
|
500
500
|
method: 'POST',
|
|
501
|
-
headers: { 'Content-Type': 'application/json', 'x-token': cfg.token, 'x-
|
|
501
|
+
headers: { 'Content-Type': 'application/json', 'x-token': cfg.token, 'x-user-id': 'ralph-loop', ...agentHeaders(cfg) },
|
|
502
502
|
body: JSON.stringify([{
|
|
503
503
|
id: randomUUID(),
|
|
504
504
|
eventType: 'node:changed',
|
|
@@ -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
|
|
|
@@ -25,7 +25,7 @@ Server name: `eventmodelers`. Every tool takes `boardId` explicitly; none need `
|
|
|
25
25
|
| `get_node_comments` | `boardId`, `nodeId` | List comments on a node | §1 `GET .../nodes/:nodeId/comments` |
|
|
26
26
|
| `get_board_events` | `boardId` | All board events, in sequence | §1 `GET .../events` |
|
|
27
27
|
| `search_board_events` | `boardId`, `name` | Search events by node name | §1 `GET .../events/search` |
|
|
28
|
-
| `submit_node_events` | `boardId`, `events[]`, `autoConnect?`, `compact?` | Create/update nodes (raw `NodeChangeEvent`/edge events). `autoConnect: false` places freshly-created nodes without wiring them to their own/previous-column neighbors (avoids a stray nearest-left edge); `compact: true` returns `{persisted: <count>}` instead of the per-node hash map | §3 `POST .../nodes/events` |
|
|
28
|
+
| `submit_node_events` | `boardId`, `events[]`, `autoConnect?`, `compact?` | Create/update nodes (raw `NodeChangeEvent`/edge events). Every event property is described on the tool's own `events[]` schema — read that rather than this skill when all you need is the event shape. `autoConnect: false` places freshly-created nodes without wiring them to their own/previous-column neighbors (avoids a stray nearest-left edge); `compact: true` returns `{persisted: <count>}` instead of the per-node hash map | §3 `POST .../nodes/events` |
|
|
29
29
|
| `delete_node` | `boardId`, `nodeId` | Delete a node. Deleting a chapter (timeline) cascades — every node placed in one of its cells, plus any node parented to it (e.g. SLICE_BORDER), is deleted too, along with all their edges | (via `node:deleted` event, §3) |
|
|
30
30
|
| `create_drawing` / `create_drawings` | `boardId`, `kind`, `x`, `y`, `width`, `height`, ... (plural: `drawings[]`) | Freehand canvas annotation (path/rect/text/sticky) — never placed in a cell. Use the plural form whenever an annotation is more than one stroke (a loop plus its arrows and label is one annotation, not three calls) | — (REST `POST .../drawing/draw` accepts a single drawing or an array) |
|
|
31
31
|
| `find_nodes_in_drawing` | `boardId`, `drawingId` | Nodes fully contained inside a drawing's bounding box | — (no REST equivalent; MCP-only) |
|
|
@@ -44,6 +44,7 @@ Server name: `eventmodelers`. Every tool takes `boardId` explicitly; none need `
|
|
|
44
44
|
| `create_slice_definition` | `boardId`, `timelineId`, `columnId`, `title`, `status?`, `data?`, `meta?` | Create a SLICE_BORDER over an existing column. `status` sets its `sliceStatus` straight away instead of a follow-up `update_slice_status` | §5 `POST .../slice-definitions` |
|
|
45
45
|
| `place_element` / `place_elements` | `boardId`, `timelineId`, `elementType`, `title`, `fields?`, `lane?`, `columnIndex?`, `compact?`, `autoConnect?` (plural: `elements[]`) | Find/create an empty cell in the right lane and place a COMMAND/READMODEL/EVENT. `fields` writes the element's attributes in the same call — don't follow a placement with a `submit_node_events` just to set them. The plural form places a whole slice's or column run's worth in one call, applied in order so each entry sees the columns the previous one added. `autoConnect: false` places without wiring to timeline neighbors — wire the edges yourself | — (MCP-only convenience; composes §2+§3) |
|
|
46
46
|
| `list_slices` | `boardId` | List slices (id, title, status) | §8 `GET .../slicedata/slices` |
|
|
47
|
+
| `get_slice_rework` | `boardId`, `contextId` | How much each slice of one context has been reworked: changes, steps backwards, and reopens after Done, most reworked first, plus planning metrics over them. `contextId` is a MODEL_CONTEXT or a timeline (a timeline resolves to the context it belongs to). Always per context — there is no board-wide form | §8 `GET .../reporting/rework/contexts/:contextId` |
|
|
47
48
|
| `update_slice_status` | `boardId`, `newStatus`, plus exactly one of `sliceId` / `sliceTitle` / `columnId` | Change a SLICE_BORDER's `sliceStatus`. With a title or column id there is no need to call `list_slices` first; an ambiguous title comes back with its candidates. A slice being created takes its status from `create_slice`/`create_slice_definition` instead | — (via `node:changed` event, §3) |
|
|
48
49
|
| `get_slice_data` | `boardId`, `contextName?`, `contextId?`, `sliceId?` | Full element graph for slices in a context | §8 `GET /slicedata` |
|
|
49
50
|
| `get_spec_info` | `boardId`, `timelineId`, `elementTypes?` | EVENT/COMMAND/READMODEL nodes valid in GWT steps. Pass `elementTypes` (subset of `EVENT`/`COMMAND`/`READMODEL`) to avoid pulling the full element list when only one or two types are needed — filtered server-side, not just after a full fetch | §6 `GET .../spec-info` |
|
|
@@ -57,7 +58,7 @@ Server name: `eventmodelers`. Every tool takes `boardId` explicitly; none need `
|
|
|
57
58
|
| `link_element` | `boardId`, `nodeId`, plus either `targetNodeId` or `timelineId` (+ `columnIndex?`, `lane?`) | Turn a node into a linked copy of `nodeId` — it receives a full copy of that node's meta plus `meta.linkedTo`. Name an existing `targetNodeId`, or pass `timelineId` to have the copy placed and linked in this one call (inheriting the original's type and title), which is what a translation or automation chain wants | §3 `POST .../nodes/:nodeId/link` |
|
|
58
59
|
| `add_comment` / `add_comments` | `boardId`, `nodeId`, `text`, `type?` (`'COMMENT'\|'TASK'\|'QUESTION'`), `author?` (plural: `comments[]`, each with its own `nodeId`) | Add a comment — `QUESTION` is the type for a gap/edge case raised during review. Use the plural form for a review that has a question per element: all of them go in one call | §1 `POST .../boards/:boardId/comments` (batch) |
|
|
59
60
|
| `update_comment` | `boardId`, `nodeId`, `commentId`, `action` (`'resolve'\|'delete'`) | Resolve or delete a comment | — (via comment events) |
|
|
60
|
-
| `create_screen` | `boardId`, `contentType` (`'image'\|'sketch'\|'html'`), `nodeId?`, `chapterId`, `cellId?`/`cellName?`, plus content fields (`imageBase64`/`mimeType`, `elements[]`, or `pages[]`/`backgroundColor`), `description?`, `fields?`, `autoConnect?` | Create + place a new screen node (SCREEN or HTML_SCREEN) atomically, in one call. Batch form `create_screens` takes `screens[]` (HTML only) + `autoConnect?`. `autoConnect: false` places without wiring to timeline neighbors | §4 `POST .../images/:id/sketch` + `image-nodes` |
|
|
61
|
+
| `create_screen` | `boardId`, `contentType` (`'image'\|'sketch'\|'html'`), `nodeId?`, `chapterId`, `cellId?`/`cellName?`, plus content fields (`imageBase64`/`mimeType`, `elements[]`, or `pages[]`/`backgroundColor`), `title?`, `description?`, `fields?`, `autoConnect?` | Create + place a new screen node (SCREEN or HTML_SCREEN) atomically, in one call. `title` names the node (`meta.title`) in the same call — no follow-up `node:changed` just to label the screen; `create_screens` takes it per entry. Batch form `create_screens` takes `screens[]` (HTML only) + `autoConnect?`. `autoConnect: false` places without wiring to timeline neighbors | §4 `POST .../images/:id/sketch` + `image-nodes` |
|
|
61
62
|
| `render_screen` | `boardId`, `nodeId`, `elements[]?` (SCREEN) or `pages[]?`+`backgroundColor?` (HTML_SCREEN), `description?` | Update an existing screen's content — exactly one of `elements`/`pages` | §4 `POST .../images/:id/sketch` + `image-nodes` |
|
|
62
63
|
| `add_field_examples` | `boardId`, `nodeId?`, `name?`, `cellName?`, `timelineId?` | Fill empty field examples using linked-node context | — (MCP-only convenience) |
|
|
63
64
|
| `get_attribute_chain` | `boardId`, `timelineId`, `targetCellName`, `sourceCellName` | Resolve every node between two cells, ordered target→source | — (MCP-only convenience) |
|
|
@@ -514,7 +515,7 @@ Update an image snapshot.
|
|
|
514
515
|
### POST `/api/org/:orgId/boards/:boardId/image-nodes/:nodeId`
|
|
515
516
|
Create an image node.
|
|
516
517
|
|
|
517
|
-
**Request**: `multipart/form-data` — fields: `file`, `chapterId`, `cellName`
|
|
518
|
+
**Request**: `multipart/form-data` — fields: `file`, `chapterId`, `cellName`, `title?` (label shown on the node, `meta.title`)
|
|
518
519
|
**Response**: `204`
|
|
519
520
|
|
|
520
521
|
---
|
|
@@ -543,6 +544,7 @@ Create a SCREEN node from a sketch description.
|
|
|
543
544
|
cellName: string
|
|
544
545
|
description: { elements: object[] }
|
|
545
546
|
semanticDescription?: string
|
|
547
|
+
title?: string // label shown on the node (meta.title)
|
|
546
548
|
}
|
|
547
549
|
```
|
|
548
550
|
**Response**: `204` OR `400` (validation error)
|
|
@@ -730,6 +732,30 @@ List all slices on a board.
|
|
|
730
732
|
|
|
731
733
|
---
|
|
732
734
|
|
|
735
|
+
### GET `/api/org/:orgId/boards/:boardId/reporting/rework/contexts/:contextId`
|
|
736
|
+
**File**: `src/slices/change/reporting/rework/routes.ts`
|
|
737
|
+
|
|
738
|
+
How much each slice of one context has been reworked — read-only, derived from the board event log; nothing is stored
|
|
739
|
+
for it.
|
|
740
|
+
|
|
741
|
+
A slice's rework is read from its own SLICE_BORDER history. Going backwards means a step down the progress order
|
|
742
|
+
(Created → Planned → Assigned → InProgress → Review → Done), or reaching `Blocked` from `Review`/`Done`;
|
|
743
|
+
`Informational` is never scored. `reopens` counts transitions leading away from `Done`, `changes` counts writes to the
|
|
744
|
+
slice itself. This says nothing about edits to the elements inside a slice.
|
|
745
|
+
|
|
746
|
+
`contextId` is a MODEL_CONTEXT node id, or a timeline id — a timeline resolves through the board's own effective
|
|
747
|
+
context (the same rule `slicedata` uses), so one that inherits a context is reported under that context and one with
|
|
748
|
+
none is its own. Any other node type is rejected. Always scoped to one context; there is no board-wide form.
|
|
749
|
+
|
|
750
|
+
**Response**: `200` — `{ contextId, contextName, metrics, slices[] }`, slices most reworked first.
|
|
751
|
+
`slices[]` = `{ sliceId, title, status, changes, reopens, regressions, everReachedDone }`.
|
|
752
|
+
`metrics` = `{ slices, everReachedDone, reopenedAfterDone, firstTimeRightRate, currentlyReopened, avgReopensPerSlice,
|
|
753
|
+
avgChangesPerSlice }` — `firstTimeRightRate` is the share of the slices that reached Done and never came back, or
|
|
754
|
+
`null` when none got there yet.
|
|
755
|
+
`400` `CONTEXT_ID_REQUIRED` / `CONTEXT_NODE_INVALID` · `404` `CONTEXT_NOT_FOUND`
|
|
756
|
+
|
|
757
|
+
---
|
|
758
|
+
|
|
733
759
|
## 9. Extensions
|
|
734
760
|
|
|
735
761
|
**File**: `src/slices/extensions/routes.ts`
|
|
@@ -970,7 +996,7 @@ The same `agent_id` belongs in the `x-agent-id` header of every board call this
|
|
|
970
996
|
---
|
|
971
997
|
|
|
972
998
|
### GET `/api/org/:orgId/boards/:boardId/agent-alive`
|
|
973
|
-
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.
|
|
974
1000
|
|
|
975
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
|
|
976
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
|
```
|
|
@@ -309,6 +309,7 @@ mcp__eventmodelers__create_screen {
|
|
|
309
309
|
"nodeId": "<SCREEN_NODE_ID>",
|
|
310
310
|
"chapterId": "<CHAPTER_ID>",
|
|
311
311
|
"cellId": "<CELL_ID>",
|
|
312
|
+
"title": "<screen.title>",
|
|
312
313
|
"pages": ["<reconstructed HTML fragment for this screen>"],
|
|
313
314
|
"description": "<screen.description — 'Shows X. Arrived via: Y. Actions: user can do A, user can do B.'>"
|
|
314
315
|
}
|
|
@@ -325,6 +326,7 @@ mcp__eventmodelers__create_screen {
|
|
|
325
326
|
"nodeId": "<SCREEN_NODE_ID>",
|
|
326
327
|
"chapterId": "<CHAPTER_ID>",
|
|
327
328
|
"cellName": "<CELL_NAME>",
|
|
329
|
+
"title": "<screen.title>",
|
|
328
330
|
"imageBase64": "<base64-encoded contents of screen.filepath, no data: URI prefix>",
|
|
329
331
|
"mimeType": "image/png",
|
|
330
332
|
"description": "<screen.description — 'Shows X. Arrived via: Y. Actions: user can do A, user can do B.'>"
|
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 '{}'
|
|
@@ -58,6 +56,7 @@ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/image-nodes/$SCREEN_
|
|
|
58
56
|
-H "x-token: $TOKEN" \
|
|
59
57
|
-F "file=@<screen.filepath>" \
|
|
60
58
|
-F "chapterId=$CHAPTER_ID" \
|
|
61
|
-
-F "cellName=$CELL_NAME"
|
|
59
|
+
-F "cellName=$CELL_NAME" \
|
|
60
|
+
-F "title=<screen.title>"
|
|
62
61
|
```
|
|
63
62
|
For the HTML path with no MCP, use the `html-screen-nodes` endpoint per the `html-screen` skill's fallback mechanics instead.
|
|
@@ -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,11 +31,12 @@ 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>",
|
|
38
38
|
"cellId": "<actorRowId>-<columnId>",
|
|
39
|
+
"title": "<Screen Title>",
|
|
39
40
|
"pages": ["<div>...</div>"]
|
|
40
41
|
}'
|
|
41
42
|
```
|
|
@@ -45,7 +46,7 @@ Then, over REST only (no `fields` param on the HTML-screen endpoint), still set
|
|
|
45
46
|
|
|
46
47
|
```bash
|
|
47
48
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
|
|
48
|
-
-H "x-token: $TOKEN" -H "x-
|
|
49
|
+
-H "x-token: $TOKEN" -H "x-user-id: storyboarding-events" \
|
|
49
50
|
-H "Content-Type: application/json" \
|
|
50
51
|
-d '[{
|
|
51
52
|
"id": "<event-uuid>",
|
|
@@ -63,7 +64,7 @@ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
|
|
|
63
64
|
|
|
64
65
|
```bash
|
|
65
66
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/images/$NODE_ID/sketch" \
|
|
66
|
-
-H "x-token: $TOKEN" -H "x-
|
|
67
|
+
-H "x-token: $TOKEN" -H "x-user-id: storyboarding-events" \
|
|
67
68
|
-H "Content-Type: application/json" \
|
|
68
69
|
-d '{
|
|
69
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,17 +26,16 @@ 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
|
-
-d '{"chapterId": "'"$CHAPTER_ID"'", "cellName": "'"$CELL_NAME"'", "pages": ["<div>...</div>"]}'
|
|
31
|
+
-d '{"chapterId": "'"$CHAPTER_ID"'", "cellName": "'"$CELL_NAME"'", "title": "<Screen Title>", "pages": ["<div>...</div>"]}'
|
|
35
32
|
```
|
|
36
33
|
|
|
37
34
|
## Step 5 — Define field data lineage
|
|
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>",
|
|
@@ -278,6 +278,7 @@ mcp__eventmodelers__create_screen {
|
|
|
278
278
|
"nodeId": "<node-uuid>",
|
|
279
279
|
"chapterId": "<TIMELINE_ID>",
|
|
280
280
|
"cellId": "<CELL_ID>",
|
|
281
|
+
"title": "<title>",
|
|
281
282
|
"pages": ["<div>...</div>"],
|
|
282
283
|
"description": "<title — what this screen shows>"
|
|
283
284
|
}
|
|
@@ -296,6 +297,7 @@ mcp__eventmodelers__create_screen {
|
|
|
296
297
|
"nodeId": "<node-uuid>",
|
|
297
298
|
"chapterId": "<TIMELINE_ID>",
|
|
298
299
|
"cellId": "<CELL_ID>",
|
|
300
|
+
"title": "<title>",
|
|
299
301
|
"elements": [...],
|
|
300
302
|
"description": "<title — what this screen shows>"
|
|
301
303
|
}
|
|
@@ -307,7 +309,7 @@ Pass whichever cell reference you already resolved — `CELL_ID` from Step 6, or
|
|
|
307
309
|
|
|
308
310
|
### Step 7b — All other element types
|
|
309
311
|
|
|
310
|
-
Include `x-token
|
|
312
|
+
Include `x-token` and `x-user-id: agent` on every call to `/nodes/events`.
|
|
311
313
|
|
|
312
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).
|
|
313
315
|
|
package/stacks/modeling-kit/templates/.claude/skills/place-element/references/api-fallback.md
CHANGED
|
@@ -45,7 +45,6 @@ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/timelines/$TL/column
|
|
|
45
45
|
```bash
|
|
46
46
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/timelines/$TIMELINE_ID/columns" \
|
|
47
47
|
-H "x-token: $TOKEN" \
|
|
48
|
-
-H "x-board-id: $BOARD_ID" \
|
|
49
48
|
-H "x-user-id: agent" \
|
|
50
49
|
-H "Content-Type: application/json" \
|
|
51
50
|
-d '{}'
|
|
@@ -75,7 +74,7 @@ No relative-insertion equivalent over REST (unlike MCP's `afterNodeId`) — comp
|
|
|
75
74
|
|
|
76
75
|
```bash
|
|
77
76
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/timelines/$TIMELINE_ID/columns" \
|
|
78
|
-
-H "x-token: $TOKEN" -H "x-
|
|
77
|
+
-H "x-token: $TOKEN" -H "x-user-id: agent" \
|
|
79
78
|
-H "Content-Type: application/json" \
|
|
80
79
|
-d '{"index": <currentColumnIndex + 1>}'
|
|
81
80
|
```
|
|
@@ -89,12 +88,12 @@ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/timelines/$TIMELINE_
|
|
|
89
88
|
```bash
|
|
90
89
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/html-screen-nodes/<node-uuid>" \
|
|
91
90
|
-H "x-token: $TOKEN" \
|
|
92
|
-
-H "x-board-id: $BOARD_ID" \
|
|
93
91
|
-H "x-user-id: agent" \
|
|
94
92
|
-H "Content-Type: application/json" \
|
|
95
93
|
-d '{
|
|
96
94
|
"chapterId": "<TIMELINE_ID>",
|
|
97
95
|
"cellId": "<CELL_ID>",
|
|
96
|
+
"title": "<title>",
|
|
98
97
|
"pages": ["<div>...</div>"]
|
|
99
98
|
}'
|
|
100
99
|
```
|
|
@@ -104,12 +103,12 @@ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/html-screen-nodes/<n
|
|
|
104
103
|
```bash
|
|
105
104
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/image-nodes/<node-uuid>/sketch" \
|
|
106
105
|
-H "x-token: $TOKEN" \
|
|
107
|
-
-H "x-board-id: $BOARD_ID" \
|
|
108
106
|
-H "x-user-id: agent" \
|
|
109
107
|
-H "Content-Type: application/json" \
|
|
110
108
|
-d '{
|
|
111
109
|
"chapterId": "<TIMELINE_ID>",
|
|
112
110
|
"cellId": "<CELL_ID>",
|
|
111
|
+
"title": "<title>",
|
|
113
112
|
"description": {"elements": [...]},
|
|
114
113
|
"semanticDescription": "<title — what this screen shows>"
|
|
115
114
|
}'
|
|
@@ -117,12 +116,11 @@ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/image-nodes/<node-uu
|
|
|
117
116
|
|
|
118
117
|
## Step 7b — Create any other node type (normal path, `cellId`)
|
|
119
118
|
|
|
120
|
-
Include `x-token
|
|
119
|
+
Include `x-token` and `x-user-id: agent` on every call to `/nodes/events`.
|
|
121
120
|
|
|
122
121
|
```bash
|
|
123
122
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
|
|
124
123
|
-H "x-token: $TOKEN" \
|
|
125
|
-
-H "x-board-id: $BOARD_ID" \
|
|
126
124
|
-H "x-user-id: agent" \
|
|
127
125
|
-H "Content-Type: application/json" \
|
|
128
126
|
-d '[{
|
|
@@ -147,7 +145,6 @@ Same as above, but `cellName` replaces `cellId` — nothing else in the payload
|
|
|
147
145
|
```bash
|
|
148
146
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
|
|
149
147
|
-H "x-token: $TOKEN" \
|
|
150
|
-
-H "x-board-id: $BOARD_ID" \
|
|
151
148
|
-H "x-user-id: agent" \
|
|
152
149
|
-H "Content-Type: application/json" \
|
|
153
150
|
-d '[{
|
|
@@ -183,6 +183,7 @@ mcp__eventmodelers__create_screen {
|
|
|
183
183
|
"nodeId": "<SCREEN_NODE_ID>",
|
|
184
184
|
"chapterId": "<CHAPTER_ID>",
|
|
185
185
|
"cellId": "<actorCellId>",
|
|
186
|
+
"title": "<screenTitle>",
|
|
186
187
|
"pages": ["<div>...</div>"],
|
|
187
188
|
"description": "<screenTitle — what this screen shows>"
|
|
188
189
|
}
|
|
@@ -201,6 +202,7 @@ mcp__eventmodelers__create_screen {
|
|
|
201
202
|
"nodeId": "<SCREEN_NODE_ID>",
|
|
202
203
|
"chapterId": "<CHAPTER_ID>",
|
|
203
204
|
"cellId": "<actorCellId>",
|
|
205
|
+
"title": "<screenTitle>",
|
|
204
206
|
"elements": [...],
|
|
205
207
|
"description": "<screenTitle — what this screen shows>"
|
|
206
208
|
}
|
|
@@ -33,12 +33,12 @@ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/timelines/$CHAPTER_I
|
|
|
33
33
|
```bash
|
|
34
34
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/html-screen-nodes/$SCREEN_NODE_ID" \
|
|
35
35
|
-H "x-token: $TOKEN" \
|
|
36
|
-
-H "x-board-id: $BOARD_ID" \
|
|
37
36
|
-H "x-user-id: agent" \
|
|
38
37
|
-H "Content-Type: application/json" \
|
|
39
38
|
-d '{
|
|
40
39
|
"chapterId": "<CHAPTER_ID>",
|
|
41
40
|
"cellId": "<actorCellId>",
|
|
41
|
+
"title": "<screenTitle>",
|
|
42
42
|
"pages": ["<div>...</div>"]
|
|
43
43
|
}'
|
|
44
44
|
```
|
|
@@ -48,12 +48,12 @@ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/html-screen-nodes/$S
|
|
|
48
48
|
```bash
|
|
49
49
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/image-nodes/$SCREEN_NODE_ID/sketch" \
|
|
50
50
|
-H "x-token: $TOKEN" \
|
|
51
|
-
-H "x-board-id: $BOARD_ID" \
|
|
52
51
|
-H "x-user-id: agent" \
|
|
53
52
|
-H "Content-Type: application/json" \
|
|
54
53
|
-d '{
|
|
55
54
|
"chapterId": "<CHAPTER_ID>",
|
|
56
55
|
"cellId": "<actorCellId>",
|
|
56
|
+
"title": "<screenTitle>",
|
|
57
57
|
"description": {"elements": [...]},
|
|
58
58
|
"semanticDescription": "<screenTitle — what this screen shows>"
|
|
59
59
|
}'
|
|
@@ -63,7 +63,7 @@ curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/image-nodes/$SCREEN_
|
|
|
63
63
|
|
|
64
64
|
```bash
|
|
65
65
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
|
|
66
|
-
-H "x-token: $TOKEN" -H "x-
|
|
66
|
+
-H "x-token: $TOKEN" -H "x-user-id: agent" \
|
|
67
67
|
-H "Content-Type: application/json" \
|
|
68
68
|
-d '[{
|
|
69
69
|
"id": "<event-uuid>", "eventType": "node:changed", "nodeId": "<SCREEN_NODE_ID>",
|
package/stacks/modeling-kit/templates/.claude/skills/storyboard-screen/references/api-fallback.md
CHANGED
|
@@ -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/images/$NODE_ID/description" \
|
|
9
9
|
-H "x-token: $TOKEN" \
|
|
10
|
-
-H "x-board-id: $BOARD_ID" \
|
|
11
10
|
-H "x-user-id: agent"
|
|
12
11
|
```
|
|
13
12
|
|
|
@@ -19,7 +18,6 @@ curl -s "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/images/$NODE_ID/description"
|
|
|
19
18
|
```bash
|
|
20
19
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/images/$NODE_ID/sketch" \
|
|
21
20
|
-H "x-token: $TOKEN" \
|
|
22
|
-
-H "x-board-id: $BOARD_ID" \
|
|
23
21
|
-H "x-user-id: agent" \
|
|
24
22
|
-H "Content-Type: application/json" \
|
|
25
23
|
-d '{"description": "<what this screen shows>", "elements": [...]}'
|
|
@@ -31,7 +29,7 @@ Expect `204 No Content` on success.
|
|
|
31
29
|
|
|
32
30
|
```bash
|
|
33
31
|
curl -s -X POST "$BASE_URL/api/org/$ORG_ID/boards/$BOARD_ID/nodes/events" \
|
|
34
|
-
-H "x-token: $TOKEN" -H "x-
|
|
32
|
+
-H "x-token: $TOKEN" -H "x-user-id: agent" \
|
|
35
33
|
-H "Content-Type: application/json" \
|
|
36
34
|
-d '[{
|
|
37
35
|
"id": "<event-uuid>", "eventType": "node:changed", "nodeId": "<NODE_ID>",
|
|
@@ -146,7 +146,7 @@ Only post questions that are **genuinely unclear or missing** — don't post obs
|
|
|
146
146
|
|
|
147
147
|
**Prefer MCP:** `mcp__eventmodelers__create_drawing` — one call per drawing, no auth headers needed.
|
|
148
148
|
|
|
149
|
-
**Fallback (no MCP):** `POST /api/org/{orgId}/boards/{boardId}/drawing/draw` (auth headers same as every other call — `x-token`, `x-
|
|
149
|
+
**Fallback (no MCP):** `POST /api/org/{orgId}/boards/{boardId}/drawing/draw` (auth headers same as every other call — `x-token`, `x-user-id: wdyt`). Same fields as the tool args below.
|
|
150
150
|
|
|
151
151
|
There are two kinds — no text-callout kind; a drawing never carries the question itself, only the shape of the concern:
|
|
152
152
|
|
|
@@ -178,7 +178,7 @@ function slugify(str) {
|
|
|
178
178
|
async function fetchAndPersistSlices(cfg, kitDir) {
|
|
179
179
|
const url = `${cfg.baseUrl}/api/org/${cfg.organizationId}/boards/${cfg.boardId}/slicedata/slices`;
|
|
180
180
|
const { slices } = await fetchJSON(url, {
|
|
181
|
-
headers: { 'x-token': cfg.token,
|
|
181
|
+
headers: { 'x-token': cfg.token, ...agentHeaders(cfg) },
|
|
182
182
|
});
|
|
183
183
|
const slicesDir = join(kitDir, '.slices');
|
|
184
184
|
mkdirSync(slicesDir, { recursive: true });
|
|
@@ -400,7 +400,7 @@ async function blockStuckSlice(kitDir, cfg, credentialed, planned, attempts) {
|
|
|
400
400
|
try {
|
|
401
401
|
await fetchJSON(`${cfg.baseUrl}/api/org/${cfg.organizationId}/boards/${cfg.boardId}/nodes/events`, {
|
|
402
402
|
method: 'POST',
|
|
403
|
-
headers: { 'Content-Type': 'application/json', 'x-token': cfg.token, 'x-
|
|
403
|
+
headers: { 'Content-Type': 'application/json', 'x-token': cfg.token, 'x-user-id': 'ralph-loop', ...agentHeaders(cfg) },
|
|
404
404
|
body: JSON.stringify([{
|
|
405
405
|
id: randomUUID(),
|
|
406
406
|
eventType: 'node:changed',
|