eventmodeler 0.4.7 → 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 +12 -37
  52. package/dist/slices/guide/guides/create-slices.js +110 -140
  53. package/dist/slices/guide/guides/explore.js +37 -26
  54. package/dist/slices/guide/guides/information-flow.js +70 -82
  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,42 +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
120
+ ### Source/Target Formats
121
121
 
122
- The \`--flow\` argument accepts:
122
+ The \`--from\` and \`--to\` arguments accept:
123
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
127
-
128
- ### JSON Alternative
129
-
130
- \`\`\`bash
131
- eventmodeler map fields --flow "OrderPlaced→OrderSummary" --json '[
132
- {"from": "orderId", "to": "orderId"},
133
- {"from": "customerId", "to": "customerId"}
134
- ]'
135
- \`\`\`
124
+ 1. **Element name** (most common): \`"OrderPlaced"\`
125
+ 2. **Element ID prefix** (for duplicates): \`"id:abc12345"\`
136
126
 
137
127
  ### Workflow
138
128
 
139
129
  1. **Find flows needing mappings**: \`eventmodeler show model-completeness\`
140
130
  2. **See source fields**: \`eventmodeler show event "OrderPlaced"\`
141
131
  3. **See target fields**: \`eventmodeler show completeness "OrderSummary"\`
142
- 4. **Create mappings**: \`eventmodeler map fields --flow "OrderPlaced→OrderSummary" --xml '...'\`
132
+ 4. **Create mappings**: \`eventmodeler map fields --from "OrderPlaced" --to "OrderSummary" '[...]'\`
143
133
  5. **Verify**: \`eventmodeler show completeness "OrderSummary"\`
144
134
 
145
135
  ### Mapping Nested Fields
@@ -147,11 +137,11 @@ eventmodeler map fields --flow "OrderPlaced→OrderSummary" --json '[
147
137
  For Custom (nested) field types, use dot notation:
148
138
 
149
139
  \`\`\`bash
150
- eventmodeler map fields --flow "OrderPlaced→OrderSummary" --xml '
151
- <mapping from="shippingAddress.street" to="deliveryAddress.street"/>
152
- <mapping from="shippingAddress.city" to="deliveryAddress.city"/>
153
- <mapping from="shippingAddress.postalCode" to="deliveryAddress.zip"/>
154
- '
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
+ ]'
155
145
  \`\`\`
156
146
 
157
147
  ### Multiple Flows to Same Target
@@ -160,17 +150,17 @@ A read model often receives data from multiple events. Map each flow separately:
160
150
 
161
151
  \`\`\`bash
162
152
  # Initial data from OrderPlaced
163
- eventmodeler map fields --flow "OrderPlaced→OrderSummary" --xml '
164
- <mapping from="orderId" to="orderId"/>
165
- <mapping from="customerId" to="customerId"/>
166
- <mapping from="totalAmount" to="total"/>
167
- '
153
+ eventmodeler map fields --from "OrderPlaced" --to "OrderSummary" '[
154
+ {"from": "orderId", "to": "orderId"},
155
+ {"from": "customerId", "to": "customerId"},
156
+ {"from": "totalAmount", "to": "total"}
157
+ ]'
168
158
 
169
159
  # Status updates from OrderShipped
170
- eventmodeler map fields --flow "OrderShipped→OrderSummary" --xml '
171
- <mapping from="shippedAt" to="shippedDate"/>
172
- <mapping from="trackingNumber" to="trackingNumber"/>
173
- '
160
+ eventmodeler map fields --from "OrderShipped" --to "OrderSummary" '[
161
+ {"from": "shippedAt", "to": "shippedDate"},
162
+ {"from": "trackingNumber", "to": "trackingNumber"}
163
+ ]'
174
164
  \`\`\`
175
165
 
176
166
  ### Updating Existing Mappings
@@ -183,10 +173,10 @@ Running \`map fields\` again **merges** with existing mappings:
183
173
 
184
174
  | Pattern | Example |
185
175
  |---------|---------|
186
- | Identity | \`<mapping from="orderId" to="orderId"/>\` |
187
- | Rename | \`<mapping from="totalAmount" to="total"/>\` |
188
- | Nested to flat | \`<mapping from="customer.id" to="customerId"/>\` |
189
- | 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"}\` |
190
180
 
191
181
  ---
192
182
 
@@ -197,11 +187,9 @@ Use \`update field\` to modify field attributes without changing the field's nam
197
187
  ### Command Syntax
198
188
 
199
189
  \`\`\`bash
200
- eventmodeler update field --<element-type> "<name>" --field "<field-name>" [options]
190
+ eventmodeler update field <element-name> --field "<field-name>" [options]
201
191
  \`\`\`
202
192
 
203
- Element types: \`--command\`, \`--event\`, \`--read-model\`, \`--screen\`, \`--processor\`
204
-
205
193
  ### Available Options
206
194
 
207
195
  | Option | Values | Description |
@@ -215,19 +203,19 @@ Element types: \`--command\`, \`--event\`, \`--read-model\`, \`--screen\`, \`--p
215
203
 
216
204
  \`\`\`bash
217
205
  # Mark a field as optional
218
- eventmodeler update field --event "OrderPlaced" --field "promoCode" --optional true
206
+ eventmodeler update field "OrderPlaced" --field "promoCode" --optional true
219
207
 
220
208
  # Mark a field as system-generated
221
- eventmodeler update field --event "OrderPlaced" --field "orderId" --generated true
209
+ eventmodeler update field "OrderPlaced" --field "orderId" --generated true
222
210
 
223
211
  # Mark screen fields as user input
224
- eventmodeler update field --screen "Checkout" --field "email" --user-input true
212
+ eventmodeler update field "Checkout" --field "email" --user-input true
225
213
 
226
214
  # Change a field's type
227
- eventmodeler update field --read-model "OrderSummary" --field "total" --type Decimal
215
+ eventmodeler update field "OrderSummary" --field "total" --type Decimal
228
216
 
229
217
  # Combine multiple updates
230
- eventmodeler update field --event "UserRegistered" --field "createdAt" --generated true --optional false
218
+ eventmodeler update field "UserRegistered" --field "createdAt" --generated true --optional false
231
219
  \`\`\`
232
220
 
233
221
  ### Updating Nested Fields
@@ -235,7 +223,7 @@ eventmodeler update field --event "UserRegistered" --field "createdAt" --generat
235
223
  Use dot notation for fields inside Custom types:
236
224
 
237
225
  \`\`\`bash
238
- eventmodeler update field --event "OrderPlaced" --field "shippingAddress.postalCode" --optional true
226
+ eventmodeler update field "OrderPlaced" --field "shippingAddress.postalCode" --optional true
239
227
  \`\`\`
240
228
 
241
229
  ### Field Property Meanings
@@ -252,13 +240,13 @@ eventmodeler update field --event "OrderPlaced" --field "shippingAddress.postalC
252
240
 
253
241
  \`\`\`bash
254
242
  # Remove a field from an event
255
- eventmodeler remove field --event "OrderPlaced" --field "legacyId"
243
+ eventmodeler remove field "OrderPlaced" --field "legacyId"
256
244
 
257
245
  # Remove a field from a read model
258
- eventmodeler remove field --read-model "OrderSummary" --field "deprecatedStatus"
246
+ eventmodeler remove field "OrderSummary" --field "deprecatedStatus"
259
247
 
260
248
  # Remove a nested field using dot notation
261
- eventmodeler remove field --event "OrderPlaced" --field "metadata.debugInfo"
249
+ eventmodeler remove field "OrderPlaced" --field "metadata.debugInfo"
262
250
  \`\`\`
263
251
 
264
252
  **Caution**: Removing a field may break existing field mappings. Check completeness first:
@@ -292,16 +280,16 @@ eventmodeler show aggregate-completeness "<aggregate-name>"
292
280
  ## Common Mistakes
293
281
 
294
282
  - **Creating empty Custom fields**: Custom fields MUST have subfields.
295
- - Wrong: \`<field name="address" type="Custom"/>\`
296
- - 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"}, ...]}\`
297
285
 
298
- - **Using "List" as a field type**: Use \`isList="true"\` with a valid type instead.
299
- - Wrong: \`<field name="items" type="List"/>\`
300
- - 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}\`
301
289
 
302
290
  - **Using wrong attribute names**: Always use camelCase attributes.
303
- - Wrong: \`optional="true"\`, \`generated="true"\`, \`list="true"\`
304
- - Right: \`isOptional="true"\`, \`isGenerated="true"\`, \`isList="true"\`
291
+ - Wrong: \`"optional": true\`, \`"generated": true\`, \`"list": true\`
292
+ - Right: \`"isOptional": true\`, \`"isGenerated": true\`, \`"isList": true\`
305
293
 
306
294
  ## Best Practices
307
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 },