@auto-engineer/server-generator-apollo-emmett 1.147.0 → 1.149.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 (30) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/.turbo/turbo-test.log +6 -6
  3. package/.turbo/turbo-type-check.log +1 -1
  4. package/CHANGELOG.md +53 -0
  5. package/README.md +174 -103
  6. package/dist/src/codegen/scaffoldFromSchema.d.ts.map +1 -1
  7. package/dist/src/codegen/scaffoldFromSchema.js +4 -0
  8. package/dist/src/codegen/scaffoldFromSchema.js.map +1 -1
  9. package/dist/src/codegen/templateHelpers.d.ts +11 -0
  10. package/dist/src/codegen/templateHelpers.d.ts.map +1 -0
  11. package/dist/src/codegen/templateHelpers.js +47 -0
  12. package/dist/src/codegen/templateHelpers.js.map +1 -0
  13. package/dist/src/codegen/templates/command/decide.specs.specs.ts +473 -0
  14. package/dist/src/codegen/templates/command/decide.specs.ts +1 -10
  15. package/dist/src/codegen/templates/command/decide.specs.ts.ejs +0 -45
  16. package/dist/src/codegen/templates/command/decide.ts.ejs +31 -2
  17. package/dist/src/codegen/templates/command/state.specs.ts +89 -0
  18. package/dist/src/codegen/templates/command/state.ts.ejs +20 -0
  19. package/dist/tsconfig.tsbuildinfo +1 -1
  20. package/ketchup-plan.md +5 -3
  21. package/package.json +4 -4
  22. package/src/codegen/scaffoldFromSchema.ts +4 -0
  23. package/src/codegen/templateHelpers.specs.ts +98 -0
  24. package/src/codegen/templateHelpers.ts +58 -0
  25. package/src/codegen/templates/command/decide.specs.specs.ts +473 -0
  26. package/src/codegen/templates/command/decide.specs.ts +1 -10
  27. package/src/codegen/templates/command/decide.specs.ts.ejs +0 -45
  28. package/src/codegen/templates/command/decide.ts.ejs +31 -2
  29. package/src/codegen/templates/command/state.specs.ts +89 -0
  30. package/src/codegen/templates/command/state.ts.ejs +20 -0
@@ -1,5 +1,5 @@
1
1
 
2
- > @auto-engineer/server-generator-apollo-emmett@1.147.0 build /home/runner/work/auto-engineer/auto-engineer/packages/server-generator-apollo-emmett
2
+ > @auto-engineer/server-generator-apollo-emmett@1.149.0 build /home/runner/work/auto-engineer/auto-engineer/packages/server-generator-apollo-emmett
3
3
  > tsc && tsx ../../scripts/fix-esm-imports.ts && rm -rf dist/src/codegen/templates && mkdir -p dist/src/codegen && cp -r src/codegen/templates dist/src/codegen/templates && cp src/server.ts dist/src && cp -r src/utils dist/src && cp -r src/domain dist/src
4
4
 
5
5
  Fixed ESM imports in dist/
@@ -1,14 +1,14 @@
1
1
 
2
- > @auto-engineer/server-generator-apollo-emmett@1.146.0 test /home/runner/work/auto-engineer/auto-engineer/packages/server-generator-apollo-emmett
2
+ > @auto-engineer/server-generator-apollo-emmett@1.148.0 test /home/runner/work/auto-engineer/auto-engineer/packages/server-generator-apollo-emmett
3
3
  > vitest run --reporter=dot
4
4
 
5
5
 
6
6
   RUN  v3.2.4 /home/runner/work/auto-engineer/auto-engineer/packages/server-generator-apollo-emmett
7
7
 
8
- ············································································································································································································································································-·······························
8
+ ·····························································································································································································································································································-·······························
9
9
 
10
-  Test Files  39 passed | 1 skipped (40)
11
-  Tests  299 passed | 1 skipped (300)
12
-  Start at  19:12:40
13
-  Duration  29.97s (transform 5.01s, setup 0ms, collect 60.39s, tests 12.81s, environment 10ms, prepare 5.88s)
10
+  Test Files  40 passed | 1 skipped (41)
11
+  Tests  316 passed | 1 skipped (317)
12
+  Start at  07:23:22
13
+  Duration  40.87s (transform 5.92s, setup 0ms, collect 81.21s, tests 22.27s, environment 10ms, prepare 6.90s)
14
14
 
@@ -1,4 +1,4 @@
1
1
 
2
- > @auto-engineer/server-generator-apollo-emmett@1.146.0 type-check /home/runner/work/auto-engineer/auto-engineer/packages/server-generator-apollo-emmett
2
+ > @auto-engineer/server-generator-apollo-emmett@1.148.0 type-check /home/runner/work/auto-engineer/auto-engineer/packages/server-generator-apollo-emmett
3
3
  > tsc --noEmit --project tsconfig.json
4
4
 
package/CHANGELOG.md CHANGED
@@ -1,5 +1,58 @@
1
1
  # @auto-engineer/server-generator-apollo-emmett
2
2
 
3
+ ## 1.149.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`e1eebbd`](https://github.com/BeOnAuto/auto-engineer/commit/e1eebbdf4f209780e790094d2e6887c4fa809f98) Thanks [@github-actions[bot]](https://github.com/github-actions%5Bbot%5D)! - - **server-generator-apollo-emmett**: add Given state ref hints to state.ts.ejs
8
+ - **server-generator-apollo-emmett**: context-aware nonCommandField instructions
9
+ - **server-generator-apollo-emmett**: add state context instruction
10
+ - **server-generator-apollo-emmett**: extract shared template helpers
11
+ - **server-generator-apollo-emmett**: filter state refs from hasGivenEvents in decide.ts.ejs
12
+
13
+ ### Patch Changes
14
+
15
+ - [`d38c81e`](https://github.com/BeOnAuto/auto-engineer/commit/d38c81e7bb442a39626564cf4f6d8d55b60d0a38) Thanks [@SamHatoum](https://github.com/SamHatoum)! -
16
+
17
+ - Updated dependencies [[`d38c81e`](https://github.com/BeOnAuto/auto-engineer/commit/d38c81e7bb442a39626564cf4f6d8d55b60d0a38), [`e1eebbd`](https://github.com/BeOnAuto/auto-engineer/commit/e1eebbdf4f209780e790094d2e6887c4fa809f98)]:
18
+ - @auto-engineer/message-bus@1.149.0
19
+ - @auto-engineer/narrative@1.149.0
20
+
21
+ ## 1.148.0
22
+
23
+ ### Minor Changes
24
+
25
+ - [`d5ba3a0`](https://github.com/BeOnAuto/auto-engineer/commit/d5ba3a0e3fb0f6a9ad7a3a8b1815590ea77a5b42) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - Added state context instruction to generated decide handlers, preventing unnecessary narrowing when Given steps contain only state references
26
+
27
+ - [`e0cdc4e`](https://github.com/BeOnAuto/auto-engineer/commit/e0cdc4e3363ad84d4bc49996a600ac75c97ccc38) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - Added context-aware classification of non-command fields in generated decide.ts scaffolds, distinguishing between date-derived, state-derived, and not-yet-tested fields
28
+
29
+ - [`9195db7`](https://github.com/BeOnAuto/auto-engineer/commit/9195db78cb707d658866cee99a1c73d34fb4efde) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - Extracted shared template helpers into a dedicated module for cleaner code generation
30
+
31
+ - [`abb6540`](https://github.com/BeOnAuto/auto-engineer/commit/abb6540db7196ed7935c8a8610695828f9035fc3) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - Added status variant hints from Given state references to the state template, helping implementers create matching discriminated union variants
32
+
33
+ - [`9195db7`](https://github.com/BeOnAuto/auto-engineer/commit/9195db78cb707d658866cee99a1c73d34fb4efde) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - Extracted shared template helper functions into a dedicated module for better code reuse across generators
34
+ - Simplified template specs by removing inline duplicate definitions in favor of the shared helpers
35
+
36
+ ### Patch Changes
37
+
38
+ - [`88fb1da`](https://github.com/BeOnAuto/auto-engineer/commit/88fb1da2b222de04dd4959d87657395ee960a6ce) Thanks [@github-actions[bot]](https://github.com/github-actions%5Bbot%5D)! - - **server-generator-apollo-emmett**: skip empty file plans in scaffold output
39
+ - **server-generator-apollo-emmett**: filter state refs from given() in decide.specs.ts.ejs
40
+ - **server-generator-apollo-emmett**: move CS Given states from events to states array
41
+ - **global**: version packages
42
+ - **server-generator-apollo-emmett**: mark G1+G2 ketchup plan complete
43
+
44
+ - [`4255f6d`](https://github.com/BeOnAuto/auto-engineer/commit/4255f6db0d128979e573244a615886482ce799b0) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - Updated ketchup plan for state reference fix in decide template generator
45
+ - Marked generator bug fix milestones G1 and G2 as complete
46
+
47
+ - [`62f1ea3`](https://github.com/BeOnAuto/auto-engineer/commit/62f1ea3dd1b4275211574e3df9d9a6571ae9b27a) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - Fixed scaffold generation to correctly distinguish between event and state references in decision handlers
48
+ - Prevented contradictory instructions from appearing in generated code when Given clauses contain only state references
49
+
50
+ - [`ba4f5c9`](https://github.com/BeOnAuto/auto-engineer/commit/ba4f5c9749fb1c15d444e78ca9a2689817f039cb) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - Added implementation plan for decide.ts code generation fixes in the Apollo Emmett server generator
51
+
52
+ - Updated dependencies [[`88fb1da`](https://github.com/BeOnAuto/auto-engineer/commit/88fb1da2b222de04dd4959d87657395ee960a6ce), [`d5ba3a0`](https://github.com/BeOnAuto/auto-engineer/commit/d5ba3a0e3fb0f6a9ad7a3a8b1815590ea77a5b42), [`e0cdc4e`](https://github.com/BeOnAuto/auto-engineer/commit/e0cdc4e3363ad84d4bc49996a600ac75c97ccc38), [`4255f6d`](https://github.com/BeOnAuto/auto-engineer/commit/4255f6db0d128979e573244a615886482ce799b0), [`9195db7`](https://github.com/BeOnAuto/auto-engineer/commit/9195db78cb707d658866cee99a1c73d34fb4efde), [`abb6540`](https://github.com/BeOnAuto/auto-engineer/commit/abb6540db7196ed7935c8a8610695828f9035fc3), [`9195db7`](https://github.com/BeOnAuto/auto-engineer/commit/9195db78cb707d658866cee99a1c73d34fb4efde), [`62f1ea3`](https://github.com/BeOnAuto/auto-engineer/commit/62f1ea3dd1b4275211574e3df9d9a6571ae9b27a), [`ba4f5c9`](https://github.com/BeOnAuto/auto-engineer/commit/ba4f5c9749fb1c15d444e78ca9a2689817f039cb)]:
53
+ - @auto-engineer/message-bus@1.148.0
54
+ - @auto-engineer/narrative@1.148.0
55
+
3
56
  ## 1.147.0
4
57
 
5
58
  ### Minor Changes
package/README.md CHANGED
@@ -1,14 +1,14 @@
1
1
  # @auto-engineer/server-generator-apollo-emmett
2
2
 
3
- Code generation that scaffolds event-sourced GraphQL servers using the Emmett framework.
3
+ Code generator that scaffolds event-sourced GraphQL servers using Apollo Server, type-graphql, and the Emmett event sourcing framework. Takes a narrative model and produces a fully runnable server with commands, events, projections, queries, and reactors.
4
4
 
5
5
  ---
6
6
 
7
7
  ## Purpose
8
8
 
9
- Without `@auto-engineer/server-generator-apollo-emmett`, you would have to manually write event sourcing boilerplate, create GraphQL resolvers, define command/event types, and set up projections for every slice in your server.
9
+ Without this package, you would need to manually write event sourcing boilerplate (decide/evolve functions), GraphQL resolvers, command/event type definitions, projections, and reactor wiring for every moment in your narrative model.
10
10
 
11
- This package transforms narrative specifications into a complete Apollo GraphQL server with commands, events, projections, queries, and reactors following the Emmett event sourcing patterns.
11
+ This package reads a `Model` object (scenes, messages, integrations, narratives) and generates a complete `server/` directory containing an Apollo GraphQL server that follows Emmett's event sourcing patterns -- including EJS-templated code for each moment type (command, query, react).
12
12
 
13
13
  ---
14
14
 
@@ -18,37 +18,48 @@ This package transforms narrative specifications into a complete Apollo GraphQL
18
18
  pnpm add @auto-engineer/server-generator-apollo-emmett
19
19
  ```
20
20
 
21
- ## Quick Start
21
+ ---
22
22
 
23
- Register the handler and generate a server:
23
+ ## Quick Start
24
24
 
25
- ### 1. Register the handlers
25
+ ### 1. Register the command handlers
26
26
 
27
27
  ```typescript
28
28
  import { COMMANDS } from '@auto-engineer/server-generator-apollo-emmett';
29
29
  import { createMessageBus } from '@auto-engineer/message-bus';
30
30
 
31
31
  const bus = createMessageBus();
32
- COMMANDS.forEach(cmd => bus.registerCommand(cmd));
32
+ COMMANDS.forEach((cmd) => bus.registerCommand(cmd));
33
33
  ```
34
34
 
35
- ### 2. Send a command
35
+ ### 2. Generate a server from a model
36
36
 
37
37
  ```typescript
38
- const result = await bus.dispatch({
38
+ await bus.send({
39
39
  type: 'GenerateServer',
40
40
  data: {
41
- modelPath: './.context/schema.json',
41
+ model: myModel, // a Model object from @auto-engineer/narrative
42
42
  destination: '.',
43
43
  },
44
- requestId: 'req-123',
44
+ requestId: 'req-1',
45
45
  });
46
+ ```
47
+
48
+ This creates a `server/` directory at the destination with a runnable Apollo GraphQL server.
46
49
 
47
- console.log(result);
48
- // → { type: 'ServerGenerated', data: { serverDir: './server', destination: '.' } }
50
+ ### 3. Initialize a bare server (no model needed)
51
+
52
+ ```typescript
53
+ await bus.send({
54
+ type: 'InitializeServer',
55
+ data: {
56
+ destination: '.',
57
+ },
58
+ requestId: 'req-2',
59
+ });
49
60
  ```
50
61
 
51
- The command generates a complete server directory with Apollo, Emmett, and type-graphql.
62
+ Creates a minimal server with a health endpoint, ready for incremental generation.
52
63
 
53
64
  ---
54
65
 
@@ -57,40 +68,54 @@ The command generates a complete server directory with Apollo, Emmett, and type-
57
68
  ### Run via CLI
58
69
 
59
70
  ```bash
60
- auto generate:server --model-path=./.context/schema.json --destination=.
71
+ auto build:backend --destination=.
72
+ auto initialize:server --destination=.
61
73
  ```
62
74
 
63
- ### Run Programmatically
75
+ ### Handle generation results
64
76
 
65
77
  ```typescript
66
- import { COMMANDS } from '@auto-engineer/server-generator-apollo-emmett';
67
- import { createMessageBus } from '@auto-engineer/message-bus';
68
-
69
- const bus = createMessageBus();
70
- COMMANDS.forEach(handler => bus.register(handler));
71
-
72
- await bus.send({
78
+ const events = await bus.send({
73
79
  type: 'GenerateServer',
74
- data: {
75
- modelPath: './.context/schema.json',
76
- destination: '.',
77
- },
80
+ data: { model, destination: '.' },
81
+ requestId: 'req-1',
78
82
  });
79
- ```
80
-
81
- ### Handle Errors
82
83
 
83
- ```typescript
84
- if (result.type === 'ServerGenerationFailed') {
85
- console.error(result.data.error);
84
+ for (const event of events) {
85
+ switch (event.type) {
86
+ case 'ServerGenerated':
87
+ console.log(`Server written to ${event.data.serverDir}`);
88
+ break;
89
+ case 'MomentGenerated':
90
+ console.log(`Generated: ${event.data.sceneName}/${event.data.momentName}`);
91
+ break;
92
+ case 'ServerGenerationFailed':
93
+ console.error(event.data.error);
94
+ break;
95
+ }
86
96
  }
87
97
  ```
88
98
 
89
- ### Listen for Slice Events
99
+ ### Incremental generation with change sets
100
+
101
+ When the model changes, pass a `changeSet` to only regenerate affected moments:
90
102
 
91
103
  ```typescript
92
- bus.on('SliceGenerated', (event) => {
93
- console.log(`Generated: ${event.data.flowName}/${event.data.sliceName}`);
104
+ await bus.send({
105
+ type: 'GenerateServer',
106
+ data: {
107
+ model,
108
+ destination: '.',
109
+ changeSet: {
110
+ added: ['scene-dir/moment-dir'],
111
+ removed: ['old-scene/old-moment'],
112
+ changed: ['scene-dir/updated-moment'],
113
+ sharedTypesChanged: false,
114
+ allAffected: ['scene-dir/moment-dir', 'scene-dir/updated-moment'],
115
+ deltas: {},
116
+ },
117
+ },
118
+ requestId: 'req-3',
94
119
  });
95
120
  ```
96
121
 
@@ -105,9 +130,13 @@ import { COMMANDS } from '@auto-engineer/server-generator-apollo-emmett';
105
130
 
106
131
  import type {
107
132
  GenerateServerCommand,
133
+ GenerateServerEvents,
108
134
  ServerGeneratedEvent,
109
135
  ServerGenerationFailedEvent,
110
- SliceGeneratedEvent,
136
+ MomentGeneratedEvent,
137
+ InitializeServerCommand,
138
+ ServerInitializedEvent,
139
+ ServerInitializationFailedEvent,
111
140
  } from '@auto-engineer/server-generator-apollo-emmett';
112
141
  ```
113
142
 
@@ -115,7 +144,8 @@ import type {
115
144
 
116
145
  | Command | CLI Alias | Description |
117
146
  |---------|-----------|-------------|
118
- | `GenerateServer` | `generate:server` | Generate event-sourced GraphQL server |
147
+ | `GenerateServer` | `build:backend` | Generate event-sourced GraphQL server from a model |
148
+ | `InitializeServer` | `initialize:server` | Create a bare runnable server with health endpoint |
119
149
 
120
150
  ### GenerateServerCommand
121
151
 
@@ -123,39 +153,35 @@ import type {
123
153
  type GenerateServerCommand = Command<
124
154
  'GenerateServer',
125
155
  {
126
- modelPath: string;
156
+ model: Model;
127
157
  destination: string;
158
+ changeSet?: ChangeSet;
159
+ isFirstRun?: boolean;
160
+ newState?: GenerationState;
128
161
  }
129
162
  >;
130
163
  ```
131
164
 
132
- ### ServerGeneratedEvent
165
+ ### InitializeServerCommand
133
166
 
134
167
  ```typescript
135
- type ServerGeneratedEvent = Event<
136
- 'ServerGenerated',
168
+ type InitializeServerCommand = Command<
169
+ 'InitializeServer',
137
170
  {
138
- modelPath: string;
139
171
  destination: string;
140
- serverDir: string;
141
172
  }
142
173
  >;
143
174
  ```
144
175
 
145
- ### SliceGeneratedEvent
176
+ ### Events
146
177
 
147
- ```typescript
148
- type SliceGeneratedEvent = Event<
149
- 'SliceGenerated',
150
- {
151
- flowName: string;
152
- sliceName: string;
153
- sliceType: string;
154
- schemaPath: string;
155
- slicePath: string;
156
- }
157
- >;
158
- ```
178
+ | Event | Emitted when |
179
+ |-------|-------------|
180
+ | `ServerGenerated` | Full or incremental generation completes successfully |
181
+ | `ServerGenerationFailed` | Generation fails (includes error details, scene/moment context) |
182
+ | `MomentGenerated` | An individual moment is scaffolded |
183
+ | `ServerInitialized` | Bare server skeleton is created |
184
+ | `ServerInitializationFailed` | Server initialization fails |
159
185
 
160
186
  ---
161
187
 
@@ -163,72 +189,117 @@ type SliceGeneratedEvent = Event<
163
189
 
164
190
  ```
165
191
  src/
166
- ├── index.ts
167
- ├── server.ts
192
+ ├── index.ts # COMMANDS array, re-exports types
193
+ ├── server.ts # Runtime server entry (copied into generated output)
168
194
  ├── commands/
169
- └── generate-server.ts
195
+ ├── generate-server.ts # GenerateServer command handler
196
+ │ └── initialize-server.ts # InitializeServer command handler
170
197
  ├── codegen/
171
- │ ├── scaffoldFromSchema.ts
172
- │ ├── extract/
173
- └── templates/
174
- ├── command/
175
- ├── query/
176
- └── react/
177
- ├── domain/shared/
178
- └── utils/
198
+ │ ├── scaffoldFromSchema.ts # Orchestrates file plan generation and writing
199
+ │ ├── templateHelpers.ts # Helpers for EJS templates
200
+ ├── types.ts # Message, Field, GwtCondition types
201
+ ├── extract/ # Extractors for commands, events, states, projections, queries
202
+ ├── commands.ts
203
+ │ ├── events.ts
204
+ │ │ ├── gwt.ts
205
+ │ │ ├── imports.ts
206
+ │ │ ├── messages.ts
207
+ │ │ ├── projection.ts
208
+ │ │ ├── query.ts
209
+ │ │ ├── states.ts
210
+ │ │ ├── step-converter.ts
211
+ │ │ ├── step-types.ts
212
+ │ │ └── type-helpers.ts
213
+ │ └── templates/ # EJS templates per moment type
214
+ │ ├── command/ # decide, evolve, handle, commands, events, state, mutation.resolver, register
215
+ │ ├── query/ # projection, query.resolver, events, state
216
+ │ └── react/ # react handler, register, events
217
+ ├── domain/shared/ # Runtime code copied into generated server
218
+ │ ├── types.ts # GraphQLContext, ReactorContext
219
+ │ ├── graphql-types.ts # MutationResponse, MutationError
220
+ │ ├── ReadModel.ts # In-memory read model wrapper
221
+ │ ├── sendCommand.ts # Command dispatch helper
222
+ │ └── reactorSpecification.ts # Test helper for reactor assertions
223
+ └── utils/ # Runtime utilities copied into generated server
224
+ ├── loadResolvers.ts # Glob-loads resolver classes
225
+ ├── loadProjections.ts # Glob-loads projection definitions
226
+ └── loadRegisterFiles.ts # Glob-loads moment registration files
179
227
  ```
180
228
 
181
- The following diagram shows the generation flow:
229
+ ### Generation flow
182
230
 
183
231
  ```mermaid
184
232
  flowchart TB
185
- A[GenerateServer] --> B[Load Model JSON]
186
- B --> C[Extract Messages from Specs]
187
- C --> D[Build GWT Mappings]
188
- D --> E[Render EJS Templates]
189
- E --> F[Write Files to Disk]
190
- F --> G[ServerGeneratedEvent]
233
+ A[GenerateServer command] --> B{First run or change set?}
234
+ B -- First run --> C[Clean server directory]
235
+ B -- Incremental --> D[Remove deleted moments]
236
+ C --> E[Copy runtime files]
237
+ D --> E
238
+ E --> F[Extract messages from model specs]
239
+ F --> G[Build GWT mappings per moment]
240
+ G --> H[Render EJS templates into file plans]
241
+ H --> I[Write files to disk]
242
+ I --> J[Write config files: package.json, tsconfig, vitest, biome]
243
+ J --> K[Emit MomentGenerated / ServerGenerated events]
191
244
  ```
192
245
 
193
- *Flow: Command loads model, extracts commands/events, renders templates, writes generated server.*
194
-
195
- ### Generated Server Structure
246
+ ### Generated server structure
196
247
 
197
248
  ```
198
249
  server/
199
250
  ├── src/
200
- │ ├── server.ts
251
+ │ ├── server.ts # Apollo Server entry point with Emmett event store
201
252
  │ ├── utils/
253
+ │ │ ├── loadResolvers.ts
254
+ │ │ ├── loadProjections.ts
255
+ │ │ └── loadRegisterFiles.ts
202
256
  │ └── domain/
203
257
  │ ├── shared/
204
- └── flows/
205
- └── {flow-name}/
206
- └── {slice-name}/
207
- ├── commands.ts
258
+ │ ├── types.ts # GraphQLContext, ReactorContext
259
+ │ ├── graphql-types.ts # MutationResponse
260
+ │ ├── ReadModel.ts
261
+ │ └── sendCommand.ts
262
+ │ └── narratives/
263
+ │ ├── health/
264
+ │ │ └── query.resolver.ts
265
+ │ └── {narrative}_{scene}/
266
+ │ └── {moment}/
267
+ │ ├── commands.ts # (command type)
208
268
  │ ├── events.ts
209
269
  │ ├── state.ts
210
270
  │ ├── decide.ts
211
271
  │ ├── evolve.ts
212
- └── mutation.resolver.ts
272
+ ├── handle.ts
273
+ │ ├── mutation.resolver.ts
274
+ │ ├── decide.specs.ts
275
+ │ ├── register.ts
276
+ │ ├── projection.ts # (query type)
277
+ │ ├── projection.specs.ts
278
+ │ ├── query.resolver.ts
279
+ │ ├── react.ts # (react type)
280
+ │ └── react.specs.ts
213
281
  ├── package.json
214
- └── tsconfig.json
282
+ ├── tsconfig.json
283
+ ├── vitest.config.ts
284
+ └── biome.json
215
285
  ```
216
286
 
217
- ### Slice Types
218
-
219
- | Type | Description |
220
- |------|-------------|
221
- | Command | Mutation resolvers with decide/evolve pattern |
222
- | Query | Query resolvers backed by projections |
223
- | React | Reactors responding to events with commands |
224
-
225
- ### Dependencies
226
-
227
- | Package | Usage |
228
- |---------|-------|
229
- | `@auto-engineer/narrative` | Model type definitions |
230
- | `@auto-engineer/message-bus` | Command/event infrastructure |
231
- | `@event-driven-io/emmett` | Event sourcing framework |
232
- | `apollo-server` | GraphQL server runtime |
233
- | `type-graphql` | GraphQL schema decorators |
234
- | `ejs` | Template rendering |
287
+ ### Moment types
288
+
289
+ | Type | Generated files | Pattern |
290
+ |------|----------------|---------|
291
+ | `command` | commands, events, state, decide, evolve, handle, mutation.resolver, decide.specs, register | Mutation resolver dispatches command; decide produces events; evolve updates state |
292
+ | `query` | events, projection, state, projection.specs, query.resolver | Query resolver reads from in-memory projection built from events |
293
+ | `react` | events, react handler, react.specs, register | Reactor listens to events and sends commands in response |
294
+
295
+ ### Key dependencies
296
+
297
+ | Package | Role |
298
+ |---------|------|
299
+ | `@auto-engineer/narrative` | Model type definitions (Scene, Moment, Model) |
300
+ | `@auto-engineer/message-bus` | Command handler registration and dispatch |
301
+ | `@event-driven-io/emmett` | Event sourcing runtime (event store, projections, message bus) |
302
+ | `@event-driven-io/emmett-sqlite` | SQLite-backed event store |
303
+ | `apollo-server` | GraphQL server |
304
+ | `type-graphql` | Decorator-based GraphQL schema definitions |
305
+ | `ejs` | Template rendering for code generation |
@@ -1 +1 @@
1
- {"version":3,"file":"scaffoldFromSchema.d.ts","sourceRoot":"","sources":["../../../src/codegen/scaffoldFromSchema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scaffoldFromSchema.d.ts","sourceRoot":"","sources":["../../../src/codegen/scaffoldFromSchema.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,7 @@ import { buildEventIdFieldMap } from './extract/projection.js';
20
20
  import { buildArgToStateFieldMap } from './extract/query.js';
21
21
  import { normalizeMomentForTemplate } from './extract/slice-normalizer.js';
22
22
  import { extractGwtSpecsFromMoment } from './extract/step-converter.js';
23
+ import { buildKeepFieldNames, findDerivedDateInfo, isKeyTraceable } from './templateHelpers.js';
23
24
  export class TemplateRenderError extends Error {
24
25
  constructor(templateFile, cause) {
25
26
  super(`Template render failed: ${templateFile}`, { cause });
@@ -329,6 +330,9 @@ async function renderTemplate(templatePath, data, unionToEnumName = new Map()) {
329
330
  isReferencedMessageTypeArray,
330
331
  extractReferencedTypeName,
331
332
  referencedTypes: data.referencedTypes,
333
+ findDerivedDateInfo,
334
+ isKeyTraceable,
335
+ buildKeepFieldNames,
332
336
  });
333
337
  debugTemplate('Template rendered, output size: %d bytes', result.length);
334
338
  return result;