eventmodeler 0.5.0 → 0.6.0

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.
Files changed (204) hide show
  1. package/dist/api/client-config.js +10 -0
  2. package/dist/api/generated/client/client.gen.js +235 -0
  3. package/dist/api/generated/client/index.js +6 -0
  4. package/dist/api/generated/client/types.gen.js +2 -0
  5. package/dist/api/generated/client/utils.gen.js +228 -0
  6. package/dist/api/generated/client.gen.js +4 -0
  7. package/dist/api/generated/core/auth.gen.js +14 -0
  8. package/dist/api/generated/core/bodySerializer.gen.js +57 -0
  9. package/dist/api/generated/core/params.gen.js +100 -0
  10. package/dist/api/generated/core/pathSerializer.gen.js +106 -0
  11. package/dist/api/generated/core/queryKeySerializer.gen.js +92 -0
  12. package/dist/api/generated/core/serverSentEvents.gen.js +133 -0
  13. package/dist/api/generated/core/types.gen.js +2 -0
  14. package/dist/api/generated/core/utils.gen.js +87 -0
  15. package/dist/api/generated/index.js +2 -0
  16. package/dist/api/generated/sdk.gen.js +4222 -0
  17. package/dist/api/generated/types.gen.js +2 -0
  18. package/dist/api/generated/zod.gen.js +7217 -0
  19. package/dist/commands/add.js +315 -0
  20. package/dist/commands/auth.js +14 -0
  21. package/dist/commands/create.js +192 -0
  22. package/dist/commands/design.js +108 -0
  23. package/dist/commands/guide.js +15 -0
  24. package/dist/commands/init.js +21 -0
  25. package/dist/commands/list-schemas.js +177 -0
  26. package/dist/commands/list.js +39 -0
  27. package/dist/commands/loop.js +101 -0
  28. package/dist/commands/map.js +40 -0
  29. package/dist/commands/mark.js +27 -0
  30. package/dist/commands/move.js +35 -0
  31. package/dist/commands/remove.js +170 -0
  32. package/dist/commands/rename.js +53 -0
  33. package/dist/commands/resize.js +30 -0
  34. package/dist/commands/search.js +14 -0
  35. package/dist/commands/set.js +199 -0
  36. package/dist/commands/show-schemas.js +259 -0
  37. package/dist/commands/show.js +56 -0
  38. package/dist/commands/summary.js +13 -0
  39. package/dist/commands/update.js +240 -0
  40. package/dist/index.js +46 -2379
  41. package/dist/lib/auth.js +1 -1
  42. package/dist/lib/config.js +0 -15
  43. package/dist/lib/excalidraw-schema.js +66 -0
  44. package/dist/lib/globals.js +8 -0
  45. package/dist/lib/model.js +11 -0
  46. package/dist/lib/project-config.js +20 -0
  47. package/dist/lib/resolve.js +59 -0
  48. package/dist/lib/scenario.js +15 -0
  49. package/dist/slices/add-scenario/index.js +2 -206
  50. package/dist/slices/guide/guides/codegen.js +1 -1
  51. package/dist/slices/guide/guides/connect-slices.js +38 -38
  52. package/dist/slices/guide/guides/create-slices.js +110 -140
  53. package/dist/slices/guide/guides/explore.js +37 -50
  54. package/dist/slices/guide/guides/information-flow.js +70 -84
  55. package/dist/slices/guide/guides/scenarios.js +82 -137
  56. package/dist/slices/guide/index.js +6 -6
  57. package/dist/slices/help/index.js +96 -0
  58. package/dist/slices/help/topics/build-codegen.js +109 -0
  59. package/dist/slices/help/topics/build-slice.js +147 -0
  60. package/dist/slices/help/topics/check-completeness.js +57 -0
  61. package/dist/slices/help/topics/connect-slices.js +99 -0
  62. package/dist/slices/help/topics/explore-model.js +112 -0
  63. package/dist/slices/help/topics/json-reference.js +188 -0
  64. package/dist/slices/help/topics/linked-copies.js +89 -0
  65. package/dist/slices/help/topics/manipulate-canvas.js +150 -0
  66. package/dist/slices/help/topics/write-scenarios.js +162 -0
  67. package/dist/slices/init/index.js +10 -4
  68. package/dist/slices/init/loop.js +60 -0
  69. package/dist/slices/login/index.js +2 -2
  70. package/dist/slices/logout/index.js +2 -2
  71. package/dist/slices/whoami/index.js +11 -36
  72. package/package.json +8 -3
  73. package/dist/api/index.d.ts +0 -285
  74. package/dist/api/index.js +0 -323
  75. package/dist/cloud/slices/index.d.ts +0 -276
  76. package/dist/cloud/slices/index.js +0 -406
  77. package/dist/eventmodeler.js +0 -5646
  78. package/dist/formatters.d.ts +0 -17
  79. package/dist/formatters.js +0 -482
  80. package/dist/index.d.ts +0 -2
  81. package/dist/lib/auth.d.ts +0 -24
  82. package/dist/lib/backend.d.ts +0 -43
  83. package/dist/lib/backend.js +0 -73
  84. package/dist/lib/chapter-utils.d.ts +0 -13
  85. package/dist/lib/chapter-utils.js +0 -71
  86. package/dist/lib/cloud-client.d.ts +0 -69
  87. package/dist/lib/cloud-client.js +0 -364
  88. package/dist/lib/config.d.ts +0 -30
  89. package/dist/lib/diff/merge-rules.d.ts +0 -45
  90. package/dist/lib/diff/merge-rules.js +0 -210
  91. package/dist/lib/diff/model-differ.d.ts +0 -8
  92. package/dist/lib/diff/model-differ.js +0 -568
  93. package/dist/lib/diff/three-way-merge.d.ts +0 -7
  94. package/dist/lib/diff/three-way-merge.js +0 -390
  95. package/dist/lib/diff/types.d.ts +0 -75
  96. package/dist/lib/diff/types.js +0 -1
  97. package/dist/lib/element-lookup.d.ts +0 -58
  98. package/dist/lib/element-lookup.js +0 -126
  99. package/dist/lib/file-loader.d.ts +0 -8
  100. package/dist/lib/file-loader.js +0 -108
  101. package/dist/lib/flow-utils.d.ts +0 -53
  102. package/dist/lib/flow-utils.js +0 -348
  103. package/dist/lib/format.d.ts +0 -10
  104. package/dist/lib/format.js +0 -23
  105. package/dist/lib/project-config.d.ts +0 -27
  106. package/dist/lib/slice-utils.d.ts +0 -59
  107. package/dist/lib/slice-utils.js +0 -140
  108. package/dist/local/slices/index.d.ts +0 -11
  109. package/dist/local/slices/index.js +0 -13
  110. package/dist/projection.d.ts +0 -3
  111. package/dist/projection.js +0 -828
  112. package/dist/slices/add-field/index.d.ts +0 -8
  113. package/dist/slices/add-field/index.js +0 -211
  114. package/dist/slices/add-scenario/index.d.ts +0 -27
  115. package/dist/slices/codegen-chapter-events/index.d.ts +0 -2
  116. package/dist/slices/codegen-chapter-events/index.js +0 -145
  117. package/dist/slices/codegen-slice/index.d.ts +0 -2
  118. package/dist/slices/codegen-slice/index.js +0 -448
  119. package/dist/slices/create-automation-slice/index.d.ts +0 -2
  120. package/dist/slices/create-automation-slice/index.js +0 -304
  121. package/dist/slices/create-flow/index.d.ts +0 -2
  122. package/dist/slices/create-flow/index.js +0 -183
  123. package/dist/slices/create-state-change-slice/index.d.ts +0 -2
  124. package/dist/slices/create-state-change-slice/index.js +0 -263
  125. package/dist/slices/create-state-view-slice/index.d.ts +0 -2
  126. package/dist/slices/create-state-view-slice/index.js +0 -128
  127. package/dist/slices/diff/index.d.ts +0 -11
  128. package/dist/slices/diff/index.js +0 -293
  129. package/dist/slices/export-eventmodel-to-json/index.d.ts +0 -2
  130. package/dist/slices/export-eventmodel-to-json/index.js +0 -355
  131. package/dist/slices/git/index.d.ts +0 -2
  132. package/dist/slices/git/index.js +0 -125
  133. package/dist/slices/guide/guides/codegen.d.ts +0 -5
  134. package/dist/slices/guide/guides/connect-slices.d.ts +0 -5
  135. package/dist/slices/guide/guides/create-slices.d.ts +0 -5
  136. package/dist/slices/guide/guides/explore.d.ts +0 -5
  137. package/dist/slices/guide/guides/information-flow.d.ts +0 -5
  138. package/dist/slices/guide/guides/scenarios.d.ts +0 -5
  139. package/dist/slices/guide/index.d.ts +0 -1
  140. package/dist/slices/import/index.d.ts +0 -8
  141. package/dist/slices/import/index.js +0 -63
  142. package/dist/slices/init/index.d.ts +0 -5
  143. package/dist/slices/list-chapters/index.d.ts +0 -3
  144. package/dist/slices/list-chapters/index.js +0 -21
  145. package/dist/slices/list-commands/index.d.ts +0 -3
  146. package/dist/slices/list-commands/index.js +0 -20
  147. package/dist/slices/list-events/index.d.ts +0 -3
  148. package/dist/slices/list-events/index.js +0 -98
  149. package/dist/slices/list-processors/index.d.ts +0 -3
  150. package/dist/slices/list-processors/index.js +0 -20
  151. package/dist/slices/list-readmodels/index.d.ts +0 -3
  152. package/dist/slices/list-readmodels/index.js +0 -21
  153. package/dist/slices/list-scenarios/index.d.ts +0 -3
  154. package/dist/slices/list-scenarios/index.js +0 -35
  155. package/dist/slices/list-screens/index.d.ts +0 -3
  156. package/dist/slices/list-screens/index.js +0 -47
  157. package/dist/slices/list-slices/index.d.ts +0 -3
  158. package/dist/slices/list-slices/index.js +0 -35
  159. package/dist/slices/login/index.d.ts +0 -1
  160. package/dist/slices/logout/index.d.ts +0 -1
  161. package/dist/slices/map-fields/index.d.ts +0 -2
  162. package/dist/slices/map-fields/index.js +0 -269
  163. package/dist/slices/mark-slice-status/index.d.ts +0 -2
  164. package/dist/slices/mark-slice-status/index.js +0 -31
  165. package/dist/slices/merge/index.d.ts +0 -19
  166. package/dist/slices/merge/index.js +0 -147
  167. package/dist/slices/open-app/index.d.ts +0 -1
  168. package/dist/slices/remove-field/index.d.ts +0 -8
  169. package/dist/slices/remove-field/index.js +0 -167
  170. package/dist/slices/remove-scenario/index.d.ts +0 -2
  171. package/dist/slices/remove-scenario/index.js +0 -77
  172. package/dist/slices/search/index.d.ts +0 -3
  173. package/dist/slices/search/index.js +0 -302
  174. package/dist/slices/show-actor/index.d.ts +0 -4
  175. package/dist/slices/show-actor/index.js +0 -115
  176. package/dist/slices/show-aggregate/index.d.ts +0 -3
  177. package/dist/slices/show-aggregate/index.js +0 -108
  178. package/dist/slices/show-aggregate-completeness/index.d.ts +0 -4
  179. package/dist/slices/show-aggregate-completeness/index.js +0 -181
  180. package/dist/slices/show-chapter/index.d.ts +0 -3
  181. package/dist/slices/show-chapter/index.js +0 -195
  182. package/dist/slices/show-command/index.d.ts +0 -3
  183. package/dist/slices/show-command/index.js +0 -133
  184. package/dist/slices/show-completeness/index.d.ts +0 -4
  185. package/dist/slices/show-completeness/index.js +0 -731
  186. package/dist/slices/show-event/index.d.ts +0 -3
  187. package/dist/slices/show-event/index.js +0 -118
  188. package/dist/slices/show-model-summary/index.d.ts +0 -3
  189. package/dist/slices/show-model-summary/index.js +0 -31
  190. package/dist/slices/show-processor/index.d.ts +0 -3
  191. package/dist/slices/show-processor/index.js +0 -111
  192. package/dist/slices/show-readmodel/index.d.ts +0 -3
  193. package/dist/slices/show-readmodel/index.js +0 -158
  194. package/dist/slices/show-scenario/index.d.ts +0 -3
  195. package/dist/slices/show-scenario/index.js +0 -196
  196. package/dist/slices/show-screen/index.d.ts +0 -3
  197. package/dist/slices/show-screen/index.js +0 -139
  198. package/dist/slices/show-slice/index.d.ts +0 -3
  199. package/dist/slices/show-slice/index.js +0 -696
  200. package/dist/slices/update-field/index.d.ts +0 -15
  201. package/dist/slices/update-field/index.js +0 -208
  202. package/dist/slices/whoami/index.d.ts +0 -2
  203. package/dist/types.d.ts +0 -195
  204. package/dist/types.js +0 -1
@@ -52,47 +52,47 @@ Field types: \`UUID\`, \`String\`, \`Int\`, \`Long\`, \`Double\`, \`Decimal\`, \
52
52
 
53
53
  \`\`\`bash
54
54
  # Add a simple field
55
- eventmodeler add field --read-model "OrderSummary" --xml '<field name="orderId" type="UUID"/>'
55
+ eventmodeler add field "OrderSummary" '{"name": "orderId", "type": "UUID"}'
56
56
 
57
57
  # Add an optional field
58
- eventmodeler add field --read-model "OrderSummary" --xml '<field name="cancelledAt" type="DateTime" isOptional="true"/>'
58
+ eventmodeler add field "OrderSummary" '{"name": "cancelledAt", "type": "DateTime", "isOptional": true}'
59
59
 
60
60
  # Add a list field
61
- eventmodeler add field --read-model "OrderSummary" --xml '<field name="itemIds" type="UUID" isList="true"/>'
61
+ eventmodeler add field "OrderSummary" '{"name": "itemIds", "type": "UUID", "isList": true}'
62
62
 
63
63
  # Add a complex/nested field
64
- eventmodeler add field --read-model "OrderSummary" --xml '<field name="shippingAddress" type="Custom">
65
- <field name="street" type="String"/>
66
- <field name="city" type="String"/>
67
- <field name="postalCode" type="String"/>
68
- </field>'
64
+ eventmodeler add field "OrderSummary" '{"name": "shippingAddress", "type": "Custom", "subfields": [
65
+ {"name": "street", "type": "String"},
66
+ {"name": "city", "type": "String"},
67
+ {"name": "postalCode", "type": "String"}
68
+ ]}'
69
69
  \`\`\`
70
70
 
71
71
  **CRITICAL: Custom fields MUST contain subfields.** A Custom field without subfields is invalid.
72
72
 
73
73
  ### Lists and Custom Types
74
74
 
75
- **List of custom objects** - combine \`type="Custom"\` with \`isList="true"\`:
75
+ **List of custom objects** - combine \`"type": "Custom"\` with \`"isList": true\`:
76
76
  \`\`\`bash
77
- eventmodeler add field --read-model "OrderSummary" --xml '<field name="lineItems" type="Custom" isList="true">
78
- <field name="productId" type="UUID"/>
79
- <field name="productName" type="String"/>
80
- <field name="quantity" type="Int"/>
81
- <field name="unitPrice" type="Decimal"/>
82
- </field>'
77
+ eventmodeler add field "OrderSummary" '{"name": "lineItems", "type": "Custom", "isList": true, "subfields": [
78
+ {"name": "productId", "type": "UUID"},
79
+ {"name": "productName", "type": "String"},
80
+ {"name": "quantity", "type": "Int"},
81
+ {"name": "unitPrice", "type": "Decimal"}
82
+ ]}'
83
83
  \`\`\`
84
84
 
85
85
  **Nested custom types** - subfields can themselves be Custom:
86
86
  \`\`\`bash
87
- eventmodeler add field --read-model "OrderSummary" --xml '<field name="customer" type="Custom">
88
- <field name="customerId" type="UUID"/>
89
- <field name="name" type="String"/>
90
- <field name="billingAddress" type="Custom">
91
- <field name="street" type="String"/>
92
- <field name="city" type="String"/>
93
- <field name="country" type="String"/>
94
- </field>
95
- </field>'
87
+ eventmodeler add field "OrderSummary" '{"name": "customer", "type": "Custom", "subfields": [
88
+ {"name": "customerId", "type": "UUID"},
89
+ {"name": "name", "type": "String"},
90
+ {"name": "billingAddress", "type": "Custom", "subfields": [
91
+ {"name": "street", "type": "String"},
92
+ {"name": "city", "type": "String"},
93
+ {"name": "country", "type": "String"}
94
+ ]}
95
+ ]}'
96
96
  \`\`\`
97
97
 
98
98
  ---
@@ -104,44 +104,32 @@ Field mappings define how data flows from source elements to target elements. Wh
104
104
  ### Command Syntax
105
105
 
106
106
  \`\`\`bash
107
- eventmodeler map fields --flow "<Source>→<Target>" --xml '<mapping from="sourceField" to="targetField"/>'
107
+ eventmodeler map fields --from "<source>" --to "<target>" '[{"from": "sourceField", "to": "targetField"}]'
108
108
  \`\`\`
109
109
 
110
110
  Or with multiple mappings:
111
111
 
112
112
  \`\`\`bash
113
- eventmodeler map fields --flow "<Source>→<Target>" --xml '
114
- <mapping from="orderId" to="orderId"/>
115
- <mapping from="customerId" to="customerId"/>
116
- <mapping from="totalAmount" to="total"/>
117
- '
113
+ eventmodeler map fields --from "OrderPlaced" --to "OrderSummary" '[
114
+ {"from": "orderId", "to": "orderId"},
115
+ {"from": "customerId", "to": "customerId"},
116
+ {"from": "totalAmount", "to": "total"}
117
+ ]'
118
118
  \`\`\`
119
119
 
120
- ### Flow Identifier Formats
121
-
122
- The \`--flow\` argument accepts:
123
-
124
- 1. **Name arrow format** (most common): \`"SourceName→TargetName"\` or \`"SourceName->TargetName"\`
125
- 2. **Element ID prefix** (for duplicates): \`"id:abc12345→TargetName"\`
126
- 3. **Flow ID directly**: The UUID of the flow itself
120
+ ### Source/Target Formats
127
121
 
128
- Note: The \`id:\` prefix works with every command, not just \`map fields\`. See \`eventmodeler guide explore\` for details.
122
+ The \`--from\` and \`--to\` arguments accept:
129
123
 
130
- ### JSON Alternative
131
-
132
- \`\`\`bash
133
- eventmodeler map fields --flow "OrderPlaced→OrderSummary" --json '[
134
- {"from": "orderId", "to": "orderId"},
135
- {"from": "customerId", "to": "customerId"}
136
- ]'
137
- \`\`\`
124
+ 1. **Element name** (most common): \`"OrderPlaced"\`
125
+ 2. **Element ID prefix** (for duplicates): \`"id:abc12345"\`
138
126
 
139
127
  ### Workflow
140
128
 
141
129
  1. **Find flows needing mappings**: \`eventmodeler show model-completeness\`
142
130
  2. **See source fields**: \`eventmodeler show event "OrderPlaced"\`
143
131
  3. **See target fields**: \`eventmodeler show completeness "OrderSummary"\`
144
- 4. **Create mappings**: \`eventmodeler map fields --flow "OrderPlaced→OrderSummary" --xml '...'\`
132
+ 4. **Create mappings**: \`eventmodeler map fields --from "OrderPlaced" --to "OrderSummary" '[...]'\`
145
133
  5. **Verify**: \`eventmodeler show completeness "OrderSummary"\`
146
134
 
147
135
  ### Mapping Nested Fields
@@ -149,11 +137,11 @@ eventmodeler map fields --flow "OrderPlaced→OrderSummary" --json '[
149
137
  For Custom (nested) field types, use dot notation:
150
138
 
151
139
  \`\`\`bash
152
- eventmodeler map fields --flow "OrderPlaced→OrderSummary" --xml '
153
- <mapping from="shippingAddress.street" to="deliveryAddress.street"/>
154
- <mapping from="shippingAddress.city" to="deliveryAddress.city"/>
155
- <mapping from="shippingAddress.postalCode" to="deliveryAddress.zip"/>
156
- '
140
+ eventmodeler map fields --from "OrderPlaced" --to "OrderSummary" '[
141
+ {"from": "shippingAddress.street", "to": "deliveryAddress.street"},
142
+ {"from": "shippingAddress.city", "to": "deliveryAddress.city"},
143
+ {"from": "shippingAddress.postalCode", "to": "deliveryAddress.zip"}
144
+ ]'
157
145
  \`\`\`
158
146
 
159
147
  ### Multiple Flows to Same Target
@@ -162,17 +150,17 @@ A read model often receives data from multiple events. Map each flow separately:
162
150
 
163
151
  \`\`\`bash
164
152
  # Initial data from OrderPlaced
165
- eventmodeler map fields --flow "OrderPlaced→OrderSummary" --xml '
166
- <mapping from="orderId" to="orderId"/>
167
- <mapping from="customerId" to="customerId"/>
168
- <mapping from="totalAmount" to="total"/>
169
- '
153
+ eventmodeler map fields --from "OrderPlaced" --to "OrderSummary" '[
154
+ {"from": "orderId", "to": "orderId"},
155
+ {"from": "customerId", "to": "customerId"},
156
+ {"from": "totalAmount", "to": "total"}
157
+ ]'
170
158
 
171
159
  # Status updates from OrderShipped
172
- eventmodeler map fields --flow "OrderShipped→OrderSummary" --xml '
173
- <mapping from="shippedAt" to="shippedDate"/>
174
- <mapping from="trackingNumber" to="trackingNumber"/>
175
- '
160
+ eventmodeler map fields --from "OrderShipped" --to "OrderSummary" '[
161
+ {"from": "shippedAt", "to": "shippedDate"},
162
+ {"from": "trackingNumber", "to": "trackingNumber"}
163
+ ]'
176
164
  \`\`\`
177
165
 
178
166
  ### Updating Existing Mappings
@@ -185,10 +173,10 @@ Running \`map fields\` again **merges** with existing mappings:
185
173
 
186
174
  | Pattern | Example |
187
175
  |---------|---------|
188
- | Identity | \`<mapping from="orderId" to="orderId"/>\` |
189
- | Rename | \`<mapping from="totalAmount" to="total"/>\` |
190
- | Nested to flat | \`<mapping from="customer.id" to="customerId"/>\` |
191
- | Flat to nested | \`<mapping from="street" to="address.street"/>\` |
176
+ | Identity | \`{"from": "orderId", "to": "orderId"}\` |
177
+ | Rename | \`{"from": "totalAmount", "to": "total"}\` |
178
+ | Nested to flat | \`{"from": "customer.id", "to": "customerId"}\` |
179
+ | Flat to nested | \`{"from": "street", "to": "address.street"}\` |
192
180
 
193
181
  ---
194
182
 
@@ -199,11 +187,9 @@ Use \`update field\` to modify field attributes without changing the field's nam
199
187
  ### Command Syntax
200
188
 
201
189
  \`\`\`bash
202
- eventmodeler update field --<element-type> "<name>" --field "<field-name>" [options]
190
+ eventmodeler update field <element-name> --field "<field-name>" [options]
203
191
  \`\`\`
204
192
 
205
- Element types: \`--command\`, \`--event\`, \`--read-model\`, \`--screen\`, \`--processor\`
206
-
207
193
  ### Available Options
208
194
 
209
195
  | Option | Values | Description |
@@ -217,19 +203,19 @@ Element types: \`--command\`, \`--event\`, \`--read-model\`, \`--screen\`, \`--p
217
203
 
218
204
  \`\`\`bash
219
205
  # Mark a field as optional
220
- eventmodeler update field --event "OrderPlaced" --field "promoCode" --optional true
206
+ eventmodeler update field "OrderPlaced" --field "promoCode" --optional true
221
207
 
222
208
  # Mark a field as system-generated
223
- eventmodeler update field --event "OrderPlaced" --field "orderId" --generated true
209
+ eventmodeler update field "OrderPlaced" --field "orderId" --generated true
224
210
 
225
211
  # Mark screen fields as user input
226
- eventmodeler update field --screen "Checkout" --field "email" --user-input true
212
+ eventmodeler update field "Checkout" --field "email" --user-input true
227
213
 
228
214
  # Change a field's type
229
- eventmodeler update field --read-model "OrderSummary" --field "total" --type Decimal
215
+ eventmodeler update field "OrderSummary" --field "total" --type Decimal
230
216
 
231
217
  # Combine multiple updates
232
- eventmodeler update field --event "UserRegistered" --field "createdAt" --generated true --optional false
218
+ eventmodeler update field "UserRegistered" --field "createdAt" --generated true --optional false
233
219
  \`\`\`
234
220
 
235
221
  ### Updating Nested Fields
@@ -237,7 +223,7 @@ eventmodeler update field --event "UserRegistered" --field "createdAt" --generat
237
223
  Use dot notation for fields inside Custom types:
238
224
 
239
225
  \`\`\`bash
240
- eventmodeler update field --event "OrderPlaced" --field "shippingAddress.postalCode" --optional true
226
+ eventmodeler update field "OrderPlaced" --field "shippingAddress.postalCode" --optional true
241
227
  \`\`\`
242
228
 
243
229
  ### Field Property Meanings
@@ -254,13 +240,13 @@ eventmodeler update field --event "OrderPlaced" --field "shippingAddress.postalC
254
240
 
255
241
  \`\`\`bash
256
242
  # Remove a field from an event
257
- eventmodeler remove field --event "OrderPlaced" --field "legacyId"
243
+ eventmodeler remove field "OrderPlaced" --field "legacyId"
258
244
 
259
245
  # Remove a field from a read model
260
- eventmodeler remove field --read-model "OrderSummary" --field "deprecatedStatus"
246
+ eventmodeler remove field "OrderSummary" --field "deprecatedStatus"
261
247
 
262
248
  # Remove a nested field using dot notation
263
- eventmodeler remove field --event "OrderPlaced" --field "metadata.debugInfo"
249
+ eventmodeler remove field "OrderPlaced" --field "metadata.debugInfo"
264
250
  \`\`\`
265
251
 
266
252
  **Caution**: Removing a field may break existing field mappings. Check completeness first:
@@ -294,16 +280,16 @@ eventmodeler show aggregate-completeness "<aggregate-name>"
294
280
  ## Common Mistakes
295
281
 
296
282
  - **Creating empty Custom fields**: Custom fields MUST have subfields.
297
- - Wrong: \`<field name="address" type="Custom"/>\`
298
- - Right: \`<field name="address" type="Custom"><field name="street" type="String"/>...</field>\`
283
+ - Wrong: \`{"name": "address", "type": "Custom"}\`
284
+ - Right: \`{"name": "address", "type": "Custom", "subfields": [{"name": "street", "type": "String"}, ...]}\`
299
285
 
300
- - **Using "List" as a field type**: Use \`isList="true"\` with a valid type instead.
301
- - Wrong: \`<field name="items" type="List"/>\`
302
- - Right: \`<field name="items" type="String" isList="true"/>\`
286
+ - **Using "List" as a field type**: Use \`"isList": true\` with a valid type instead.
287
+ - Wrong: \`{"name": "items", "type": "List"}\`
288
+ - Right: \`{"name": "items", "type": "String", "isList": true}\`
303
289
 
304
290
  - **Using wrong attribute names**: Always use camelCase attributes.
305
- - Wrong: \`optional="true"\`, \`generated="true"\`, \`list="true"\`
306
- - Right: \`isOptional="true"\`, \`isGenerated="true"\`, \`isList="true"\`
291
+ - Wrong: \`"optional": true\`, \`"generated": true\`, \`"list": true\`
292
+ - Right: \`"isOptional": true\`, \`"isGenerated": true\`, \`"isList": true\`
307
293
 
308
294
  ## Best Practices
309
295
 
@@ -67,59 +67,61 @@ For slices where a user action triggers a command:
67
67
 
68
68
  \`\`\`bash
69
69
  # Happy path - command succeeds
70
- eventmodeler add scenario --slice "<slice-name>" --xml '<scenario name="Successfully place order" description="A registered customer can place an order with valid items">
71
- <given>
72
- <event name="CustomerRegistered">
73
- <field name="customerId">cust-123</field>
74
- </event>
75
- </given>
76
- <when>
77
- <command name="PlaceOrder">
78
- <field name="customerId">cust-123</field>
79
- <field name="items">[{"productId": "prod-1", "quantity": 2}]</field>
80
- </command>
81
- </when>
82
- <then type="events">
83
- <event name="OrderPlaced">
84
- <field name="orderId">order-456</field>
85
- <field name="customerId">cust-123</field>
86
- </event>
87
- </then>
88
- </scenario>'
70
+ eventmodeler add scenario --slice "<slice-name>" '{
71
+ "name": "Successfully place order",
72
+ "description": "A registered customer can place an order with valid items",
73
+ "given": [
74
+ {"event": "CustomerRegistered", "fieldValues": {"customerId": "cust-123"}}
75
+ ],
76
+ "when": {
77
+ "command": "PlaceOrder",
78
+ "commandFieldValues": {"customerId": "cust-123", "items": [{"productId": "prod-1", "quantity": 2}]}
79
+ },
80
+ "then": {
81
+ "type": "events",
82
+ "events": [
83
+ {"event": "OrderPlaced", "fieldValues": {"orderId": "order-456", "customerId": "cust-123"}}
84
+ ]
85
+ }
86
+ }'
89
87
  \`\`\`
90
88
 
91
89
  \`\`\`bash
92
90
  # Validation error
93
- eventmodeler add scenario --slice "<slice-name>" --xml '<scenario name="Cannot place empty order" description="Orders must contain at least one item - empty item lists are rejected">
94
- <when>
95
- <command name="PlaceOrder">
96
- <field name="customerId">cust-123</field>
97
- <field name="items">[]</field>
98
- </command>
99
- </when>
100
- <then type="error" errorType="ValidationError">Order must contain at least one item</then>
101
- </scenario>'
91
+ eventmodeler add scenario --slice "<slice-name>" '{
92
+ "name": "Cannot place empty order",
93
+ "description": "Orders must contain at least one item - empty item lists are rejected",
94
+ "when": {
95
+ "command": "PlaceOrder",
96
+ "commandFieldValues": {"customerId": "cust-123", "items": []}
97
+ },
98
+ "then": {
99
+ "type": "error",
100
+ "errorType": "ValidationError",
101
+ "errorMessage": "Order must contain at least one item"
102
+ }
103
+ }'
102
104
  \`\`\`
103
105
 
104
106
  \`\`\`bash
105
107
  # Business rule violation
106
- eventmodeler add scenario --slice "Cancel Order" --xml '<scenario name="Cannot cancel shipped order" description="Once an order has been shipped, it can no longer be cancelled">
107
- <given>
108
- <event name="OrderPlaced">
109
- <field name="orderId">order-123</field>
110
- </event>
111
- <event name="OrderShipped">
112
- <field name="orderId">order-123</field>
113
- <field name="shippedAt">2024-01-15T10:00:00Z</field>
114
- </event>
115
- </given>
116
- <when>
117
- <command name="CancelOrder">
118
- <field name="orderId">order-123</field>
119
- </command>
120
- </when>
121
- <then type="error" errorType="BusinessRuleViolation">Cannot cancel an order that has already shipped</then>
122
- </scenario>'
108
+ eventmodeler add scenario --slice "Cancel Order" '{
109
+ "name": "Cannot cancel shipped order",
110
+ "description": "Once an order has been shipped, it can no longer be cancelled",
111
+ "given": [
112
+ {"event": "OrderPlaced", "fieldValues": {"orderId": "order-123"}},
113
+ {"event": "OrderShipped", "fieldValues": {"orderId": "order-123", "shippedAt": "2024-01-15T10:00:00Z"}}
114
+ ],
115
+ "when": {
116
+ "command": "CancelOrder",
117
+ "commandFieldValues": {"orderId": "order-123"}
118
+ },
119
+ "then": {
120
+ "type": "error",
121
+ "errorType": "BusinessRuleViolation",
122
+ "errorMessage": "Cannot cancel an order that has already shipped"
123
+ }
124
+ }'
123
125
  \`\`\`
124
126
 
125
127
  ---
@@ -140,38 +142,33 @@ For slices where events trigger a processor to issue a command. Use the simpler
140
142
 
141
143
  \`\`\`bash
142
144
  # Payment received triggers shipment initiation
143
- # Given: OrderPlaced + PaymentReceived Then: InitiateShipment command
144
- eventmodeler add scenario --slice "Auto Ship Order" --xml '<scenario name="Payment triggers shipment" description="Given an order has been placed and payment received, the system automatically initiates shipment">
145
- <given>
146
- <event name="OrderPlaced">
147
- <field name="orderId">order-123</field>
148
- <field name="customerId">cust-456</field>
149
- </event>
150
- <event name="PaymentReceived">
151
- <field name="orderId">order-123</field>
152
- <field name="amount">99.99</field>
153
- </event>
154
- </given>
155
- <then type="command">
156
- <command name="InitiateShipment">
157
- <field name="orderId">order-123</field>
158
- <field name="warehouseId">wh-001</field>
159
- </command>
160
- </then>
161
- </scenario>'
145
+ eventmodeler add scenario --slice "Auto Ship Order" '{
146
+ "name": "Payment triggers shipment",
147
+ "description": "Given an order has been placed and payment received, the system automatically initiates shipment",
148
+ "given": [
149
+ {"event": "OrderPlaced", "fieldValues": {"orderId": "order-123", "customerId": "cust-456"}},
150
+ {"event": "PaymentReceived", "fieldValues": {"orderId": "order-123", "amount": 99.99}}
151
+ ],
152
+ "then": {
153
+ "type": "command",
154
+ "command": "InitiateShipment",
155
+ "commandFieldValues": {"orderId": "order-123", "warehouseId": "wh-001"}
156
+ }
157
+ }'
162
158
  \`\`\`
163
159
 
164
160
  \`\`\`bash
165
161
  # Negative case - conditions not met, no command dispatched
166
- eventmodeler add scenario --slice "Auto Ship Order" --xml '<scenario name="No shipment without payment" description="Given only an order placed (no payment), the system should not initiate shipment">
167
- <given>
168
- <event name="OrderPlaced">
169
- <field name="orderId">order-123</field>
170
- <field name="customerId">cust-456</field>
171
- </event>
172
- </given>
173
- <then type="noCommand"/>
174
- </scenario>'
162
+ eventmodeler add scenario --slice "Auto Ship Order" '{
163
+ "name": "No shipment without payment",
164
+ "description": "Given only an order placed (no payment), the system should not initiate shipment",
165
+ "given": [
166
+ {"event": "OrderPlaced", "fieldValues": {"orderId": "order-123", "customerId": "cust-456"}}
167
+ ],
168
+ "then": {
169
+ "type": "noCommand"
170
+ }
171
+ }'
175
172
  \`\`\`
176
173
 
177
174
  ---
@@ -181,14 +178,18 @@ eventmodeler add scenario --slice "Auto Ship Order" --xml '<scenario name="No sh
181
178
  For state-view slices, test that events project correctly to read models:
182
179
 
183
180
  \`\`\`bash
184
- eventmodeler add scenario --slice "<slice-name>" --xml '<scenario name="Order appears in summary" description="After placing an order, it should be visible in the order summary with pending status">
185
- <then type="readModelAssertion">
186
- <read-model name="OrderSummary">
187
- <field name="orderId">order-456</field>
188
- <field name="status">pending</field>
189
- </read-model>
190
- </then>
191
- </scenario>'
181
+ eventmodeler add scenario --slice "<slice-name>" '{
182
+ "name": "Order appears in summary",
183
+ "description": "After placing an order, it should be visible in the order summary with pending status",
184
+ "given": [
185
+ {"event": "OrderPlaced", "fieldValues": {"orderId": "order-456", "customerId": "cust-123", "status": "pending"}}
186
+ ],
187
+ "then": {
188
+ "type": "readModelAssertion",
189
+ "readModel": "OrderSummary",
190
+ "expected": {"orderId": "order-456", "status": "pending"}
191
+ }
192
+ }'
192
193
  \`\`\`
193
194
 
194
195
  ---
@@ -201,62 +202,6 @@ eventmodeler add scenario --slice "<slice-name>" --xml '<scenario name="Order ap
201
202
  | Automation | Given (Events) → Then | Command or noCommand |
202
203
  | State-View | Given → Then | Read Model Assertion |
203
204
 
204
- ## JSON Format Alternative
205
-
206
- You can also use JSON format:
207
-
208
- **State-Change Scenario:**
209
- \`\`\`bash
210
- eventmodeler add scenario --slice "<slice-name>" --json '{
211
- "name": "Successfully place order",
212
- "description": "A registered customer can place an order",
213
- "given": [
214
- { "event": "CustomerRegistered", "fieldValues": { "customerId": "cust-123" } }
215
- ],
216
- "when": {
217
- "command": "PlaceOrder",
218
- "commandFieldValues": { "customerId": "cust-123", "items": [] }
219
- },
220
- "then": {
221
- "type": "events",
222
- "events": [
223
- { "event": "OrderPlaced", "fieldValues": { "orderId": "order-456" } }
224
- ]
225
- }
226
- }'
227
- \`\`\`
228
-
229
- **Automation Scenario (Given-Then format):**
230
- \`\`\`bash
231
- eventmodeler add scenario --slice "<slice-name>" --json '{
232
- "name": "Payment triggers shipment",
233
- "description": "Given order placed and payment received, shipment is initiated",
234
- "given": [
235
- { "event": "OrderPlaced", "fieldValues": { "orderId": "order-123" } },
236
- { "event": "PaymentReceived", "fieldValues": { "orderId": "order-123", "amount": 99.99 } }
237
- ],
238
- "then": {
239
- "type": "command",
240
- "command": "InitiateShipment",
241
- "commandFieldValues": { "orderId": "order-123" }
242
- }
243
- }'
244
- \`\`\`
245
-
246
- **Automation Scenario (negative case):**
247
- \`\`\`bash
248
- eventmodeler add scenario --slice "<slice-name>" --json '{
249
- "name": "No shipment without payment",
250
- "description": "Given only order placed (no payment), no command dispatched",
251
- "given": [
252
- { "event": "OrderPlaced", "fieldValues": { "orderId": "order-123" } }
253
- ],
254
- "then": {
255
- "type": "noCommand"
256
- }
257
- }'
258
- \`\`\`
259
-
260
205
  ## Best Practices
261
206
 
262
207
  1. **Write clear descriptions** - Explain why this scenario matters and what business rule it captures
@@ -1,9 +1,9 @@
1
- import { meta as exploreMeta, content as exploreContent } from './guides/explore.js';
2
- import { meta as scenariosMeta, content as scenariosContent } from './guides/scenarios.js';
3
- import { meta as informationFlowMeta, content as informationFlowContent } from './guides/information-flow.js';
4
- import { meta as createSlicesMeta, content as createSlicesContent } from './guides/create-slices.js';
5
- import { meta as connectSlicesMeta, content as connectSlicesContent } from './guides/connect-slices.js';
6
- import { meta as codegenMeta, content as codegenContent } from './guides/codegen.js';
1
+ import { meta as exploreMeta, content as exploreContent } from './guides/explore';
2
+ import { meta as scenariosMeta, content as scenariosContent } from './guides/scenarios';
3
+ import { meta as informationFlowMeta, content as informationFlowContent } from './guides/information-flow';
4
+ import { meta as createSlicesMeta, content as createSlicesContent } from './guides/create-slices';
5
+ import { meta as connectSlicesMeta, content as connectSlicesContent } from './guides/connect-slices';
6
+ import { meta as codegenMeta, content as codegenContent } from './guides/codegen';
7
7
  const GUIDES = [
8
8
  { meta: exploreMeta, content: exploreContent },
9
9
  { meta: createSlicesMeta, content: createSlicesContent },