eventmodeler 0.6.0 → 0.6.2
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/dist/index.js +7133 -34
- package/package.json +5 -4
- package/dist/api/client-config.js +0 -10
- package/dist/api/generated/client/client.gen.js +0 -235
- package/dist/api/generated/client/index.js +0 -6
- package/dist/api/generated/client/types.gen.js +0 -2
- package/dist/api/generated/client/utils.gen.js +0 -228
- package/dist/api/generated/client.gen.js +0 -4
- package/dist/api/generated/core/auth.gen.js +0 -14
- package/dist/api/generated/core/bodySerializer.gen.js +0 -57
- package/dist/api/generated/core/params.gen.js +0 -100
- package/dist/api/generated/core/pathSerializer.gen.js +0 -106
- package/dist/api/generated/core/queryKeySerializer.gen.js +0 -92
- package/dist/api/generated/core/serverSentEvents.gen.js +0 -133
- package/dist/api/generated/core/types.gen.js +0 -2
- package/dist/api/generated/core/utils.gen.js +0 -87
- package/dist/api/generated/index.js +0 -2
- package/dist/api/generated/sdk.gen.js +0 -4222
- package/dist/api/generated/types.gen.js +0 -2
- package/dist/api/generated/zod.gen.js +0 -7217
- package/dist/commands/add.js +0 -315
- package/dist/commands/auth.js +0 -14
- package/dist/commands/create.js +0 -192
- package/dist/commands/design.js +0 -108
- package/dist/commands/guide.js +0 -15
- package/dist/commands/init.js +0 -21
- package/dist/commands/list-schemas.js +0 -177
- package/dist/commands/list.js +0 -39
- package/dist/commands/loop.js +0 -101
- package/dist/commands/map.js +0 -40
- package/dist/commands/mark.js +0 -27
- package/dist/commands/move.js +0 -35
- package/dist/commands/remove.js +0 -170
- package/dist/commands/rename.js +0 -53
- package/dist/commands/resize.js +0 -30
- package/dist/commands/search.js +0 -14
- package/dist/commands/set.js +0 -199
- package/dist/commands/show-schemas.js +0 -259
- package/dist/commands/show.js +0 -56
- package/dist/commands/summary.js +0 -13
- package/dist/commands/update.js +0 -240
- package/dist/lib/auth.js +0 -331
- package/dist/lib/config.js +0 -80
- package/dist/lib/excalidraw-schema.js +0 -66
- package/dist/lib/globals.js +0 -8
- package/dist/lib/model.js +0 -11
- package/dist/lib/project-config.js +0 -103
- package/dist/lib/resolve.js +0 -59
- package/dist/lib/scenario.js +0 -15
- package/dist/slices/add-scenario/index.js +0 -103
- package/dist/slices/guide/guides/codegen.js +0 -339
- package/dist/slices/guide/guides/connect-slices.js +0 -202
- package/dist/slices/guide/guides/create-slices.js +0 -273
- package/dist/slices/guide/guides/explore.js +0 -238
- package/dist/slices/guide/guides/information-flow.js +0 -304
- package/dist/slices/guide/guides/scenarios.js +0 -214
- package/dist/slices/guide/index.js +0 -40
- package/dist/slices/help/index.js +0 -96
- package/dist/slices/help/topics/build-codegen.js +0 -109
- package/dist/slices/help/topics/build-slice.js +0 -147
- package/dist/slices/help/topics/check-completeness.js +0 -57
- package/dist/slices/help/topics/connect-slices.js +0 -99
- package/dist/slices/help/topics/explore-model.js +0 -112
- package/dist/slices/help/topics/json-reference.js +0 -188
- package/dist/slices/help/topics/linked-copies.js +0 -89
- package/dist/slices/help/topics/manipulate-canvas.js +0 -150
- package/dist/slices/help/topics/write-scenarios.js +0 -162
- package/dist/slices/init/index.js +0 -86
- package/dist/slices/init/loop.js +0 -60
- package/dist/slices/login/index.js +0 -20
- package/dist/slices/logout/index.js +0 -14
- package/dist/slices/open-app/index.js +0 -36
- package/dist/slices/whoami/index.js +0 -19
|
@@ -1,273 +0,0 @@
|
|
|
1
|
-
export const meta = {
|
|
2
|
-
name: 'create-slices',
|
|
3
|
-
description: 'Understand slice types, fields, and how to build slices with flows',
|
|
4
|
-
};
|
|
5
|
-
export const content = `
|
|
6
|
-
# Understanding Slices
|
|
7
|
-
|
|
8
|
-
There are three slice types in an event model. Each represents a different pattern of data flow.
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## State-Change Slices
|
|
13
|
-
|
|
14
|
-
A state-change slice represents a **user-initiated action** that changes system state:
|
|
15
|
-
|
|
16
|
-
\`\`\`
|
|
17
|
-
Screen → Command → Event
|
|
18
|
-
\`\`\`
|
|
19
|
-
|
|
20
|
-
- **Screen**: The UI where the user initiates the action
|
|
21
|
-
- **Command**: The intent/request to change state
|
|
22
|
-
- **Event**: The fact that state changed
|
|
23
|
-
|
|
24
|
-
### When to Use
|
|
25
|
-
|
|
26
|
-
Use state-change slices when:
|
|
27
|
-
- A user performs an action (clicks a button, submits a form)
|
|
28
|
-
- That action changes the state of an entity
|
|
29
|
-
- Examples: "Place Order", "Cancel Subscription", "Update Profile", "Add Item to Cart"
|
|
30
|
-
|
|
31
|
-
### Building a State-Change Slice
|
|
32
|
-
|
|
33
|
-
To build a state-change slice, you add the individual elements and connect them with flows:
|
|
34
|
-
|
|
35
|
-
1. Add a screen, a command, and an event (using \`add field\` to define their fields)
|
|
36
|
-
2. Create flows: Screen → Command, Command → Event
|
|
37
|
-
3. Map the fields on each flow
|
|
38
|
-
|
|
39
|
-
### Example: Place Order Slice
|
|
40
|
-
|
|
41
|
-
First, add fields to each element:
|
|
42
|
-
\`\`\`bash
|
|
43
|
-
eventmodeler add field "Checkout Screen" '{"name": "customerId", "type": "UUID"}'
|
|
44
|
-
eventmodeler add field "Checkout Screen" '{"name": "items", "type": "String", "isUserInput": true}'
|
|
45
|
-
eventmodeler add field "Checkout Screen" '{"name": "shippingAddress", "type": "String", "isUserInput": true}'
|
|
46
|
-
|
|
47
|
-
eventmodeler add field "PlaceOrder" '{"name": "customerId", "type": "UUID"}'
|
|
48
|
-
eventmodeler add field "PlaceOrder" '{"name": "items", "type": "String"}'
|
|
49
|
-
eventmodeler add field "PlaceOrder" '{"name": "shippingAddress", "type": "String"}'
|
|
50
|
-
|
|
51
|
-
eventmodeler add field "OrderPlaced" '{"name": "orderId", "type": "UUID", "isGenerated": true}'
|
|
52
|
-
eventmodeler add field "OrderPlaced" '{"name": "customerId", "type": "UUID"}'
|
|
53
|
-
eventmodeler add field "OrderPlaced" '{"name": "items", "type": "String"}'
|
|
54
|
-
eventmodeler add field "OrderPlaced" '{"name": "shippingAddress", "type": "String"}'
|
|
55
|
-
eventmodeler add field "OrderPlaced" '{"name": "placedAt", "type": "DateTime", "isGenerated": true}'
|
|
56
|
-
\`\`\`
|
|
57
|
-
|
|
58
|
-
Then connect with flows:
|
|
59
|
-
\`\`\`bash
|
|
60
|
-
eventmodeler create flow --from "Checkout Screen" --to "PlaceOrder"
|
|
61
|
-
eventmodeler create flow --from "PlaceOrder" --to "OrderPlaced"
|
|
62
|
-
\`\`\`
|
|
63
|
-
|
|
64
|
-
Then map fields on the flows:
|
|
65
|
-
\`\`\`bash
|
|
66
|
-
eventmodeler map fields --from "PlaceOrder" --to "OrderPlaced" '[
|
|
67
|
-
{"from": "customerId", "to": "customerId"},
|
|
68
|
-
{"from": "items", "to": "items"},
|
|
69
|
-
{"from": "shippingAddress", "to": "shippingAddress"}
|
|
70
|
-
]'
|
|
71
|
-
\`\`\`
|
|
72
|
-
|
|
73
|
-
---
|
|
74
|
-
|
|
75
|
-
## Automation Slices
|
|
76
|
-
|
|
77
|
-
An automation slice represents a **system-initiated action**:
|
|
78
|
-
|
|
79
|
-
\`\`\`
|
|
80
|
-
ReadModel → Processor → Command → Event
|
|
81
|
-
\`\`\`
|
|
82
|
-
|
|
83
|
-
- **ReadModel**: The state/data the processor needs to make decisions
|
|
84
|
-
- **Processor**: The system component that decides when and how to act
|
|
85
|
-
- **Command**: The intent/request to change state
|
|
86
|
-
- **Event**: The fact that state changed
|
|
87
|
-
|
|
88
|
-
### When to Use
|
|
89
|
-
|
|
90
|
-
Use automation slices when:
|
|
91
|
-
- The system automatically responds to events
|
|
92
|
-
- No direct user interaction triggers the action
|
|
93
|
-
- Examples: "Auto-assign Reviewer", "Send Reminder Email", "Calculate Shipping", "Process Payment"
|
|
94
|
-
|
|
95
|
-
### Building an Automation Slice
|
|
96
|
-
|
|
97
|
-
1. Add a read model, processor, command, and event with their fields
|
|
98
|
-
2. Create internal flows: ReadModel → Processor, Processor → Command, Command → Event
|
|
99
|
-
3. Connect external events to the read model with flows
|
|
100
|
-
|
|
101
|
-
### Example: Auto-Fulfill Order
|
|
102
|
-
|
|
103
|
-
\`\`\`bash
|
|
104
|
-
eventmodeler add field "OrderReadyForFulfillment" '{"name": "orderId", "type": "UUID"}'
|
|
105
|
-
eventmodeler add field "OrderReadyForFulfillment" '{"name": "isPaid", "type": "Boolean"}'
|
|
106
|
-
eventmodeler add field "OrderReadyForFulfillment" '{"name": "shippingAddress", "type": "String"}'
|
|
107
|
-
|
|
108
|
-
eventmodeler add field "FulfillOrder" '{"name": "orderId", "type": "UUID"}'
|
|
109
|
-
eventmodeler add field "FulfillOrder" '{"name": "warehouseId", "type": "UUID", "isGenerated": true}'
|
|
110
|
-
|
|
111
|
-
eventmodeler add field "OrderFulfilled" '{"name": "orderId", "type": "UUID"}'
|
|
112
|
-
eventmodeler add field "OrderFulfilled" '{"name": "warehouseId", "type": "UUID"}'
|
|
113
|
-
eventmodeler add field "OrderFulfilled" '{"name": "fulfilledAt", "type": "DateTime", "isGenerated": true}'
|
|
114
|
-
\`\`\`
|
|
115
|
-
|
|
116
|
-
Connect internal flows:
|
|
117
|
-
\`\`\`bash
|
|
118
|
-
eventmodeler create flow --from "OrderReadyForFulfillment" --to "Order Fulfillment Processor"
|
|
119
|
-
eventmodeler create flow --from "Order Fulfillment Processor" --to "FulfillOrder"
|
|
120
|
-
eventmodeler create flow --from "FulfillOrder" --to "OrderFulfilled"
|
|
121
|
-
\`\`\`
|
|
122
|
-
|
|
123
|
-
### Connecting Trigger Events
|
|
124
|
-
|
|
125
|
-
Connect external events to the automation's read model:
|
|
126
|
-
|
|
127
|
-
\`\`\`bash
|
|
128
|
-
eventmodeler create flow --from "OrderPlaced" --to "OrderReadyForFulfillment"
|
|
129
|
-
eventmodeler create flow --from "PaymentReceived" --to "OrderReadyForFulfillment"
|
|
130
|
-
\`\`\`
|
|
131
|
-
|
|
132
|
-
### Automation vs State-View Read Models
|
|
133
|
-
|
|
134
|
-
| Automation ReadModel | State-View ReadModel |
|
|
135
|
-
|---------------------|---------------------|
|
|
136
|
-
| Inside automation slice | Standalone slice |
|
|
137
|
-
| Feeds a Processor | Feeds a Screen |
|
|
138
|
-
| "What the processor needs" | "What the user sees" |
|
|
139
|
-
|
|
140
|
-
---
|
|
141
|
-
|
|
142
|
-
## State-View Slices
|
|
143
|
-
|
|
144
|
-
A state-view slice represents a **read model** - a projection of event data for querying:
|
|
145
|
-
|
|
146
|
-
\`\`\`
|
|
147
|
-
Read Model (fed by events)
|
|
148
|
-
\`\`\`
|
|
149
|
-
|
|
150
|
-
### When to Use
|
|
151
|
-
|
|
152
|
-
Use state-view slices when:
|
|
153
|
-
- You need to display data to users
|
|
154
|
-
- A processor needs to query current state
|
|
155
|
-
- You want to aggregate data from multiple events
|
|
156
|
-
- Examples: "Order Summary", "User Dashboard", "Inventory Levels", "Account Balance"
|
|
157
|
-
|
|
158
|
-
### Building a State-View Slice
|
|
159
|
-
|
|
160
|
-
1. Add the read model with its fields
|
|
161
|
-
2. Create flows from events to the read model
|
|
162
|
-
3. Map the fields on each flow
|
|
163
|
-
|
|
164
|
-
### Example: Order Summary View
|
|
165
|
-
|
|
166
|
-
\`\`\`bash
|
|
167
|
-
eventmodeler add field "OrderSummary" '{"name": "orderId", "type": "UUID"}'
|
|
168
|
-
eventmodeler add field "OrderSummary" '{"name": "customerId", "type": "UUID"}'
|
|
169
|
-
eventmodeler add field "OrderSummary" '{"name": "customerName", "type": "String"}'
|
|
170
|
-
eventmodeler add field "OrderSummary" '{"name": "status", "type": "String"}'
|
|
171
|
-
eventmodeler add field "OrderSummary" '{"name": "totalAmount", "type": "Decimal"}'
|
|
172
|
-
eventmodeler add field "OrderSummary" '{"name": "itemCount", "type": "Int"}'
|
|
173
|
-
eventmodeler add field "OrderSummary" '{"name": "placedAt", "type": "DateTime"}'
|
|
174
|
-
eventmodeler add field "OrderSummary" '{"name": "lastUpdatedAt", "type": "DateTime"}'
|
|
175
|
-
\`\`\`
|
|
176
|
-
|
|
177
|
-
### Connecting Events After Creation
|
|
178
|
-
|
|
179
|
-
To complete the picture:
|
|
180
|
-
|
|
181
|
-
1. Create flows from events: \`eventmodeler create flow --from "EventName" --to "ReadModelName"\`
|
|
182
|
-
2. Map fields: \`eventmodeler map fields --from "EventName" --to "ReadModelName" '[...]'\`
|
|
183
|
-
3. Verify: \`eventmodeler show completeness "ReadModelName"\`
|
|
184
|
-
|
|
185
|
-
---
|
|
186
|
-
|
|
187
|
-
## Field Types
|
|
188
|
-
|
|
189
|
-
\`UUID\`, \`String\`, \`Int\`, \`Long\`, \`Double\`, \`Decimal\`, \`Boolean\`, \`Date\`, \`DateTime\`, \`Custom\`
|
|
190
|
-
|
|
191
|
-
## Field Attributes
|
|
192
|
-
|
|
193
|
-
- \`"isOptional": true\` - Field may not have a value
|
|
194
|
-
- \`"isGenerated": true\` - System-generated (e.g., IDs, timestamps), not from user input
|
|
195
|
-
- \`"isUserInput": true\` - Entered by the user on the screen
|
|
196
|
-
- \`"isList": true\` - Field is a list/array of the specified type
|
|
197
|
-
|
|
198
|
-
## Working with Lists and Custom Types
|
|
199
|
-
|
|
200
|
-
**List of primitives** - use \`"isList": true\` with any valid type:
|
|
201
|
-
\`\`\`json
|
|
202
|
-
{"name": "tags", "type": "String", "isList": true}
|
|
203
|
-
{"name": "quantities", "type": "Int", "isList": true}
|
|
204
|
-
\`\`\`
|
|
205
|
-
|
|
206
|
-
### Custom Types (Nested Objects)
|
|
207
|
-
|
|
208
|
-
**CRITICAL: Custom fields MUST contain subfields.** The \`"type": "Custom"\` indicates a nested object structure, and the \`"subfields"\` array defines its properties. A Custom field without subfields is invalid and creates an empty, useless type.
|
|
209
|
-
|
|
210
|
-
**Custom type with nested fields:**
|
|
211
|
-
\`\`\`json
|
|
212
|
-
{"name": "address", "type": "Custom", "subfields": [
|
|
213
|
-
{"name": "street", "type": "String"},
|
|
214
|
-
{"name": "city", "type": "String"},
|
|
215
|
-
{"name": "postalCode", "type": "String"}
|
|
216
|
-
]}
|
|
217
|
-
\`\`\`
|
|
218
|
-
|
|
219
|
-
**List of custom objects** - combine \`"type": "Custom"\` with \`"isList": true\`:
|
|
220
|
-
\`\`\`json
|
|
221
|
-
{"name": "lineItems", "type": "Custom", "isList": true, "subfields": [
|
|
222
|
-
{"name": "productId", "type": "UUID"},
|
|
223
|
-
{"name": "quantity", "type": "Int"},
|
|
224
|
-
{"name": "unitPrice", "type": "Decimal"}
|
|
225
|
-
]}
|
|
226
|
-
\`\`\`
|
|
227
|
-
|
|
228
|
-
**Nested custom types** - subfields can themselves be Custom types:
|
|
229
|
-
\`\`\`json
|
|
230
|
-
{"name": "customer", "type": "Custom", "subfields": [
|
|
231
|
-
{"name": "customerId", "type": "UUID"},
|
|
232
|
-
{"name": "name", "type": "String"},
|
|
233
|
-
{"name": "billingAddress", "type": "Custom", "subfields": [
|
|
234
|
-
{"name": "street", "type": "String"},
|
|
235
|
-
{"name": "city", "type": "String"},
|
|
236
|
-
{"name": "country", "type": "String"}
|
|
237
|
-
]}
|
|
238
|
-
]}
|
|
239
|
-
\`\`\`
|
|
240
|
-
|
|
241
|
-
## Common Mistakes
|
|
242
|
-
|
|
243
|
-
- **Creating empty Custom fields**: Custom fields MUST have subfields that define their structure.
|
|
244
|
-
- Wrong: \`{"name": "address", "type": "Custom"}\`
|
|
245
|
-
- Right: \`{"name": "address", "type": "Custom", "subfields": [{"name": "street", "type": "String"}, ...]}\`
|
|
246
|
-
|
|
247
|
-
- **Using "List" as a field type**: "List" is not a valid type. Use \`"isList": true\` with a valid type instead.
|
|
248
|
-
- Wrong: \`{"name": "items", "type": "List"}\`
|
|
249
|
-
- Right: \`{"name": "items", "type": "String", "isList": true}\`
|
|
250
|
-
|
|
251
|
-
- **Using wrong attribute names**: Always use camelCase attributes.
|
|
252
|
-
- Wrong: \`"optional": true\`, \`"generated": true\`, \`"list": true\`, \`"user-input": true\`
|
|
253
|
-
- Right: \`"isOptional": true\`, \`"isGenerated": true\`, \`"isList": true\`, \`"isUserInput": true\`
|
|
254
|
-
|
|
255
|
-
## Workflow
|
|
256
|
-
|
|
257
|
-
1. **Understand the action** - What is the user/system trying to do?
|
|
258
|
-
2. **Design the fields** - What information flows through this slice?
|
|
259
|
-
3. **Propose before creating** - Get approval on the design first
|
|
260
|
-
4. **Create the elements and flows** - Add fields and connect with flows
|
|
261
|
-
5. **Verify** - \`eventmodeler show slice "<name>"\`
|
|
262
|
-
6. **Connect** - Create flows to/from other slices as needed
|
|
263
|
-
|
|
264
|
-
## Best Practices
|
|
265
|
-
|
|
266
|
-
1. **Get approval first** - Propose the design before creating
|
|
267
|
-
2. **Use meaningful names** - Slice name should describe the action ("Place Order" not "Order Slice")
|
|
268
|
-
3. **Include generated fields** - Events should have IDs and timestamps
|
|
269
|
-
4. **Match field names** - Same names enable automatic mapping
|
|
270
|
-
5. **Consider what's user input vs system data** - Mark appropriately
|
|
271
|
-
6. **Name automation read models for their purpose** - "OrderReadyForFulfillment" not "OrderData"
|
|
272
|
-
7. **Name processors descriptively** - "Order Fulfillment Processor" not just "Processor"
|
|
273
|
-
`;
|
|
@@ -1,238 +0,0 @@
|
|
|
1
|
-
export const meta = {
|
|
2
|
-
name: 'explore',
|
|
3
|
-
description: 'Navigate and query an event model: list, show, search, completeness',
|
|
4
|
-
};
|
|
5
|
-
export const content = `
|
|
6
|
-
# Exploring Event Models with the CLI
|
|
7
|
-
|
|
8
|
-
The \`eventmodeler\` CLI lets you query and explore event models linked to your project.
|
|
9
|
-
|
|
10
|
-
## Getting an Overview
|
|
11
|
-
|
|
12
|
-
**Start here** to understand the model:
|
|
13
|
-
|
|
14
|
-
\`\`\`bash
|
|
15
|
-
eventmodeler summary
|
|
16
|
-
\`\`\`
|
|
17
|
-
Shows statistics: total slices, events, commands, read models, etc.
|
|
18
|
-
|
|
19
|
-
\`\`\`bash
|
|
20
|
-
eventmodeler list slices
|
|
21
|
-
\`\`\`
|
|
22
|
-
Lists all slices with their status (created, in-progress, blocked, done). Slices represent vertical features.
|
|
23
|
-
|
|
24
|
-
\`\`\`bash
|
|
25
|
-
eventmodeler list slices --chapter "<name>"
|
|
26
|
-
\`\`\`
|
|
27
|
-
Lists only slices within a specific chapter.
|
|
28
|
-
|
|
29
|
-
\`\`\`bash
|
|
30
|
-
eventmodeler list chapters
|
|
31
|
-
\`\`\`
|
|
32
|
-
Lists chapters - timeline sections that group slices.
|
|
33
|
-
|
|
34
|
-
## Listing Elements
|
|
35
|
-
|
|
36
|
-
\`\`\`bash
|
|
37
|
-
eventmodeler list events # All events in the model
|
|
38
|
-
eventmodeler list commands # All commands in the model
|
|
39
|
-
eventmodeler list readmodels # All read models
|
|
40
|
-
eventmodeler list screens # All screens
|
|
41
|
-
eventmodeler list processors # All processors
|
|
42
|
-
eventmodeler list scenarios # All scenarios
|
|
43
|
-
eventmodeler list aggregates # All aggregates (event groupings)
|
|
44
|
-
eventmodeler list actors # All actors (user/system roles)
|
|
45
|
-
\`\`\`
|
|
46
|
-
|
|
47
|
-
All \`list\` commands output JSON.
|
|
48
|
-
|
|
49
|
-
## Searching
|
|
50
|
-
|
|
51
|
-
\`\`\`bash
|
|
52
|
-
eventmodeler search "<term>"
|
|
53
|
-
\`\`\`
|
|
54
|
-
Searches across all entity names: slices, events, commands, read models, aggregates, and actors.
|
|
55
|
-
|
|
56
|
-
## Drilling Into Details
|
|
57
|
-
|
|
58
|
-
### Show a Slice
|
|
59
|
-
\`\`\`bash
|
|
60
|
-
eventmodeler show slice "<name>"
|
|
61
|
-
\`\`\`
|
|
62
|
-
Returns JSON with:
|
|
63
|
-
- All components in the slice (screens, commands, events, read-models, processors)
|
|
64
|
-
- **Flow annotations** on each component showing incoming and outgoing connections
|
|
65
|
-
- Fields on each component with types and attributes
|
|
66
|
-
- Information flow (which components connect to which)
|
|
67
|
-
- **Inbound flows**: External elements flowing INTO this slice (with field mappings)
|
|
68
|
-
- **Outbound flows**: Elements in this slice flowing OUT to other slices (with field mappings)
|
|
69
|
-
- Scenarios (Given-When-Then test cases)
|
|
70
|
-
|
|
71
|
-
The inbound/outbound flows show cross-slice dependencies - crucial for understanding how a slice integrates with the rest of the system.
|
|
72
|
-
|
|
73
|
-
**Scenarios are key** - they define the slice's behavior and give it context. A slice's scenarios show:
|
|
74
|
-
- **Given**: What events have already occurred (the starting state)
|
|
75
|
-
- **When**: What command is being executed with what field values
|
|
76
|
-
- **Then**: The expected outcome - either:
|
|
77
|
-
- Events that should be produced
|
|
78
|
-
- An error that should occur
|
|
79
|
-
- A read model assertion (expected state)
|
|
80
|
-
|
|
81
|
-
Example scenario in slice output:
|
|
82
|
-
\`\`\`json
|
|
83
|
-
{
|
|
84
|
-
"scenarios": [
|
|
85
|
-
{
|
|
86
|
-
"name": "Successfully place order",
|
|
87
|
-
"given": [
|
|
88
|
-
{ "event": "CustomerRegistered", "fieldValues": { "customerId": "123" } }
|
|
89
|
-
],
|
|
90
|
-
"when": {
|
|
91
|
-
"command": "PlaceOrder",
|
|
92
|
-
"commandFieldValues": { "customerId": "123", "items": ["..."] }
|
|
93
|
-
},
|
|
94
|
-
"then": {
|
|
95
|
-
"type": "events",
|
|
96
|
-
"events": [
|
|
97
|
-
{ "event": "OrderPlaced", "fieldValues": { "orderId": "456", "customerId": "123" } }
|
|
98
|
-
]
|
|
99
|
-
}
|
|
100
|
-
},
|
|
101
|
-
{
|
|
102
|
-
"name": "Cannot place order without items",
|
|
103
|
-
"when": {
|
|
104
|
-
"command": "PlaceOrder",
|
|
105
|
-
"commandFieldValues": { "customerId": "123", "items": [] }
|
|
106
|
-
},
|
|
107
|
-
"then": {
|
|
108
|
-
"type": "error",
|
|
109
|
-
"errorType": "ValidationError",
|
|
110
|
-
"errorMessage": "Order must contain at least one item"
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
]
|
|
114
|
-
}
|
|
115
|
-
\`\`\`
|
|
116
|
-
|
|
117
|
-
Reading scenarios helps understand:
|
|
118
|
-
- What preconditions the slice expects
|
|
119
|
-
- What inputs the command accepts
|
|
120
|
-
- What the happy path looks like
|
|
121
|
-
- What error cases are handled
|
|
122
|
-
|
|
123
|
-
### Show an Event or Command
|
|
124
|
-
\`\`\`bash
|
|
125
|
-
eventmodeler show event "<name>"
|
|
126
|
-
eventmodeler show command "<name>"
|
|
127
|
-
\`\`\`
|
|
128
|
-
Returns JSON with the element's fields and connections.
|
|
129
|
-
|
|
130
|
-
### Show Read Models, Screens, and Processors
|
|
131
|
-
\`\`\`bash
|
|
132
|
-
eventmodeler show readmodel "<name>"
|
|
133
|
-
eventmodeler show screen "<name>"
|
|
134
|
-
eventmodeler show processor "<name>"
|
|
135
|
-
\`\`\`
|
|
136
|
-
Use these for detailed flow context:
|
|
137
|
-
- \`show readmodel\`: fields, source events, and who consumes it
|
|
138
|
-
- \`show screen\`: fields, source read models, and triggered commands
|
|
139
|
-
- \`show processor\`: fields, source read models, and triggered commands
|
|
140
|
-
|
|
141
|
-
### Show Aggregate and Scenario
|
|
142
|
-
\`\`\`bash
|
|
143
|
-
eventmodeler show aggregate "<name>"
|
|
144
|
-
eventmodeler show scenario "<name>"
|
|
145
|
-
\`\`\`
|
|
146
|
-
- \`show aggregate\`: aggregate ID configuration and contained events
|
|
147
|
-
- \`show scenario\`: complete Given-When-Then with field values
|
|
148
|
-
|
|
149
|
-
### Show a Chapter
|
|
150
|
-
\`\`\`bash
|
|
151
|
-
eventmodeler show chapter "<name>"
|
|
152
|
-
\`\`\`
|
|
153
|
-
Shows the chapter with:
|
|
154
|
-
- All slices within the chapter
|
|
155
|
-
- **Flow graph**: How slices connect to each other (which events flow to which read models, etc.) with field mappings
|
|
156
|
-
- **External dependencies**:
|
|
157
|
-
- Inbound: Flows from outside the chapter into slices within it
|
|
158
|
-
- Outbound: Flows from slices in this chapter to elements outside it
|
|
159
|
-
|
|
160
|
-
Use \`show chapter\` to understand the relationships between slices in a feature area. Use \`list slices --chapter\` for a simple list without flow details.
|
|
161
|
-
|
|
162
|
-
### Show an Actor
|
|
163
|
-
\`\`\`bash
|
|
164
|
-
eventmodeler show actor "<name>"
|
|
165
|
-
\`\`\`
|
|
166
|
-
Shows the actor and lists all screens associated with it.
|
|
167
|
-
|
|
168
|
-
## Managing Slice Status
|
|
169
|
-
|
|
170
|
-
Slices have a status that tracks their progress: \`created\`, \`in-progress\`, \`blocked\`, \`done\`.
|
|
171
|
-
|
|
172
|
-
\`\`\`bash
|
|
173
|
-
# Mark a slice as in progress
|
|
174
|
-
eventmodeler mark "Place Order" in-progress
|
|
175
|
-
|
|
176
|
-
# Mark a slice as done
|
|
177
|
-
eventmodeler mark "Place Order" done
|
|
178
|
-
|
|
179
|
-
# Mark a slice as blocked
|
|
180
|
-
eventmodeler mark "Place Order" blocked
|
|
181
|
-
|
|
182
|
-
# Reset to created
|
|
183
|
-
eventmodeler mark "Place Order" created
|
|
184
|
-
\`\`\`
|
|
185
|
-
|
|
186
|
-
Use \`list slices\` to see current statuses.
|
|
187
|
-
|
|
188
|
-
## Checking Information Completeness
|
|
189
|
-
|
|
190
|
-
Information completeness tracks whether fields flow correctly between connected elements.
|
|
191
|
-
|
|
192
|
-
### Check a Specific Element
|
|
193
|
-
\`\`\`bash
|
|
194
|
-
eventmodeler show completeness "<name>"
|
|
195
|
-
\`\`\`
|
|
196
|
-
Auto-detects the element type (command, event, read model, screen, or processor) and shows:
|
|
197
|
-
- Incoming flows to that element
|
|
198
|
-
- Which fields are satisfied (have a source)
|
|
199
|
-
- Which fields are unsatisfied (missing a source)
|
|
200
|
-
|
|
201
|
-
### Check the Entire Model
|
|
202
|
-
\`\`\`bash
|
|
203
|
-
eventmodeler show model-completeness
|
|
204
|
-
\`\`\`
|
|
205
|
-
Project-wide view of all information flows:
|
|
206
|
-
- Summary: complete count, incomplete count, total
|
|
207
|
-
- Lists all incomplete flows with their unsatisfied fields
|
|
208
|
-
|
|
209
|
-
### Check Aggregate ID Fields
|
|
210
|
-
\`\`\`bash
|
|
211
|
-
eventmodeler show aggregate-completeness "<aggregate-name>"
|
|
212
|
-
\`\`\`
|
|
213
|
-
Checks if all events in an aggregate have the aggregate's ID field.
|
|
214
|
-
|
|
215
|
-
## Exploration Strategy
|
|
216
|
-
|
|
217
|
-
When exploring an unfamiliar event model:
|
|
218
|
-
|
|
219
|
-
1. **Get the big picture**: \`eventmodeler summary\` → understand scale
|
|
220
|
-
2. **See the features**: \`eventmodeler list slices\` → what does this system do?
|
|
221
|
-
3. **Understand organization**: \`eventmodeler list chapters\` → how is it structured over time?
|
|
222
|
-
4. **Dive into a slice**: \`eventmodeler show slice "<name>"\` → how does one feature work?
|
|
223
|
-
5. **Read the scenarios**: They tell you what the slice actually does, its preconditions, and edge cases
|
|
224
|
-
6. **Search for specifics**: \`eventmodeler search "<term>"\` → find related elements
|
|
225
|
-
|
|
226
|
-
When checking model health:
|
|
227
|
-
1. **Overall completeness**: \`eventmodeler show model-completeness\` → any broken flows?
|
|
228
|
-
2. **Specific element**: \`eventmodeler show completeness "<name>"\` → what's missing here?
|
|
229
|
-
3. **Aggregate consistency**: \`eventmodeler show aggregate-completeness "<name>"\` → ID fields present?
|
|
230
|
-
|
|
231
|
-
When looking for something specific:
|
|
232
|
-
- Know the feature name? → \`show slice\`
|
|
233
|
-
- Know an event name? → \`show event\` or \`search\`
|
|
234
|
-
- Know a read model/screen/processor name? → \`show readmodel\` / \`show screen\` / \`show processor\`
|
|
235
|
-
- Need scenario details? → \`list scenarios\` then \`show scenario\`
|
|
236
|
-
- Want all events? → \`list events\`
|
|
237
|
-
- Checking data flow? → \`show completeness\` or \`show model-completeness\`
|
|
238
|
-
`;
|