@eventmodelers/cli 1.0.132 → 1.0.134
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eventmodelers/cli",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.134",
|
|
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": {
|
|
@@ -9,7 +9,7 @@ description: Residuality-theory stressor analysis of one chapter, run as a chat
|
|
|
9
9
|
|
|
10
10
|
Prefer `mcp__eventmodelers__*` tools. See `learn-eventmodelers-api` for the curl fallback and §16 *Chat snippets* for the `tasks`, `table`, `poll` and `confirm` shapes.
|
|
11
11
|
|
|
12
|
-
The analysis runs over several chat turns: each step ends with **one** `post_chat_message` carrying one snippet, and the person's click is the next turn. In a `CHAT` turn `replyTo` = this turn's `message_id`; in a prompt turn that came from a chat, `sessionId` = `CHAT_SESSION_ID` and no `replyTo`. Find where you are from the session (`get_chat_session`): the answer to your last snippet says which step comes next.
|
|
12
|
+
The analysis runs over several chat turns: each step ends with **one** `post_chat_message` carrying one snippet (except Step 1b), and the person's click is the next turn. In a `CHAT` turn `replyTo` = this turn's `message_id`; in a prompt turn that came from a chat, `sessionId` = `CHAT_SESSION_ID` and no `replyTo`. Find where you are from the session (`get_chat_session`): the answer to your last snippet says which step comes next.
|
|
13
13
|
|
|
14
14
|
**This skill never writes to the board** until the person says yes in Step 3 — and then only through `create_prompt`.
|
|
15
15
|
|
|
@@ -17,7 +17,7 @@ The analysis runs over several chat turns: each step ends with **one** `post_cha
|
|
|
17
17
|
|
|
18
18
|
## Concepts (get these right)
|
|
19
19
|
|
|
20
|
-
- **Stressor**: anything that can happen to the system or its environment: technical, business, legal, market, people. Deliberately WIDE, far-fetched ones included. Not a risk list, not a prediction.
|
|
20
|
+
- **Stressor**: anything that can happen to the system or its environment: technical, business, legal, market, people, nature. Deliberately WIDE, far-fetched ones included. Not a risk list, not a prediction — the theory holds that *which* stressors you pick barely matters, what matters is that they come from many directions. So most must come from **outside** the model: a power outage, a pandemic, a new law, the company being acquired, the key admin quitting, a competitor going free. Only loosely related to the chapter is fine.
|
|
21
21
|
- **Residue**: what is LEFT of the system after the stressor hits: which slices still work, which state or data survives or is lost. You observe a residue; you don't build it. The fix is NOT the residue.
|
|
22
22
|
- **Goal**: change the model until every residue is acceptable. The architecture becomes the sum of those residues, so it also survives stressors nobody listed.
|
|
23
23
|
- **Incidence matrix**: stressors × elements. Elements hit by the SAME stressors are hidden-coupled.
|
|
@@ -28,32 +28,41 @@ The analysis runs over several chat turns: each step ends with **one** `post_cha
|
|
|
28
28
|
|
|
29
29
|
The chapter comes from `$ARGUMENTS` / the message, else the turn's `context=` (`timelineId`, selection). None and more than one chapter on the board: ask with a `poll` of the chapters (each option's `message` a complete `/stressor-analysis <chapter>` request) and end the turn.
|
|
30
30
|
|
|
31
|
-
Read once and reuse for the whole round: `get_board_outline` (gives `sliceStatus` per slice) and `get_slice_data { boardId, contextName, projection: "fields", format: "toon" }` for the chapter.
|
|
31
|
+
Read once and reuse for the whole round: `get_board_outline` (gives `sliceStatus` per slice) and `get_slice_data { boardId, contextName, projection: "fields", format: "toon" }` for the chapter. Residues name the real slices and elements they hit (field names only in the matrix step, never in a residue); every `nodeId` you send is an id you read here.
|
|
32
32
|
|
|
33
33
|
---
|
|
34
34
|
|
|
35
35
|
## Step 1 — Stressors and their residues (`tasks`)
|
|
36
36
|
|
|
37
|
-
About **15** wide stressors
|
|
37
|
+
About **15** wide stressors, mixed:
|
|
38
|
+
|
|
39
|
+
- **at least 5 external** — things that happen to the business or the world, not to the model: power outage, office flooded, pandemic, new privacy law, company acquired, key person leaves, a competitor goes free, the main customer goes bankrupt, the cloud region is gone for a week;
|
|
40
|
+
- the rest from the chapter's own business (a customer changes their mind, prices change, a partner stops delivering) — still at business level.
|
|
41
|
+
|
|
42
|
+
Write them the way a business person would say them, short — **no** field names, attribute values, concurrency races, token or API mechanics. One stressor per task, no "(e.g. X, Y)" sub-lists. Order the list so external and internal stressors alternate, not grouped.
|
|
43
|
+
|
|
44
|
+
Per task: `title` = the stressor (≤ 8 words), `description` = `Residue: <what still works / what is lost>` — **one short sentence** in plain language, naming slices or elements but not fields, `nodeId` = the element most affected, `id` = `S1`, `S2`, …. `headline`: *"Tick the ones whose residue is unacceptable"*, `submitLabel`: *"These are unacceptable"*.
|
|
38
45
|
|
|
39
46
|
```
|
|
40
47
|
"snippet": { "kind": "tasks", "headline": "Tick the ones whose residue is unacceptable", "submitLabel": "These are unacceptable",
|
|
41
|
-
"tasks": [ { "id": "S1", "title": "Payment provider is down for a day", "description": "Residue: orders
|
|
48
|
+
"tasks": [ { "id": "S1", "title": "Payment provider is down for a day", "description": "Residue: orders still come in, but nothing ships until payments return", "nodeId": "<Order Paid id>" },
|
|
49
|
+
{ "id": "S2", "title": "Power outage in the warehouse", "description": "Residue: orders are paid, nobody can pick them — customers aren't told", "nodeId": "<Shipping List id>" }, … ] }
|
|
42
50
|
```
|
|
43
51
|
|
|
44
|
-
### Step 1b —
|
|
52
|
+
### Step 1b — "More" right after the list (`confirm`)
|
|
45
53
|
|
|
46
|
-
|
|
54
|
+
Every `tasks` list of stressors is followed **in the same turn** by its own `post_chat_message` (same `replyTo` / `sessionId`) carrying this `confirm`. Order matters: post the **full list first**, then the confirm — the person sees every stressor and residue before being asked whether they want more. Never post the confirm on its own or ahead of the list, and never describe the list in the confirm's text as something still to come ("15 stressors come next") — it is already above. The confirm's text is one short line, e.g. *"Tick the unacceptable ones above — or ask for more stressors first."*
|
|
47
55
|
|
|
48
56
|
```
|
|
49
|
-
"snippet": { "kind": "
|
|
50
|
-
"options": [ { "label": "Add more", "message": "Add more stressors" },
|
|
51
|
-
{ "label": "Done — build the matrix", "message": "Done with stressors, build the matrix" } ] }
|
|
57
|
+
"snippet": { "kind": "confirm", "headline": "Need more stressors?", "yesLabel": "More", "noLabel": "Done — build the matrix" }
|
|
52
58
|
```
|
|
53
59
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
-
|
|
60
|
+
This is the one exception to "one snippet per step". The lists stay open, so ticks are submitted per list whenever the person is ready:
|
|
61
|
+
|
|
62
|
+
- **A `tasks` list is submitted**: note which stressors were ticked, reply in one line, **no** snippet — the open confirm still decides what comes next.
|
|
63
|
+
- **More**: a new `tasks` list (same `headline`/`submitLabel`) of about 10 **fresh** stressors: none already offered, same external/internal mix as Step 1, aimed at elements and categories (nature, legal, people, market, data, …) the earlier lists hit least. Ids continue the numbering (`S16`, `S17`, …). Post the new list first, then this confirm again after it.
|
|
64
|
+
- **Done**: go to Step 2 with every stressor ticked across all lists (read the session to collect them).
|
|
65
|
+
- Fewer than **5** ticked in total at Done: explain in the text that the matrix can't show coupling yet and send this confirm again.
|
|
57
66
|
|
|
58
67
|
---
|
|
59
68
|
|
|
@@ -214,7 +214,7 @@ for it. Instead:
|
|
|
214
214
|
with the field name there) is your one reply. Without a clear subject it asks first which information.
|
|
215
215
|
- **stressor analysis** — "what breaks if …?", "stress-test this chapter", or `/stressor-analysis …`: run the
|
|
216
216
|
`/stressor-analysis` skill **in this turn** — it only reads the board until the person says yes, so no prompt is needed
|
|
217
|
-
for its steps. It is a loop over several turns (stressors as `tasks
|
|
217
|
+
for its steps. It is a loop over several turns (stressors as `tasks` with a "More" `confirm` posted after each list, the incidence matrix as a `table`, a redesign as
|
|
218
218
|
`confirm`); an answer to one of its snippets continues it at the next step. Only the confirmed new slices become prompts.
|
|
219
219
|
- **a skill by name** — the message starts with `/<name>` of one of your skills (the chat panel's menu
|
|
220
220
|
writes these: `/analyze-existing-model`, `/analyze-code-base`, `/detect-model-drift`, `/timeline …`,
|