@eventmodelers/cli 1.0.132 → 1.0.133

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.132",
3
+ "version": "1.0.133",
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. Ground every statement in real element and field names; every `nodeId` you send is an id you read here.
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. Per task: `title` = the stressor, `description` = `Residue: <what still works / what is lost>`, `nodeId` = the element most affected, `id` = `S1`, `S2`, …. `headline`: *"Tick the ones whose residue is unacceptable"*, `submitLabel`: *"These are unacceptable"*.
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 are placed, Order Paid never arrives — Shipping waits forever", "nodeId": "<Order Paid id>" }, … ] }
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 — Add more? (`poll`), until done
52
+ ### Step 1b — "More" right before the list (`confirm`)
45
53
 
46
- When the ticks come back, don't jump to the matrix. Acknowledge the ticks in one line and ask whether to add more stressors with a `poll`:
54
+ Every `tasks` list of stressors is preceded **in the same turn** by its own `post_chat_message` (same `replyTo` / `sessionId`) carrying this `confirm` — post it first, then the list, so the person can ask for more stressors before ticking or submitting anything:
47
55
 
48
56
  ```
49
- "snippet": { "kind": "poll", "question": "Should I add more stressors?",
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
- - **Add more**: a new `tasks` list (same `headline`/`submitLabel`) of about 10 **fresh** stressors: none already offered, aimed at elements and categories (legal, people, market, data, …) the earlier rounds hit least. Ids continue the numbering (`S16`, `S17`, …). Then this poll again.
55
- - **Done**: go to Step 2 with every stressor ticked across all rounds.
56
- - Fewer than **5** ticked in total and the person picks Done: explain in the text that the matrix can't show coupling yet and send this poll again.
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 this confirm again first, then the new list.
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`, the incidence matrix as a `table`, a redesign as
217
+ for its steps. It is a loop over several turns (stressors as `tasks` with a "More" `confirm` posted before 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 …`,