eva4j 1.0.16 → 1.0.18

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 (151) hide show
  1. package/AGENTS.md +220 -5
  2. package/DOMAIN_YAML_GUIDE.md +188 -3
  3. package/FUTURE_FEATURES.md +33 -52
  4. package/QUICK_REFERENCE.md +8 -4
  5. package/bin/eva4j.js +70 -2
  6. package/config/defaults.json +1 -0
  7. package/docs/CAMUNDA_DMN_GUIDE.md +1380 -0
  8. package/docs/KAFKA_PRODUCTION_CONFIG.md +441 -0
  9. package/docs/RABBITMQ_PRODUCTION_CONFIG.md +227 -0
  10. package/docs/commands/ADD_RABBITMQ_CLIENT.md +192 -0
  11. package/docs/commands/EVALUATE_SYSTEM.md +290 -10
  12. package/docs/commands/GENERATE_RABBITMQ_EVENT.md +341 -0
  13. package/docs/commands/GENERATE_RABBITMQ_LISTENER.md +595 -0
  14. package/docs/commands/GENERATE_TEMPORAL_FLOW.md +52 -12
  15. package/docs/commands/INDEX.md +27 -3
  16. package/docs/prototype/TEMPORAL_COMMUNICATION_PATTERNS.md +731 -0
  17. package/docs/prototype/TEMPORAL_DESIGN_METHODOLOGY.md +740 -0
  18. package/docs/prototype/system/RISKS.md +277 -0
  19. package/docs/prototype/system/customers.yaml +133 -0
  20. package/docs/prototype/system/inventory.yaml +109 -0
  21. package/docs/prototype/system/notifications.yaml +131 -0
  22. package/docs/prototype/system/orders.yaml +241 -0
  23. package/docs/prototype/system/payments.yaml +256 -0
  24. package/docs/prototype/system/products.yaml +168 -0
  25. package/docs/prototype/system/system.yaml +269 -0
  26. package/examples/domain-endpoints-multi-aggregate.yaml +140 -0
  27. package/examples/domain-events.yaml +26 -0
  28. package/examples/domain-read-models.yaml +113 -0
  29. package/examples/system/customer.yaml +89 -0
  30. package/examples/system/orders.yaml +119 -0
  31. package/examples/system/product.yaml +27 -0
  32. package/examples/system/system.yaml +80 -0
  33. package/package.json +1 -1
  34. package/read-model-spec.md +664 -0
  35. package/src/agents/design-gap-analyst-temporal.agent.md +452 -0
  36. package/src/agents/design-gap-analyst.agent.md +383 -0
  37. package/src/agents/design-reviewer-temporal.agent.md +412 -0
  38. package/src/agents/design-reviewer.agent.md +34 -5
  39. package/src/agents/implement-use-cases.prompt.md +179 -0
  40. package/src/agents/ux-gap-analyst.agent.md +412 -0
  41. package/src/commands/add-rabbitmq-client.js +261 -0
  42. package/src/commands/add-temporal-client.js +22 -2
  43. package/src/commands/build.js +267 -11
  44. package/src/commands/evaluate-system.js +700 -13
  45. package/src/commands/generate-entities.js +560 -24
  46. package/src/commands/generate-http-exchange.js +3 -0
  47. package/src/commands/generate-kafka-event.js +3 -0
  48. package/src/commands/generate-kafka-listener.js +3 -0
  49. package/src/commands/generate-rabbitmq-event.js +665 -0
  50. package/src/commands/generate-rabbitmq-listener.js +205 -0
  51. package/src/commands/generate-record.js +2 -2
  52. package/src/commands/generate-resource.js +4 -1
  53. package/src/commands/generate-temporal-activity.js +970 -33
  54. package/src/commands/generate-temporal-flow.js +98 -38
  55. package/src/commands/generate-temporal-system.js +708 -0
  56. package/src/commands/generate-usecase.js +4 -1
  57. package/src/skills/build-system-yaml/SKILL.md +343 -2
  58. package/src/skills/build-system-yaml/references/domain-yaml-spec.md +253 -26
  59. package/src/skills/build-system-yaml/references/module-spec.md +90 -9
  60. package/src/skills/build-system-yaml/references/system-yaml-spec.md +36 -0
  61. package/src/skills/build-temporal-system/SKILL.md +752 -0
  62. package/src/skills/build-temporal-system/references/temporal-communication-patterns.md +167 -0
  63. package/src/skills/build-temporal-system/references/temporal-domain-yaml-spec.md +449 -0
  64. package/src/skills/build-temporal-system/references/temporal-module-spec.md +353 -0
  65. package/src/skills/build-temporal-system/references/temporal-system-yaml-spec.md +326 -0
  66. package/src/skills/implement-use-case/SKILL.md +350 -0
  67. package/src/skills/implement-use-case/references/use-case-patterns.md +980 -0
  68. package/src/skills/requirements-elicitation/SKILL.md +228 -0
  69. package/src/skills/requirements-elicitation/references/interview-framework.md +260 -0
  70. package/src/skills/requirements-elicitation/references/output-templates.md +368 -0
  71. package/src/utils/bounded-context-diagram.js +844 -0
  72. package/src/utils/config-manager.js +4 -2
  73. package/src/utils/domain-validator.js +495 -17
  74. package/src/utils/naming.js +20 -0
  75. package/src/utils/system-validator.js +169 -11
  76. package/src/utils/system-yaml-parser.js +318 -0
  77. package/src/utils/temporal-validator.js +497 -0
  78. package/src/utils/validator.js +3 -1
  79. package/src/utils/yaml-to-entity.js +281 -9
  80. package/templates/aggregate/AggregateRepository.java.ejs +4 -0
  81. package/templates/aggregate/AggregateRepositoryImpl.java.ejs +8 -0
  82. package/templates/aggregate/AggregateRoot.java.ejs +38 -4
  83. package/templates/aggregate/DomainEventHandler.java.ejs +116 -22
  84. package/templates/aggregate/JpaAggregateRoot.java.ejs +4 -4
  85. package/templates/aggregate/JpaEntity.java.ejs +2 -2
  86. package/templates/base/docker/rabbitmq-services.yaml.ejs +12 -0
  87. package/templates/base/resources/parameters/develop/kafka.yaml.ejs +5 -0
  88. package/templates/base/resources/parameters/develop/rabbitmq.yaml.ejs +15 -0
  89. package/templates/base/resources/parameters/develop/temporal.yaml.ejs +0 -3
  90. package/templates/base/resources/parameters/local/kafka.yaml.ejs +5 -0
  91. package/templates/base/resources/parameters/local/rabbitmq.yaml.ejs +15 -0
  92. package/templates/base/resources/parameters/local/temporal.yaml.ejs +0 -3
  93. package/templates/base/resources/parameters/production/kafka.yaml.ejs +39 -8
  94. package/templates/base/resources/parameters/production/rabbitmq.yaml.ejs +32 -0
  95. package/templates/base/resources/parameters/production/temporal.yaml.ejs +0 -3
  96. package/templates/base/resources/parameters/test/kafka.yaml.ejs +12 -6
  97. package/templates/base/resources/parameters/test/rabbitmq.yaml.ejs +15 -0
  98. package/templates/base/resources/parameters/test/temporal.yaml.ejs +0 -3
  99. package/templates/base/root/AGENTS.md.ejs +1 -1
  100. package/templates/crud/DeleteCommandHandler.java.ejs +19 -1
  101. package/templates/crud/EndpointsController.java.ejs +1 -1
  102. package/templates/crud/ScaffoldCommand.java.ejs +5 -2
  103. package/templates/crud/ScaffoldCommandHandler.java.ejs +3 -1
  104. package/templates/crud/ScaffoldQuery.java.ejs +5 -2
  105. package/templates/crud/ScaffoldQueryHandler.java.ejs +3 -1
  106. package/templates/crud/SubEntityRemoveCommand.java.ejs +1 -1
  107. package/templates/crud/UpdateCommandHandler.java.ejs +53 -2
  108. package/templates/evaluate/report.html.ejs +1447 -90
  109. package/templates/kafka-event/KafkaConfigBean.java.ejs +1 -1
  110. package/templates/kafka-event/KafkaMessageBroker.java.ejs +3 -3
  111. package/templates/ports/PortAclMapper.java.ejs +35 -0
  112. package/templates/ports/PortFeignAdapter.java.ejs +7 -22
  113. package/templates/ports/PortFeignClient.java.ejs +4 -0
  114. package/templates/ports/PortResponseDto.java.ejs +1 -1
  115. package/templates/rabbitmq-event/RabbitConfigBean.java.ejs +33 -0
  116. package/templates/rabbitmq-event/RabbitConfigExchange.java.ejs +12 -0
  117. package/templates/rabbitmq-event/RabbitMessageBroker.java.ejs +35 -0
  118. package/templates/rabbitmq-event/RabbitMessageBrokerMethod.java.ejs +9 -0
  119. package/templates/rabbitmq-listener/RabbitConfigConsumerBean.java.ejs +33 -0
  120. package/templates/rabbitmq-listener/RabbitConfigConsumerExchange.java.ejs +12 -0
  121. package/templates/rabbitmq-listener/RabbitListenerClass.java.ejs +82 -0
  122. package/templates/rabbitmq-listener/RabbitListenerSimple.java.ejs +56 -0
  123. package/templates/read-model/ReadModelDomain.java.ejs +46 -0
  124. package/templates/read-model/ReadModelJpa.java.ejs +58 -0
  125. package/templates/read-model/ReadModelJpaRepository.java.ejs +13 -0
  126. package/templates/read-model/ReadModelKafkaListener.java.ejs +64 -0
  127. package/templates/read-model/ReadModelRabbitListener.java.ejs +71 -0
  128. package/templates/read-model/ReadModelRepository.java.ejs +42 -0
  129. package/templates/read-model/ReadModelRepositoryImpl.java.ejs +85 -0
  130. package/templates/read-model/ReadModelSyncHandler.java.ejs +54 -0
  131. package/templates/shared/configurations/kafkaConfig/KafkaConfig.java.ejs +18 -4
  132. package/templates/shared/configurations/rabbitmqConfig/RabbitMQConfig.java.ejs +100 -0
  133. package/templates/shared/configurations/temporalConfig/TemporalConfig.java.ejs +2 -64
  134. package/templates/shared/configurations/temporalConfig/TemporalWorkerFactoryLifecycle.java.ejs +41 -0
  135. package/templates/temporal-activity/ActivityImpl.java.ejs +68 -2
  136. package/templates/temporal-activity/ActivityInput.java.ejs +14 -0
  137. package/templates/temporal-activity/ActivityInterface.java.ejs +7 -1
  138. package/templates/temporal-activity/ActivityOutput.java.ejs +14 -0
  139. package/templates/temporal-activity/NestedType.java.ejs +12 -0
  140. package/templates/temporal-activity/SharedActivityInput.java.ejs +14 -0
  141. package/templates/temporal-activity/SharedActivityInterface.java.ejs +15 -0
  142. package/templates/temporal-activity/SharedActivityOutput.java.ejs +14 -0
  143. package/templates/temporal-activity/SharedNestedType.java.ejs +12 -0
  144. package/templates/temporal-flow/ModuleHeavyActivity.java.ejs +6 -0
  145. package/templates/temporal-flow/ModuleLightActivity.java.ejs +6 -0
  146. package/templates/temporal-flow/ModuleTemporalWorkerConfig.java.ejs +58 -0
  147. package/templates/temporal-flow/WorkFlowImpl.java.ejs +172 -12
  148. package/templates/temporal-flow/WorkFlowInput.java.ejs +11 -0
  149. package/templates/temporal-flow/WorkFlowInterface.java.ejs +5 -4
  150. package/templates/temporal-flow/WorkFlowService.java.ejs +42 -12
  151. package/COMMAND_EVALUATION.md +0 -911
@@ -0,0 +1,119 @@
1
+ # ─────────────────────────────────────────────────────────────────────────────
2
+ # orders — Domain Model
3
+ # ─────────────────────────────────────────────────────────────────────────────
4
+ # Gestión de órdenes de compra. Usa readModels para mantener proyecciones
5
+ # locales de Product y Customer, eliminando dependencias HTTP síncronas.
6
+ # ─────────────────────────────────────────────────────────────────────────────
7
+
8
+ aggregates:
9
+ - name: Order
10
+ entities:
11
+ - name: Order
12
+ isRoot: true
13
+ tableName: orders
14
+ audit:
15
+ enabled: true
16
+ trackUser: true
17
+ fields:
18
+ - name: id
19
+ type: String
20
+ - name: orderNumber
21
+ type: String
22
+ validations:
23
+ - type: NotBlank
24
+ message: "Order number is required"
25
+ - name: customerId
26
+ type: String
27
+ reference:
28
+ aggregate: Customer
29
+ module: customer
30
+ validations:
31
+ - type: NotBlank
32
+ message: "Customer ID is required"
33
+ - name: productId
34
+ type: String
35
+ reference:
36
+ aggregate: Product
37
+ module: product
38
+ validations:
39
+ - type: NotBlank
40
+ message: "Product ID is required"
41
+ - name: quantity
42
+ type: Integer
43
+ validations:
44
+ - type: Positive
45
+ - name: totalAmount
46
+ type: BigDecimal
47
+ readOnly: true
48
+ defaultValue: "0.00"
49
+
50
+ # ─────────────────────────────────────────────────────────────────────────────
51
+ # Declarative REST endpoints
52
+ # ─────────────────────────────────────────────────────────────────────────────
53
+ endpoints:
54
+ basePath: /orders
55
+ versions:
56
+ - version: v1
57
+ operations:
58
+ - useCase: CreateOrder
59
+ method: POST
60
+ path: /
61
+ - useCase: GetOrder
62
+ method: GET
63
+ path: /{id}
64
+ - useCase: FindAllOrders
65
+ method: GET
66
+ path: /
67
+ - useCase: UpdateOrder
68
+ method: PUT
69
+ path: /{id}
70
+ - useCase: DeleteOrder
71
+ method: DELETE
72
+ path: /{id}
73
+
74
+ # ─────────────────────────────────────────────────────────────────────────────
75
+ # Read Models — proyecciones locales de datos de otros módulos
76
+ # ─────────────────────────────────────────────────────────────────────────────
77
+ # Cada readModel mantiene una tabla local (rm_*) sincronizada por eventos de
78
+ # ciclo de vida del módulo productor. Elimina la necesidad de ports: (HTTP).
79
+ # ─────────────────────────────────────────────────────────────────────────────
80
+ readModels:
81
+ - name: ProductReadModel
82
+ source:
83
+ module: product
84
+ aggregate: Product
85
+ tableName: rm_orders_products
86
+ fields:
87
+ - name: id
88
+ type: String
89
+ - name: name
90
+ type: String
91
+ - name: price
92
+ type: BigDecimal
93
+ - name: categoryId
94
+ type: String
95
+ syncedBy:
96
+ - event: ProductCreatedEvent
97
+ action: UPSERT
98
+ - event: ProductUpdatedEvent
99
+ action: UPSERT
100
+
101
+ - name: CustomerReadModel
102
+ source:
103
+ module: customer
104
+ aggregate: Customer
105
+ tableName: rm_orders_customers
106
+ fields:
107
+ - name: id
108
+ type: String
109
+ - name: fullName
110
+ type: String
111
+ - name: email
112
+ type: String
113
+ syncedBy:
114
+ - event: CustomerCreatedEvent
115
+ action: UPSERT
116
+ - event: CustomerUpdatedEvent
117
+ action: UPSERT
118
+ - event: CustomerDeletedEvent
119
+ action: DELETE
@@ -80,6 +80,33 @@ aggregates:
80
80
  - DISCONTINUED
81
81
 
82
82
  events:
83
+ # ProductCreatedEvent — lifecycle: create → raise() in creation constructor
84
+ # Feeds readModels in consumer modules (e.g. orders/ProductReadModel)
85
+ - name: ProductCreatedEvent
86
+ lifecycle: create
87
+ fields:
88
+ - name: productId
89
+ type: String
90
+ - name: name
91
+ type: String
92
+ - name: price
93
+ type: BigDecimal
94
+ - name: categoryId
95
+ type: String
96
+
97
+ # ProductUpdatedEvent — lifecycle: update → raise() in update() method
98
+ - name: ProductUpdatedEvent
99
+ lifecycle: update
100
+ fields:
101
+ - name: productId
102
+ type: String
103
+ - name: name
104
+ type: String
105
+ - name: price
106
+ type: BigDecimal
107
+ - name: categoryId
108
+ type: String
109
+
83
110
  # ProductPublishedEvent — triggered by publish transition.
84
111
  # price: BigDecimal tests VO-unwrap: entity.price is Price, event expects BigDecimal
85
112
  # → generator should emit: this.getPrice().getAmount()
@@ -93,6 +93,62 @@ modules:
93
93
  useCase: MarkNotificationRead
94
94
  description: "Marcar notificación como leída"
95
95
 
96
+ # ─────────────────────────────────────────────
97
+ # CLIENTES
98
+ # ─────────────────────────────────────────────
99
+
100
+ - name: customer
101
+ description: "Gestión de clientes. Emite lifecycle events para que otros módulos mantengan proyecciones locales."
102
+ exposes:
103
+ - method: POST
104
+ path: /customers
105
+ useCase: CreateCustomer
106
+ description: "Registrar un nuevo cliente"
107
+ - method: GET
108
+ path: /customers/{id}
109
+ useCase: GetCustomer
110
+ description: "Obtener detalle de un cliente"
111
+ - method: GET
112
+ path: /customers
113
+ useCase: FindAllCustomers
114
+ description: "Listar clientes con paginación"
115
+ - method: PUT
116
+ path: /customers/{id}
117
+ useCase: UpdateCustomer
118
+ description: "Actualizar datos de un cliente"
119
+ - method: DELETE
120
+ path: /customers/{id}
121
+ useCase: DeleteCustomer
122
+ description: "Eliminar un cliente"
123
+
124
+ # ─────────────────────────────────────────────
125
+ # ÓRDENES
126
+ # ─────────────────────────────────────────────
127
+
128
+ - name: orders
129
+ description: "Gestión de órdenes de compra. Mantiene readModels locales de Product y Customer para evitar llamadas HTTP síncronas."
130
+ exposes:
131
+ - method: POST
132
+ path: /orders
133
+ useCase: CreateOrder
134
+ description: "Crear una nueva orden"
135
+ - method: GET
136
+ path: /orders/{id}
137
+ useCase: GetOrder
138
+ description: "Obtener detalle de una orden"
139
+ - method: GET
140
+ path: /orders
141
+ useCase: FindAllOrders
142
+ description: "Listar órdenes con paginación"
143
+ - method: PUT
144
+ path: /orders/{id}
145
+ useCase: UpdateOrder
146
+ description: "Actualizar una orden"
147
+ - method: DELETE
148
+ path: /orders/{id}
149
+ useCase: DeleteOrder
150
+ description: "Eliminar una orden"
151
+
96
152
  integrations:
97
153
  async:
98
154
  # Producto publicado → notification envía alerta a usuarios suscritos
@@ -110,3 +166,27 @@ integrations:
110
166
  consumers:
111
167
  - module: notification
112
168
  useCase: SendProductDiscontinuedNotification
169
+
170
+ # ── Lifecycle events para readModels ──────────────────────────────────
171
+
172
+ # Product lifecycle → orders mantiene ProductReadModel
173
+ - event: ProductCreatedEvent
174
+ producer: product
175
+ topic: PRODUCT_CREATED
176
+
177
+ - event: ProductUpdatedEvent
178
+ producer: product
179
+ topic: PRODUCT_UPDATED
180
+
181
+ # Customer lifecycle → orders mantiene CustomerReadModel
182
+ - event: CustomerCreatedEvent
183
+ producer: customer
184
+ topic: CUSTOMER_CREATED
185
+
186
+ - event: CustomerUpdatedEvent
187
+ producer: customer
188
+ topic: CUSTOMER_UPDATED
189
+
190
+ - event: CustomerDeletedEvent
191
+ producer: customer
192
+ topic: CUSTOMER_DELETED
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eva4j",
3
- "version": "1.0.16",
3
+ "version": "1.0.18",
4
4
  "description": "A powerful Node.js CLI for generating Spring Boot projects with modular architecture that enables efficient monolith-first development with seamless transition to microservices",
5
5
  "main": "bin/eva4j.js",
6
6
  "bin": {