@auto-engineer/server-generator-apollo-emmett 1.82.0 → 1.84.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.
@@ -1,5 +1,5 @@
1
1
 
2
- > @auto-engineer/server-generator-apollo-emmett@1.82.0 build /home/runner/work/auto-engineer/auto-engineer/packages/server-generator-apollo-emmett
2
+ > @auto-engineer/server-generator-apollo-emmett@1.84.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.81.0 test /home/runner/work/auto-engineer/auto-engineer/packages/server-generator-apollo-emmett
2
+ > @auto-engineer/server-generator-apollo-emmett@1.83.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  30 passed | 1 skipped (31)
11
-  Tests  174 passed | 1 skipped (175)
12
-  Start at  04:34:25
13
-  Duration  41.41s (transform 4.97s, setup 0ms, collect 83.16s, tests 23.21s, environment 7ms, prepare 6.84s)
10
+  Test Files  31 passed | 1 skipped (32)
11
+  Tests  182 passed | 1 skipped (183)
12
+  Start at  18:35:37
13
+  Duration  30.90s (transform 4.71s, setup 0ms, collect 65.46s, tests 12.81s, environment 7ms, prepare 5.24s)
14
14
 
@@ -1,4 +1,4 @@
1
1
 
2
- > @auto-engineer/server-generator-apollo-emmett@1.81.0 type-check /home/runner/work/auto-engineer/auto-engineer/packages/server-generator-apollo-emmett
2
+ > @auto-engineer/server-generator-apollo-emmett@1.83.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,75 @@
1
1
  # @auto-engineer/server-generator-apollo-emmett
2
2
 
3
+ ## 1.84.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`7b5e912`](https://github.com/BeOnAuto/auto-engineer/commit/7b5e912dfda709fd3d33bf478f515d4e86c982af) Thanks [@github-actions[bot]](https://github.com/github-actions%5Bbot%5D)! - - **server-implementer**: integrate shadow detection into retry loops
8
+ - **server-implementer**: add detectImportedTypeShadowing utility
9
+ - **server-generator-nestjs**: add model to ServerGenerationFailedEvent
10
+ - **server-generator-apollo-emmett**: add model to failure events
11
+ - **pipeline**: emit PipelineRunCompleted when all commands complete
12
+
13
+ - [`ba4b32f`](https://github.com/BeOnAuto/auto-engineer/commit/ba4b32f29fbfb45e14a6294fdc06583e466fb7e3) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - **server-generator-apollo-emmett**: merge co-firing GWT conditions in gwt.ts
14
+
15
+ ### Patch Changes
16
+
17
+ - [`3271cfe`](https://github.com/BeOnAuto/auto-engineer/commit/3271cfe4b8be6316454045b02e1e0f1d1fd6414f) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - **server-generator-apollo-emmett**: fix singleton projection instruction steps 1 and 4
18
+
19
+ - [`4833113`](https://github.com/BeOnAuto/auto-engineer/commit/4833113ca52361ca4a4c931390a48b592f1adc78) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - **server-generator-apollo-emmett**: add snapshot test for co-firing rule merge
20
+
21
+ - [`c3c788d`](https://github.com/BeOnAuto/auto-engineer/commit/c3c788defe899dd9c3d50819759c15df764fab2e) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - **server-implementer**: add Bursts 4-5 to ketchup plan
22
+
23
+ - Updated dependencies [[`7b5e912`](https://github.com/BeOnAuto/auto-engineer/commit/7b5e912dfda709fd3d33bf478f515d4e86c982af), [`3271cfe`](https://github.com/BeOnAuto/auto-engineer/commit/3271cfe4b8be6316454045b02e1e0f1d1fd6414f), [`ba4b32f`](https://github.com/BeOnAuto/auto-engineer/commit/ba4b32f29fbfb45e14a6294fdc06583e466fb7e3), [`4833113`](https://github.com/BeOnAuto/auto-engineer/commit/4833113ca52361ca4a4c931390a48b592f1adc78), [`c3c788d`](https://github.com/BeOnAuto/auto-engineer/commit/c3c788defe899dd9c3d50819759c15df764fab2e)]:
24
+ - @auto-engineer/message-bus@1.84.0
25
+ - @auto-engineer/narrative@1.84.0
26
+
27
+ ## 1.83.0
28
+
29
+ ### Minor Changes
30
+
31
+ - [`d4fca9a`](https://github.com/BeOnAuto/auto-engineer/commit/d4fca9a9898dfe2087a8489e5e9dbbd9a6253d24) Thanks [@SamHatoum](https://github.com/SamHatoum)! - - **pipeline**: emit PipelineRunCompleted when all commands complete
32
+
33
+ - [`dfda4a1`](https://github.com/BeOnAuto/auto-engineer/commit/dfda4a16a93f50100e7492990e6906bbc8b2445c) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - **server-implementer**: add detectImportedTypeShadowing utility
34
+
35
+ - [`a58a249`](https://github.com/BeOnAuto/auto-engineer/commit/a58a249899b6b97f6166d13a11e175478b9bcb8c) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - **server-generator-nestjs**: add model to ServerGenerationFailedEvent
36
+
37
+ - [`98ba39b`](https://github.com/BeOnAuto/auto-engineer/commit/98ba39b83131ef24093e6100432d9cf6b1dcdd76) Thanks [@SamHatoum](https://github.com/SamHatoum)! - - **pipeline**: add debounce logic to QuiescenceTracker
38
+
39
+ - [`a305e78`](https://github.com/BeOnAuto/auto-engineer/commit/a305e788b5344d5533be3b95e7702bcbb03056f7) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - **server-implementer**: integrate shadow detection into retry loops
40
+
41
+ - [`c8f3f9f`](https://github.com/BeOnAuto/auto-engineer/commit/c8f3f9ff4d173b063d039d3ee7bd6b639044dd5c) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - **server-generator-apollo-emmett**: add model to failure events
42
+
43
+ - [`2b920cc`](https://github.com/BeOnAuto/auto-engineer/commit/2b920cc6c90951d3fa6c1039cf883dd17e8d59c7) Thanks [@github-actions[bot]](https://github.com/github-actions%5Bbot%5D)! - - add restart commands for server, client, and storybook
44
+ - update killPortHolder to use graceful SIGTERM then SIGKILL
45
+ - sort imports in restart command files
46
+ - sort exports alphabetically to satisfy biome organizeImports
47
+ - **typical**: update clean:dev script to include installation step
48
+
49
+ ### Patch Changes
50
+
51
+ - [`e5f9f43`](https://github.com/BeOnAuto/auto-engineer/commit/e5f9f439a2c622d1241438e6b9431556c9e55691) Thanks [@SamHatoum](https://github.com/SamHatoum)! - - **pipeline**: verify PipelineRunCompleted waits for retries
52
+
53
+ - [`e2da8b5`](https://github.com/BeOnAuto/auto-engineer/commit/e2da8b5ccee2bc606dd8d7e13968e2c3081e4314) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - **server-implementer**: add ketchup plan for type shadow detection
54
+
55
+ - [`3967f21`](https://github.com/BeOnAuto/auto-engineer/commit/3967f21a7bbc12aded3137b1d5982cd588a2ed51) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - **server-generator-apollo-emmett**: clarify Internal State Pattern extends not replaces
56
+
57
+ - [`5b14f47`](https://github.com/BeOnAuto/auto-engineer/commit/5b14f472b15edee7255570eb0fc796ebbfa638e5) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - **global**: update ketchup-plan with completed model repair bursts
58
+
59
+ - [`d435781`](https://github.com/BeOnAuto/auto-engineer/commit/d4357815201bade7a48f665c3d8fa696c5755b4f) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - **typical**: wire SubmitBugReport on generation failures
60
+
61
+ - [`afa04da`](https://github.com/BeOnAuto/auto-engineer/commit/afa04da090785aedf34567183db0e7a46f54c9ee) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - **global**: add ketchup plan for model repair system
62
+
63
+ - [`46189ec`](https://github.com/BeOnAuto/auto-engineer/commit/46189ec17840f8d42fb95003f82dead4875ddd03) Thanks [@SamHatoum](https://github.com/SamHatoum)! - - **pipeline**: update ketchup-plan with completed Phase 13
64
+
65
+ - [`f4bc85c`](https://github.com/BeOnAuto/auto-engineer/commit/f4bc85c4026522dfcfd15844bdc50e645185a912) Thanks [@SamHatoum](https://github.com/SamHatoum)! - - **server-generator-apollo-emmett**: remove invalid argument to reactor.close()
66
+
67
+ - [`3dbb41e`](https://github.com/BeOnAuto/auto-engineer/commit/3dbb41edf2d1eb3a7110038aeb29952befc570da) Thanks [@rami-hatoum](https://github.com/rami-hatoum)! - - Fixed a bug where a required argument was missing when closing the reactor in the Apollo Emmett server generator
68
+
69
+ - Updated dependencies [[`e5f9f43`](https://github.com/BeOnAuto/auto-engineer/commit/e5f9f439a2c622d1241438e6b9431556c9e55691), [`d4fca9a`](https://github.com/BeOnAuto/auto-engineer/commit/d4fca9a9898dfe2087a8489e5e9dbbd9a6253d24), [`e2da8b5`](https://github.com/BeOnAuto/auto-engineer/commit/e2da8b5ccee2bc606dd8d7e13968e2c3081e4314), [`dfda4a1`](https://github.com/BeOnAuto/auto-engineer/commit/dfda4a16a93f50100e7492990e6906bbc8b2445c), [`3967f21`](https://github.com/BeOnAuto/auto-engineer/commit/3967f21a7bbc12aded3137b1d5982cd588a2ed51), [`a58a249`](https://github.com/BeOnAuto/auto-engineer/commit/a58a249899b6b97f6166d13a11e175478b9bcb8c), [`5b14f47`](https://github.com/BeOnAuto/auto-engineer/commit/5b14f472b15edee7255570eb0fc796ebbfa638e5), [`d435781`](https://github.com/BeOnAuto/auto-engineer/commit/d4357815201bade7a48f665c3d8fa696c5755b4f), [`98ba39b`](https://github.com/BeOnAuto/auto-engineer/commit/98ba39b83131ef24093e6100432d9cf6b1dcdd76), [`a305e78`](https://github.com/BeOnAuto/auto-engineer/commit/a305e788b5344d5533be3b95e7702bcbb03056f7), [`c8f3f9f`](https://github.com/BeOnAuto/auto-engineer/commit/c8f3f9ff4d173b063d039d3ee7bd6b639044dd5c), [`afa04da`](https://github.com/BeOnAuto/auto-engineer/commit/afa04da090785aedf34567183db0e7a46f54c9ee), [`46189ec`](https://github.com/BeOnAuto/auto-engineer/commit/46189ec17840f8d42fb95003f82dead4875ddd03), [`f4bc85c`](https://github.com/BeOnAuto/auto-engineer/commit/f4bc85c4026522dfcfd15844bdc50e645185a912), [`2b920cc`](https://github.com/BeOnAuto/auto-engineer/commit/2b920cc6c90951d3fa6c1039cf883dd17e8d59c7), [`3dbb41e`](https://github.com/BeOnAuto/auto-engineer/commit/3dbb41edf2d1eb3a7110038aeb29952befc570da)]:
70
+ - @auto-engineer/message-bus@1.83.0
71
+ - @auto-engineer/narrative@1.83.0
72
+
3
73
  ## 1.82.0
4
74
 
5
75
  ### Minor Changes
@@ -3,4 +3,5 @@ import type { GwtCondition } from '../types';
3
3
  export declare function buildCommandGwtMapping(slice: Slice): Record<string, (GwtCondition & {
4
4
  failingFields?: string[];
5
5
  })[]>;
6
+ export declare function mergeCoFiringConditions(conditions: GwtCondition[]): GwtCondition[];
6
7
  //# sourceMappingURL=gwt.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gwt.d.ts","sourceRoot":"","sources":["../../../../src/codegen/extract/gwt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,KAAK,EAAwB,YAAY,EAAE,MAAM,UAAU,CAAC;AAGnE,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,YAAY,GAAG;IAAE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,EAAE,CAAC,CAQpH"}
1
+ {"version":3,"file":"gwt.d.ts","sourceRoot":"","sources":["../../../../src/codegen/extract/gwt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,KAAK,EAAwB,YAAY,EAAE,MAAM,UAAU,CAAC;AAGnE,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,YAAY,GAAG;IAAE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,EAAE,CAAC,CAQpH;AAiCD,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE,CA4BlF"}
@@ -28,8 +28,42 @@ function buildCommandMapping(gwtSpecs) {
28
28
  });
29
29
  }
30
30
  }
31
+ for (const command in mapping) {
32
+ mapping[command] = mergeCoFiringConditions(mapping[command]);
33
+ }
31
34
  return mapping;
32
35
  }
36
+ export function mergeCoFiringConditions(conditions) {
37
+ const merged = [];
38
+ const keyToIndex = new Map();
39
+ for (const condition of conditions) {
40
+ const isErrorCase = condition.then.some((t) => 'errorType' in t);
41
+ if (isErrorCase) {
42
+ merged.push(condition);
43
+ continue;
44
+ }
45
+ const key = stableKey(condition);
46
+ const existingIdx = keyToIndex.get(key);
47
+ if (existingIdx !== undefined) {
48
+ const existing = merged[existingIdx];
49
+ for (const t of condition.then) {
50
+ if ('eventRef' in t && !existing.then.some((e) => 'eventRef' in e && e.eventRef === t.eventRef)) {
51
+ existing.then.push(t);
52
+ }
53
+ }
54
+ }
55
+ else {
56
+ keyToIndex.set(key, merged.length);
57
+ merged.push({ ...condition, then: [...condition.then] });
58
+ }
59
+ }
60
+ return merged;
61
+ }
62
+ function stableKey(gwt) {
63
+ return JSON.stringify({ given: gwt.given, when: gwt.when }, (_, v) => v && typeof v === 'object' && !Array.isArray(v)
64
+ ? Object.fromEntries(Object.entries(v).sort(([a], [b]) => a.localeCompare(b)))
65
+ : v);
66
+ }
33
67
  function enhanceMapping(mapping) {
34
68
  const enhancedMapping = {};
35
69
  for (const command in mapping) {
@@ -1 +1 @@
1
- {"version":3,"file":"gwt.js","sourceRoot":"","sources":["../../../../src/codegen/extract/gwt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gwt.js","sourceRoot":"","sources":["../../../../src/codegen/extract/gwt.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAkD,MAAM,kBAAkB,CAAC;AAE5G,MAAM,UAAU,sBAAsB,CAAC,KAAY;IACjD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC9C,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,YAAY,CAAC,IAA8C;IAClE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,YAAY,IAAI,IAAI,CAAC;AACtD,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAgC;IAC3D,MAAM,OAAO,GAAmC,EAAE,CAAC;IAEnD,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;QACpC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtD,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAC1C,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;gBACpB,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,eAAe,EAAE,GAAG,CAAC,eAAe;aACrC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE,CAAC;QAC9B,OAAO,CAAC,OAAO,CAAC,GAAG,uBAAuB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,UAA0B;IAChE,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE7C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC;QACjE,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACvB,SAAS;QACX,CAAC;QAED,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;QACjC,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAExC,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;YACrC,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;gBAC/B,IAAI,UAAU,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAChG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,SAAS,EAAE,IAAI,EAAE,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,SAAS,CAAC,GAAiB;IAClC,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACnE,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9E,CAAC,CAAC,CAAC,CACN,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,OAAuC;IAC7D,MAAM,eAAe,GAAoE,EAAE,CAAC;IAE5F,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE,CAAC;QAC9B,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,cAAc,GAAG,yBAAyB,CAAC,UAAU,CAAC,CAAC;QAE7D,eAAe,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAClD,GAAG,GAAG;YACN,aAAa,EAAE,iBAAiB,CAAC,GAAG,EAAE,cAAc,CAAC;SACtD,CAAC,CAAC,CAAC;IACN,CAAC;IAED,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,SAAS,yBAAyB,CAAC,IAAoB;IACrD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC;IACpH,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,WAAW,CAAC;IACpH,OAAO,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3E,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAiB,EAAE,cAAuC;IACnF,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,WAAW,IAAI,CAAC,CAAC,CAAC;IAE/F,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IAEzB,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC;IAC5F,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAEjE,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;SAC5B,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE;QACrB,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACvC,OAAO,GAAG,KAAK,EAAE,IAAI,UAAU,KAAK,EAAE,IAAI,UAAU,KAAK,SAAS,CAAC;IACrE,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC"}
@@ -604,6 +604,156 @@ describe('spec.ts.ejs', () => {
604
604
  expect(contents).not.toContain('new Date(null)');
605
605
  });
606
606
 
607
+ it('should merge co-firing rules with same given+when into one test with combined events', async () => {
608
+ const spec: SpecsSchema = {
609
+ variant: 'specs',
610
+ narratives: [
611
+ {
612
+ name: 'Fitness flow',
613
+ slices: [
614
+ {
615
+ type: 'command',
616
+ name: 'Submit workout',
617
+ client: { specs: [] },
618
+ server: {
619
+ description: '',
620
+ specs: [
621
+ {
622
+ type: 'gherkin',
623
+ feature: 'Submit workout spec',
624
+ rules: [
625
+ {
626
+ name: 'Track exercise stats',
627
+ examples: [
628
+ {
629
+ name: 'Workout submitted updates stats',
630
+ steps: [
631
+ {
632
+ keyword: 'When',
633
+ text: 'SubmitWorkout',
634
+ docString: { workoutId: 'w1', exercise: 'squat' },
635
+ },
636
+ {
637
+ keyword: 'Then',
638
+ text: 'StatsUpdated',
639
+ docString: { workoutId: 'w1', count: 1 },
640
+ },
641
+ ],
642
+ },
643
+ ],
644
+ },
645
+ {
646
+ name: 'Track workout log',
647
+ examples: [
648
+ {
649
+ name: 'Workout submitted creates log',
650
+ steps: [
651
+ {
652
+ keyword: 'When',
653
+ text: 'SubmitWorkout',
654
+ docString: { workoutId: 'w1', exercise: 'squat' },
655
+ },
656
+ {
657
+ keyword: 'Then',
658
+ text: 'WorkoutLogged',
659
+ docString: { workoutId: 'w1', loggedAt: '2024-01-01T00:00:00Z' },
660
+ },
661
+ ],
662
+ },
663
+ ],
664
+ },
665
+ ],
666
+ },
667
+ ],
668
+ },
669
+ },
670
+ ],
671
+ },
672
+ ],
673
+ messages: [
674
+ {
675
+ type: 'command',
676
+ name: 'SubmitWorkout',
677
+ fields: [
678
+ { name: 'workoutId', type: 'string', required: true },
679
+ { name: 'exercise', type: 'string', required: true },
680
+ ],
681
+ },
682
+ {
683
+ type: 'event',
684
+ name: 'StatsUpdated',
685
+ source: 'internal',
686
+ fields: [
687
+ { name: 'workoutId', type: 'string', required: true },
688
+ { name: 'count', type: 'number', required: true },
689
+ ],
690
+ },
691
+ {
692
+ type: 'event',
693
+ name: 'WorkoutLogged',
694
+ source: 'internal',
695
+ fields: [
696
+ { name: 'workoutId', type: 'string', required: true },
697
+ { name: 'loggedAt', type: 'Date', required: true },
698
+ ],
699
+ },
700
+ ],
701
+ };
702
+
703
+ const { plans } = await generateScaffoldFilePlans(spec.narratives, spec.messages, undefined, 'src/domain/flows');
704
+ const specFile = plans.find((p) => p.outputPath.endsWith('specs.ts'));
705
+
706
+ expect(specFile?.contents).toMatchInlineSnapshot(`
707
+ "import { describe, it } from 'vitest';
708
+ import { DeciderSpecification } from '@event-driven-io/emmett';
709
+ import { decide } from './decide';
710
+ import { evolve } from './evolve';
711
+ import { initialState, State } from './state';
712
+ import type { StatsUpdated, WorkoutLogged } from './events';
713
+ import type { SubmitWorkout } from './commands';
714
+
715
+ describe('Track exercise stats', () => {
716
+ type Events = StatsUpdated | WorkoutLogged;
717
+
718
+ const given = DeciderSpecification.for<SubmitWorkout, Events, State>({
719
+ decide,
720
+ evolve,
721
+ initialState,
722
+ });
723
+
724
+ it('Workout submitted updates stats', () => {
725
+ given([])
726
+ .when({
727
+ type: 'SubmitWorkout',
728
+ data: {
729
+ workoutId: 'w1',
730
+ exercise: 'squat',
731
+ },
732
+ metadata: { now: new Date() },
733
+ })
734
+
735
+ .then([
736
+ {
737
+ type: 'StatsUpdated',
738
+ data: {
739
+ workoutId: 'w1',
740
+ count: 1,
741
+ },
742
+ },
743
+ {
744
+ type: 'WorkoutLogged',
745
+ data: {
746
+ workoutId: 'w1',
747
+ loggedAt: new Date('2024-01-01T00:00:00Z'),
748
+ },
749
+ },
750
+ ]);
751
+ });
752
+ });
753
+ "
754
+ `);
755
+ });
756
+
607
757
  it('should include business rule descriptions in decide.ts implementation comments', async () => {
608
758
  const spec: SpecsSchema = {
609
759
  variant: 'specs',
@@ -1569,9 +1569,9 @@ describe('projection.specs.ts.ejs', () => {
1569
1569
  * ## IMPLEMENTATION INSTRUCTIONS ##
1570
1570
  * Implement how this event updates the projection.
1571
1571
  *
1572
- * **IMPORTANT - Internal State Pattern:**
1572
+ * **Internal State Pattern (extends, never replaces the imported type):**
1573
1573
  * If you need to track state beyond the public WorkoutHistory type (e.g., to calculate
1574
- * aggregations, track previous values, etc.), follow this pattern:
1574
+ * aggregations, track previous values, etc.), you may EXTEND it with an interface (never replace it):
1575
1575
  *
1576
1576
  * 1. Define an extended interface BEFORE the projection:
1577
1577
  * interface InternalWorkoutHistory extends WorkoutHistory {
@@ -241,9 +241,9 @@ describe('projection.ts.ejs', () => {
241
241
  * ## IMPLEMENTATION INSTRUCTIONS ##
242
242
  * Implement how this event updates the projection.
243
243
  *
244
- * **IMPORTANT - Internal State Pattern:**
244
+ * **Internal State Pattern (extends, never replaces the imported type):**
245
245
  * If you need to track state beyond the public AvailableListings type (e.g., to calculate
246
- * aggregations, track previous values, etc.), follow this pattern:
246
+ * aggregations, track previous values, etc.), you may EXTEND it with an interface (never replace it):
247
247
  *
248
248
  * 1. Define an extended interface BEFORE the projection:
249
249
  * interface InternalAvailableListings extends AvailableListings {
@@ -574,26 +574,20 @@ describe('projection.ts.ejs', () => {
574
574
  *
575
575
  * CRITICAL: Use internal state to track individual entity information:
576
576
  *
577
- * 1. Access current state:
578
- * const current: InternalTodoSummary = document ?? { ...initialState, _entities: {} };
577
+ * 1. Access current state (guard _entities):
578
+ * const current: InternalTodoSummary = document ?? { ...initialState };
579
+ * if (!current._entities) current._entities = {};
579
580
  *
580
581
  * 2. Track entity changes:
581
- * // a) Extract the unique identifier that distinguishes this entity
582
- * // Examine event.data to find the ID field (often 'id' or '<entity>Id')
583
582
  * const entityId = event.data.[ENTITY_ID_FIELD];
584
- *
585
- * // b) Store/update entity state with relevant properties from event.data
586
- * // Include only fields needed for aggregation calculations
587
583
  * current._entities[entityId] = { [field]: value, ... };
588
584
  *
589
585
  * 3. Calculate aggregates from entity states:
590
- * const counts = Object.values(current._entities).reduce((acc, entity) => {
591
- * acc[entity.status] = (acc[entity.status] || 0) + 1;
592
- * return acc;
593
- * }, {});
586
+ * const aggregated = Object.values(current._entities).reduce(...);
594
587
  *
595
- * 4. Return with internal state:
596
- * return { ...publicFields, _entities: current._entities } as InternalTodoSummary;
588
+ * 4. Return via typed variable (preserves _entities for next event):
589
+ * const result: InternalTodoSummary = { ...publicFields, _entities: current._entities };
590
+ * return result;
597
591
 
598
592
  * Event (TodoAdded) fields: todoId: string, title: string
599
593
  */
@@ -127,26 +127,20 @@ case '<%= event.type %>': {
127
127
  *
128
128
  * CRITICAL: Use internal state to track individual entity information:
129
129
  *
130
- * 1. Access current state:
131
- * const current: Internal<%= pascalCase(targetName || 'State') %> = document ?? { ...initialState, _entities: {} };
130
+ * 1. Access current state (guard _entities):
131
+ * const current: Internal<%= pascalCase(targetName || 'State') %> = document ?? { ...initialState };
132
+ * if (!current._entities) current._entities = {};
132
133
  *
133
134
  * 2. Track entity changes:
134
- * // a) Extract the unique identifier that distinguishes this entity
135
- * // Examine event.data to find the ID field (often 'id' or '<entity>Id')
136
135
  * const entityId = event.data.[ENTITY_ID_FIELD];
137
- *
138
- * // b) Store/update entity state with relevant properties from event.data
139
- * // Include only fields needed for aggregation calculations
140
136
  * current._entities[entityId] = { [field]: value, ... };
141
137
  *
142
138
  * 3. Calculate aggregates from entity states:
143
- * const counts = Object.values(current._entities).reduce((acc, entity) => {
144
- * acc[entity.status] = (acc[entity.status] || 0) + 1;
145
- * return acc;
146
- * }, {});
139
+ * const aggregated = Object.values(current._entities).reduce(...);
147
140
  *
148
- * 4. Return with internal state:
149
- * return { ...publicFields, _entities: current._entities } as Internal<%= pascalCase(targetName || 'State') %>;
141
+ * 4. Return via typed variable (preserves _entities for next event):
142
+ * const result: Internal<%= pascalCase(targetName || 'State') %> = { ...publicFields, _entities: current._entities };
143
+ * return result;
150
144
  <% } else if (isCompositeKey) { -%>
151
145
  * **COMPOSITE KEY PROJECTION**
152
146
  *
@@ -173,9 +167,9 @@ case '<%= event.type %>': {
173
167
  <% } else { -%>
174
168
  * Implement how this event updates the projection.
175
169
  *
176
- * **IMPORTANT - Internal State Pattern:**
170
+ * **Internal State Pattern (extends, never replaces the imported type):**
177
171
  * If you need to track state beyond the public <%= pascalCase(targetName || 'State') %> type (e.g., to calculate
178
- * aggregations, track previous values, etc.), follow this pattern:
172
+ * aggregations, track previous values, etc.), you may EXTEND it with an interface (never replace it):
179
173
  *
180
174
  * 1. Define an extended interface BEFORE the projection:
181
175
  * interface Internal<%= pascalCase(targetName || 'State') %> extends <%= pascalCase(targetName || 'State') %> {
@@ -39,6 +39,7 @@ export type ServerGenerationFailedEvent = Event<'ServerGenerationFailed', {
39
39
  modelPath: string;
40
40
  destination: string;
41
41
  error: string;
42
+ model: Model;
42
43
  }>;
43
44
  export type SliceGeneratedEvent = Event<'SliceGenerated', {
44
45
  flowName: string;
@@ -52,6 +53,7 @@ export type SliceGenerationFailedEvent = Event<'SliceGenerationFailed', {
52
53
  sliceName: string;
53
54
  sliceType: string;
54
55
  error: string;
56
+ model: Model;
55
57
  }>;
56
58
  export type GenerateServerEvents = ServerGeneratedEvent | ServerGenerationFailedEvent | SliceGeneratedEvent | SliceGenerationFailedEvent;
57
59
  export declare const commandHandler: import("@auto-engineer/message-bus").CommandHandler;
@@ -1 +1 @@
1
- {"version":3,"file":"generate-server.d.ts","sourceRoot":"","sources":["../../../src/commands/generate-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generate-server.d.ts","sourceRoot":"","sources":["../../../src/commands/generate-server.ts"],"names":[],"mappings":"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"}
@@ -169,13 +169,14 @@ function stripAnsiCodes(text) {
169
169
  }
170
170
  function createServerFailureEvent(command, error) {
171
171
  debug('Server generation failed with error: %O', error);
172
- const errorMessage = error instanceof Error ? stripAnsiCodes(error.message) : 'Unknown error occurred';
172
+ const errorMessage = error instanceof Error ? stripAnsiCodes(error.stack ?? error.message) : 'Unknown error occurred';
173
173
  return {
174
174
  type: 'ServerGenerationFailed',
175
175
  data: {
176
176
  modelPath: deriveModelPath(command.data.destination),
177
177
  destination: command.data.destination,
178
178
  error: errorMessage,
179
+ model: command.data.model,
179
180
  },
180
181
  timestamp: new Date(),
181
182
  requestId: command.requestId,
@@ -215,6 +216,7 @@ export function emitSliceGenerationFailedForDuplicates(duplicateCommands, spec,
215
216
  sliceName: slice.name,
216
217
  sliceType: slice.type,
217
218
  error: `Duplicate command handler: '${dup.command}' is already registered in ${dup.existingFlow}/${dup.existingSlice}`,
219
+ model: spec,
218
220
  },
219
221
  timestamp: new Date(),
220
222
  requestId: command.requestId,
@@ -249,6 +251,7 @@ export function emitSliceGenerationFailedForFieldIssues(fieldIssues, spec, comma
249
251
  sliceName: slice.name,
250
252
  sliceType: slice.type,
251
253
  error: issue.error,
254
+ model: spec,
252
255
  },
253
256
  timestamp: new Date(),
254
257
  requestId: command.requestId,