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.
- package/AGENTS.md +220 -5
- package/DOMAIN_YAML_GUIDE.md +188 -3
- package/FUTURE_FEATURES.md +33 -52
- package/QUICK_REFERENCE.md +8 -4
- package/bin/eva4j.js +70 -2
- package/config/defaults.json +1 -0
- package/docs/CAMUNDA_DMN_GUIDE.md +1380 -0
- package/docs/KAFKA_PRODUCTION_CONFIG.md +441 -0
- package/docs/RABBITMQ_PRODUCTION_CONFIG.md +227 -0
- package/docs/commands/ADD_RABBITMQ_CLIENT.md +192 -0
- package/docs/commands/EVALUATE_SYSTEM.md +290 -10
- package/docs/commands/GENERATE_RABBITMQ_EVENT.md +341 -0
- package/docs/commands/GENERATE_RABBITMQ_LISTENER.md +595 -0
- package/docs/commands/GENERATE_TEMPORAL_FLOW.md +52 -12
- package/docs/commands/INDEX.md +27 -3
- package/docs/prototype/TEMPORAL_COMMUNICATION_PATTERNS.md +731 -0
- package/docs/prototype/TEMPORAL_DESIGN_METHODOLOGY.md +740 -0
- package/docs/prototype/system/RISKS.md +277 -0
- package/docs/prototype/system/customers.yaml +133 -0
- package/docs/prototype/system/inventory.yaml +109 -0
- package/docs/prototype/system/notifications.yaml +131 -0
- package/docs/prototype/system/orders.yaml +241 -0
- package/docs/prototype/system/payments.yaml +256 -0
- package/docs/prototype/system/products.yaml +168 -0
- package/docs/prototype/system/system.yaml +269 -0
- package/examples/domain-endpoints-multi-aggregate.yaml +140 -0
- package/examples/domain-events.yaml +26 -0
- package/examples/domain-read-models.yaml +113 -0
- package/examples/system/customer.yaml +89 -0
- package/examples/system/orders.yaml +119 -0
- package/examples/system/product.yaml +27 -0
- package/examples/system/system.yaml +80 -0
- package/package.json +1 -1
- package/read-model-spec.md +664 -0
- package/src/agents/design-gap-analyst-temporal.agent.md +452 -0
- package/src/agents/design-gap-analyst.agent.md +383 -0
- package/src/agents/design-reviewer-temporal.agent.md +412 -0
- package/src/agents/design-reviewer.agent.md +34 -5
- package/src/agents/implement-use-cases.prompt.md +179 -0
- package/src/agents/ux-gap-analyst.agent.md +412 -0
- package/src/commands/add-rabbitmq-client.js +261 -0
- package/src/commands/add-temporal-client.js +22 -2
- package/src/commands/build.js +267 -11
- package/src/commands/evaluate-system.js +700 -13
- package/src/commands/generate-entities.js +560 -24
- package/src/commands/generate-http-exchange.js +3 -0
- package/src/commands/generate-kafka-event.js +3 -0
- package/src/commands/generate-kafka-listener.js +3 -0
- package/src/commands/generate-rabbitmq-event.js +665 -0
- package/src/commands/generate-rabbitmq-listener.js +205 -0
- package/src/commands/generate-record.js +2 -2
- package/src/commands/generate-resource.js +4 -1
- package/src/commands/generate-temporal-activity.js +970 -33
- package/src/commands/generate-temporal-flow.js +98 -38
- package/src/commands/generate-temporal-system.js +708 -0
- package/src/commands/generate-usecase.js +4 -1
- package/src/skills/build-system-yaml/SKILL.md +343 -2
- package/src/skills/build-system-yaml/references/domain-yaml-spec.md +253 -26
- package/src/skills/build-system-yaml/references/module-spec.md +90 -9
- package/src/skills/build-system-yaml/references/system-yaml-spec.md +36 -0
- package/src/skills/build-temporal-system/SKILL.md +752 -0
- package/src/skills/build-temporal-system/references/temporal-communication-patterns.md +167 -0
- package/src/skills/build-temporal-system/references/temporal-domain-yaml-spec.md +449 -0
- package/src/skills/build-temporal-system/references/temporal-module-spec.md +353 -0
- package/src/skills/build-temporal-system/references/temporal-system-yaml-spec.md +326 -0
- package/src/skills/implement-use-case/SKILL.md +350 -0
- package/src/skills/implement-use-case/references/use-case-patterns.md +980 -0
- package/src/skills/requirements-elicitation/SKILL.md +228 -0
- package/src/skills/requirements-elicitation/references/interview-framework.md +260 -0
- package/src/skills/requirements-elicitation/references/output-templates.md +368 -0
- package/src/utils/bounded-context-diagram.js +844 -0
- package/src/utils/config-manager.js +4 -2
- package/src/utils/domain-validator.js +495 -17
- package/src/utils/naming.js +20 -0
- package/src/utils/system-validator.js +169 -11
- package/src/utils/system-yaml-parser.js +318 -0
- package/src/utils/temporal-validator.js +497 -0
- package/src/utils/validator.js +3 -1
- package/src/utils/yaml-to-entity.js +281 -9
- package/templates/aggregate/AggregateRepository.java.ejs +4 -0
- package/templates/aggregate/AggregateRepositoryImpl.java.ejs +8 -0
- package/templates/aggregate/AggregateRoot.java.ejs +38 -4
- package/templates/aggregate/DomainEventHandler.java.ejs +116 -22
- package/templates/aggregate/JpaAggregateRoot.java.ejs +4 -4
- package/templates/aggregate/JpaEntity.java.ejs +2 -2
- package/templates/base/docker/rabbitmq-services.yaml.ejs +12 -0
- package/templates/base/resources/parameters/develop/kafka.yaml.ejs +5 -0
- package/templates/base/resources/parameters/develop/rabbitmq.yaml.ejs +15 -0
- package/templates/base/resources/parameters/develop/temporal.yaml.ejs +0 -3
- package/templates/base/resources/parameters/local/kafka.yaml.ejs +5 -0
- package/templates/base/resources/parameters/local/rabbitmq.yaml.ejs +15 -0
- package/templates/base/resources/parameters/local/temporal.yaml.ejs +0 -3
- package/templates/base/resources/parameters/production/kafka.yaml.ejs +39 -8
- package/templates/base/resources/parameters/production/rabbitmq.yaml.ejs +32 -0
- package/templates/base/resources/parameters/production/temporal.yaml.ejs +0 -3
- package/templates/base/resources/parameters/test/kafka.yaml.ejs +12 -6
- package/templates/base/resources/parameters/test/rabbitmq.yaml.ejs +15 -0
- package/templates/base/resources/parameters/test/temporal.yaml.ejs +0 -3
- package/templates/base/root/AGENTS.md.ejs +1 -1
- package/templates/crud/DeleteCommandHandler.java.ejs +19 -1
- package/templates/crud/EndpointsController.java.ejs +1 -1
- package/templates/crud/ScaffoldCommand.java.ejs +5 -2
- package/templates/crud/ScaffoldCommandHandler.java.ejs +3 -1
- package/templates/crud/ScaffoldQuery.java.ejs +5 -2
- package/templates/crud/ScaffoldQueryHandler.java.ejs +3 -1
- package/templates/crud/SubEntityRemoveCommand.java.ejs +1 -1
- package/templates/crud/UpdateCommandHandler.java.ejs +53 -2
- package/templates/evaluate/report.html.ejs +1447 -90
- package/templates/kafka-event/KafkaConfigBean.java.ejs +1 -1
- package/templates/kafka-event/KafkaMessageBroker.java.ejs +3 -3
- package/templates/ports/PortAclMapper.java.ejs +35 -0
- package/templates/ports/PortFeignAdapter.java.ejs +7 -22
- package/templates/ports/PortFeignClient.java.ejs +4 -0
- package/templates/ports/PortResponseDto.java.ejs +1 -1
- package/templates/rabbitmq-event/RabbitConfigBean.java.ejs +33 -0
- package/templates/rabbitmq-event/RabbitConfigExchange.java.ejs +12 -0
- package/templates/rabbitmq-event/RabbitMessageBroker.java.ejs +35 -0
- package/templates/rabbitmq-event/RabbitMessageBrokerMethod.java.ejs +9 -0
- package/templates/rabbitmq-listener/RabbitConfigConsumerBean.java.ejs +33 -0
- package/templates/rabbitmq-listener/RabbitConfigConsumerExchange.java.ejs +12 -0
- package/templates/rabbitmq-listener/RabbitListenerClass.java.ejs +82 -0
- package/templates/rabbitmq-listener/RabbitListenerSimple.java.ejs +56 -0
- package/templates/read-model/ReadModelDomain.java.ejs +46 -0
- package/templates/read-model/ReadModelJpa.java.ejs +58 -0
- package/templates/read-model/ReadModelJpaRepository.java.ejs +13 -0
- package/templates/read-model/ReadModelKafkaListener.java.ejs +64 -0
- package/templates/read-model/ReadModelRabbitListener.java.ejs +71 -0
- package/templates/read-model/ReadModelRepository.java.ejs +42 -0
- package/templates/read-model/ReadModelRepositoryImpl.java.ejs +85 -0
- package/templates/read-model/ReadModelSyncHandler.java.ejs +54 -0
- package/templates/shared/configurations/kafkaConfig/KafkaConfig.java.ejs +18 -4
- package/templates/shared/configurations/rabbitmqConfig/RabbitMQConfig.java.ejs +100 -0
- package/templates/shared/configurations/temporalConfig/TemporalConfig.java.ejs +2 -64
- package/templates/shared/configurations/temporalConfig/TemporalWorkerFactoryLifecycle.java.ejs +41 -0
- package/templates/temporal-activity/ActivityImpl.java.ejs +68 -2
- package/templates/temporal-activity/ActivityInput.java.ejs +14 -0
- package/templates/temporal-activity/ActivityInterface.java.ejs +7 -1
- package/templates/temporal-activity/ActivityOutput.java.ejs +14 -0
- package/templates/temporal-activity/NestedType.java.ejs +12 -0
- package/templates/temporal-activity/SharedActivityInput.java.ejs +14 -0
- package/templates/temporal-activity/SharedActivityInterface.java.ejs +15 -0
- package/templates/temporal-activity/SharedActivityOutput.java.ejs +14 -0
- package/templates/temporal-activity/SharedNestedType.java.ejs +12 -0
- package/templates/temporal-flow/ModuleHeavyActivity.java.ejs +6 -0
- package/templates/temporal-flow/ModuleLightActivity.java.ejs +6 -0
- package/templates/temporal-flow/ModuleTemporalWorkerConfig.java.ejs +58 -0
- package/templates/temporal-flow/WorkFlowImpl.java.ejs +172 -12
- package/templates/temporal-flow/WorkFlowInput.java.ejs +11 -0
- package/templates/temporal-flow/WorkFlowInterface.java.ejs +5 -4
- package/templates/temporal-flow/WorkFlowService.java.ejs +42 -12
- 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.
|
|
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": {
|