@auto-engineer/pipeline 0.0.1

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 (270) hide show
  1. package/.turbo/turbo-build.log +5 -0
  2. package/LICENSE +10 -0
  3. package/claude.md +160 -0
  4. package/dist/src/builder/define.d.ts +90 -0
  5. package/dist/src/builder/define.d.ts.map +1 -0
  6. package/dist/src/builder/define.js +425 -0
  7. package/dist/src/builder/define.js.map +1 -0
  8. package/dist/src/builder/define.specs.d.ts +2 -0
  9. package/dist/src/builder/define.specs.d.ts.map +1 -0
  10. package/dist/src/builder/define.specs.js +435 -0
  11. package/dist/src/builder/define.specs.js.map +1 -0
  12. package/dist/src/config/pipeline-config.d.ts +13 -0
  13. package/dist/src/config/pipeline-config.d.ts.map +1 -0
  14. package/dist/src/config/pipeline-config.js +15 -0
  15. package/dist/src/config/pipeline-config.js.map +1 -0
  16. package/dist/src/core/descriptors.d.ts +84 -0
  17. package/dist/src/core/descriptors.d.ts.map +1 -0
  18. package/dist/src/core/descriptors.js +2 -0
  19. package/dist/src/core/descriptors.js.map +1 -0
  20. package/dist/src/core/descriptors.specs.d.ts +2 -0
  21. package/dist/src/core/descriptors.specs.d.ts.map +1 -0
  22. package/dist/src/core/descriptors.specs.js +24 -0
  23. package/dist/src/core/descriptors.specs.js.map +1 -0
  24. package/dist/src/core/types.d.ts +10 -0
  25. package/dist/src/core/types.d.ts.map +1 -0
  26. package/dist/src/core/types.js +4 -0
  27. package/dist/src/core/types.js.map +1 -0
  28. package/dist/src/core/types.specs.d.ts +2 -0
  29. package/dist/src/core/types.specs.d.ts.map +1 -0
  30. package/dist/src/core/types.specs.js +40 -0
  31. package/dist/src/core/types.specs.js.map +1 -0
  32. package/dist/src/graph/types.d.ts +17 -0
  33. package/dist/src/graph/types.d.ts.map +1 -0
  34. package/dist/src/graph/types.js +2 -0
  35. package/dist/src/graph/types.js.map +1 -0
  36. package/dist/src/graph/types.specs.d.ts +2 -0
  37. package/dist/src/graph/types.specs.d.ts.map +1 -0
  38. package/dist/src/graph/types.specs.js +148 -0
  39. package/dist/src/graph/types.specs.js.map +1 -0
  40. package/dist/src/index.d.ts +20 -0
  41. package/dist/src/index.d.ts.map +1 -0
  42. package/dist/src/index.js +12 -0
  43. package/dist/src/index.js.map +1 -0
  44. package/dist/src/logging/event-logger.d.ts +21 -0
  45. package/dist/src/logging/event-logger.d.ts.map +1 -0
  46. package/dist/src/logging/event-logger.js +31 -0
  47. package/dist/src/logging/event-logger.js.map +1 -0
  48. package/dist/src/logging/event-logger.specs.d.ts +2 -0
  49. package/dist/src/logging/event-logger.specs.d.ts.map +1 -0
  50. package/dist/src/logging/event-logger.specs.js +81 -0
  51. package/dist/src/logging/event-logger.specs.js.map +1 -0
  52. package/dist/src/plugins/handler-adapter.d.ts +5 -0
  53. package/dist/src/plugins/handler-adapter.d.ts.map +1 -0
  54. package/dist/src/plugins/handler-adapter.js +17 -0
  55. package/dist/src/plugins/handler-adapter.js.map +1 -0
  56. package/dist/src/plugins/handler-adapter.specs.d.ts +2 -0
  57. package/dist/src/plugins/handler-adapter.specs.d.ts.map +1 -0
  58. package/dist/src/plugins/handler-adapter.specs.js +129 -0
  59. package/dist/src/plugins/handler-adapter.specs.js.map +1 -0
  60. package/dist/src/plugins/plugin-loader.d.ts +25 -0
  61. package/dist/src/plugins/plugin-loader.d.ts.map +1 -0
  62. package/dist/src/plugins/plugin-loader.js +150 -0
  63. package/dist/src/plugins/plugin-loader.js.map +1 -0
  64. package/dist/src/plugins/plugin-loader.specs.d.ts +2 -0
  65. package/dist/src/plugins/plugin-loader.specs.d.ts.map +1 -0
  66. package/dist/src/plugins/plugin-loader.specs.js +246 -0
  67. package/dist/src/plugins/plugin-loader.specs.js.map +1 -0
  68. package/dist/src/runtime/await-tracker.d.ts +10 -0
  69. package/dist/src/runtime/await-tracker.d.ts.map +1 -0
  70. package/dist/src/runtime/await-tracker.js +42 -0
  71. package/dist/src/runtime/await-tracker.js.map +1 -0
  72. package/dist/src/runtime/await-tracker.specs.d.ts +2 -0
  73. package/dist/src/runtime/await-tracker.specs.d.ts.map +1 -0
  74. package/dist/src/runtime/await-tracker.specs.js +46 -0
  75. package/dist/src/runtime/await-tracker.specs.js.map +1 -0
  76. package/dist/src/runtime/context.d.ts +12 -0
  77. package/dist/src/runtime/context.d.ts.map +1 -0
  78. package/dist/src/runtime/context.js +2 -0
  79. package/dist/src/runtime/context.js.map +1 -0
  80. package/dist/src/runtime/context.specs.d.ts +2 -0
  81. package/dist/src/runtime/context.specs.d.ts.map +1 -0
  82. package/dist/src/runtime/context.specs.js +26 -0
  83. package/dist/src/runtime/context.specs.js.map +1 -0
  84. package/dist/src/runtime/event-command-map.d.ts +15 -0
  85. package/dist/src/runtime/event-command-map.d.ts.map +1 -0
  86. package/dist/src/runtime/event-command-map.js +26 -0
  87. package/dist/src/runtime/event-command-map.js.map +1 -0
  88. package/dist/src/runtime/event-command-map.specs.d.ts +2 -0
  89. package/dist/src/runtime/event-command-map.specs.d.ts.map +1 -0
  90. package/dist/src/runtime/event-command-map.specs.js +108 -0
  91. package/dist/src/runtime/event-command-map.specs.js.map +1 -0
  92. package/dist/src/runtime/phased-executor.d.ts +29 -0
  93. package/dist/src/runtime/phased-executor.d.ts.map +1 -0
  94. package/dist/src/runtime/phased-executor.js +164 -0
  95. package/dist/src/runtime/phased-executor.js.map +1 -0
  96. package/dist/src/runtime/phased-executor.specs.d.ts +2 -0
  97. package/dist/src/runtime/phased-executor.specs.d.ts.map +1 -0
  98. package/dist/src/runtime/phased-executor.specs.js +256 -0
  99. package/dist/src/runtime/phased-executor.specs.js.map +1 -0
  100. package/dist/src/runtime/pipeline-runtime.d.ts +17 -0
  101. package/dist/src/runtime/pipeline-runtime.d.ts.map +1 -0
  102. package/dist/src/runtime/pipeline-runtime.js +87 -0
  103. package/dist/src/runtime/pipeline-runtime.js.map +1 -0
  104. package/dist/src/runtime/pipeline-runtime.specs.d.ts +2 -0
  105. package/dist/src/runtime/pipeline-runtime.specs.d.ts.map +1 -0
  106. package/dist/src/runtime/pipeline-runtime.specs.js +192 -0
  107. package/dist/src/runtime/pipeline-runtime.specs.js.map +1 -0
  108. package/dist/src/runtime/settled-tracker.d.ts +42 -0
  109. package/dist/src/runtime/settled-tracker.d.ts.map +1 -0
  110. package/dist/src/runtime/settled-tracker.js +161 -0
  111. package/dist/src/runtime/settled-tracker.js.map +1 -0
  112. package/dist/src/runtime/settled-tracker.specs.d.ts +2 -0
  113. package/dist/src/runtime/settled-tracker.specs.d.ts.map +1 -0
  114. package/dist/src/runtime/settled-tracker.specs.js +361 -0
  115. package/dist/src/runtime/settled-tracker.specs.js.map +1 -0
  116. package/dist/src/server/full-orchestration.e2e.specs.d.ts +2 -0
  117. package/dist/src/server/full-orchestration.e2e.specs.d.ts.map +1 -0
  118. package/dist/src/server/full-orchestration.e2e.specs.js +561 -0
  119. package/dist/src/server/full-orchestration.e2e.specs.js.map +1 -0
  120. package/dist/src/server/pipeline-server.d.ts +59 -0
  121. package/dist/src/server/pipeline-server.d.ts.map +1 -0
  122. package/dist/src/server/pipeline-server.e2e.specs.d.ts +2 -0
  123. package/dist/src/server/pipeline-server.e2e.specs.d.ts.map +1 -0
  124. package/dist/src/server/pipeline-server.e2e.specs.js +381 -0
  125. package/dist/src/server/pipeline-server.e2e.specs.js.map +1 -0
  126. package/dist/src/server/pipeline-server.js +527 -0
  127. package/dist/src/server/pipeline-server.js.map +1 -0
  128. package/dist/src/server/pipeline-server.specs.d.ts +2 -0
  129. package/dist/src/server/pipeline-server.specs.d.ts.map +1 -0
  130. package/dist/src/server/pipeline-server.specs.js +662 -0
  131. package/dist/src/server/pipeline-server.specs.js.map +1 -0
  132. package/dist/src/server/sse-manager.d.ts +12 -0
  133. package/dist/src/server/sse-manager.d.ts.map +1 -0
  134. package/dist/src/server/sse-manager.js +63 -0
  135. package/dist/src/server/sse-manager.js.map +1 -0
  136. package/dist/src/server/sse-manager.specs.d.ts +2 -0
  137. package/dist/src/server/sse-manager.specs.d.ts.map +1 -0
  138. package/dist/src/server/sse-manager.specs.js +158 -0
  139. package/dist/src/server/sse-manager.specs.js.map +1 -0
  140. package/dist/src/testing/event-capture.d.ts +14 -0
  141. package/dist/src/testing/event-capture.d.ts.map +1 -0
  142. package/dist/src/testing/event-capture.js +55 -0
  143. package/dist/src/testing/event-capture.js.map +1 -0
  144. package/dist/src/testing/event-capture.specs.d.ts +2 -0
  145. package/dist/src/testing/event-capture.specs.d.ts.map +1 -0
  146. package/dist/src/testing/event-capture.specs.js +114 -0
  147. package/dist/src/testing/event-capture.specs.js.map +1 -0
  148. package/dist/src/testing/fixtures/kanban-full.pipeline.d.ts +7 -0
  149. package/dist/src/testing/fixtures/kanban-full.pipeline.d.ts.map +1 -0
  150. package/dist/src/testing/fixtures/kanban-full.pipeline.js +168 -0
  151. package/dist/src/testing/fixtures/kanban-full.pipeline.js.map +1 -0
  152. package/dist/src/testing/fixtures/kanban-full.pipeline.specs.d.ts +2 -0
  153. package/dist/src/testing/fixtures/kanban-full.pipeline.specs.d.ts.map +1 -0
  154. package/dist/src/testing/fixtures/kanban-full.pipeline.specs.js +263 -0
  155. package/dist/src/testing/fixtures/kanban-full.pipeline.specs.js.map +1 -0
  156. package/dist/src/testing/fixtures/kanban-todo.config.d.ts +3 -0
  157. package/dist/src/testing/fixtures/kanban-todo.config.d.ts.map +1 -0
  158. package/dist/src/testing/fixtures/kanban-todo.config.js +19 -0
  159. package/dist/src/testing/fixtures/kanban-todo.config.js.map +1 -0
  160. package/dist/src/testing/fixtures/kanban.pipeline.d.ts +5 -0
  161. package/dist/src/testing/fixtures/kanban.pipeline.d.ts.map +1 -0
  162. package/dist/src/testing/fixtures/kanban.pipeline.js +76 -0
  163. package/dist/src/testing/fixtures/kanban.pipeline.js.map +1 -0
  164. package/dist/src/testing/fixtures/kanban.pipeline.specs.d.ts +2 -0
  165. package/dist/src/testing/fixtures/kanban.pipeline.specs.d.ts.map +1 -0
  166. package/dist/src/testing/fixtures/kanban.pipeline.specs.js +29 -0
  167. package/dist/src/testing/fixtures/kanban.pipeline.specs.js.map +1 -0
  168. package/dist/src/testing/kanban-todo.e2e.specs.d.ts +2 -0
  169. package/dist/src/testing/kanban-todo.e2e.specs.d.ts.map +1 -0
  170. package/dist/src/testing/kanban-todo.e2e.specs.js +160 -0
  171. package/dist/src/testing/kanban-todo.e2e.specs.js.map +1 -0
  172. package/dist/src/testing/mock-handlers.d.ts +21 -0
  173. package/dist/src/testing/mock-handlers.d.ts.map +1 -0
  174. package/dist/src/testing/mock-handlers.js +34 -0
  175. package/dist/src/testing/mock-handlers.js.map +1 -0
  176. package/dist/src/testing/mock-handlers.specs.d.ts +2 -0
  177. package/dist/src/testing/mock-handlers.specs.d.ts.map +1 -0
  178. package/dist/src/testing/mock-handlers.specs.js +193 -0
  179. package/dist/src/testing/mock-handlers.specs.js.map +1 -0
  180. package/dist/src/testing/real-execution.e2e.specs.d.ts +2 -0
  181. package/dist/src/testing/real-execution.e2e.specs.d.ts.map +1 -0
  182. package/dist/src/testing/real-execution.e2e.specs.js +140 -0
  183. package/dist/src/testing/real-execution.e2e.specs.js.map +1 -0
  184. package/dist/src/testing/real-plugin.e2e.specs.d.ts +2 -0
  185. package/dist/src/testing/real-plugin.e2e.specs.d.ts.map +1 -0
  186. package/dist/src/testing/real-plugin.e2e.specs.js +65 -0
  187. package/dist/src/testing/real-plugin.e2e.specs.js.map +1 -0
  188. package/dist/src/testing/server-startup.e2e.specs.d.ts +2 -0
  189. package/dist/src/testing/server-startup.e2e.specs.d.ts.map +1 -0
  190. package/dist/src/testing/server-startup.e2e.specs.js +104 -0
  191. package/dist/src/testing/server-startup.e2e.specs.js.map +1 -0
  192. package/dist/src/testing/snapshot-compare.d.ts +18 -0
  193. package/dist/src/testing/snapshot-compare.d.ts.map +1 -0
  194. package/dist/src/testing/snapshot-compare.js +86 -0
  195. package/dist/src/testing/snapshot-compare.js.map +1 -0
  196. package/dist/src/testing/snapshot-compare.specs.d.ts +2 -0
  197. package/dist/src/testing/snapshot-compare.specs.d.ts.map +1 -0
  198. package/dist/src/testing/snapshot-compare.specs.js +112 -0
  199. package/dist/src/testing/snapshot-compare.specs.js.map +1 -0
  200. package/dist/src/testing/snapshot-sanitize.d.ts +8 -0
  201. package/dist/src/testing/snapshot-sanitize.d.ts.map +1 -0
  202. package/dist/src/testing/snapshot-sanitize.js +10 -0
  203. package/dist/src/testing/snapshot-sanitize.js.map +1 -0
  204. package/dist/src/testing/snapshot-sanitize.specs.d.ts +2 -0
  205. package/dist/src/testing/snapshot-sanitize.specs.d.ts.map +1 -0
  206. package/dist/src/testing/snapshot-sanitize.specs.js +104 -0
  207. package/dist/src/testing/snapshot-sanitize.specs.js.map +1 -0
  208. package/dist/tsconfig.tsbuildinfo +1 -0
  209. package/docs/testing-analysis.md +395 -0
  210. package/package.json +31 -0
  211. package/pipeline-api-new.md +1078 -0
  212. package/pomodoro-plan.md +651 -0
  213. package/scripts/run-kanban-e2e.ts +219 -0
  214. package/scripts/start-server.ts +64 -0
  215. package/snapshots/e2e-run-2025-12-22T15-52-03.json +613 -0
  216. package/snapshots/e2e-run-2025-12-22T16-51-30.json +699 -0
  217. package/src/builder/define.specs.ts +531 -0
  218. package/src/builder/define.ts +700 -0
  219. package/src/config/pipeline-config.ts +32 -0
  220. package/src/core/descriptors.specs.ts +28 -0
  221. package/src/core/descriptors.ts +99 -0
  222. package/src/core/types.specs.ts +44 -0
  223. package/src/core/types.ts +16 -0
  224. package/src/graph/types.specs.ts +176 -0
  225. package/src/graph/types.ts +19 -0
  226. package/src/index.ts +54 -0
  227. package/src/logging/event-logger.specs.ts +100 -0
  228. package/src/logging/event-logger.ts +50 -0
  229. package/src/plugins/handler-adapter.specs.ts +164 -0
  230. package/src/plugins/handler-adapter.ts +21 -0
  231. package/src/plugins/plugin-loader.specs.ts +295 -0
  232. package/src/plugins/plugin-loader.ts +202 -0
  233. package/src/runtime/await-tracker.specs.ts +52 -0
  234. package/src/runtime/await-tracker.ts +50 -0
  235. package/src/runtime/context.specs.ts +28 -0
  236. package/src/runtime/context.ts +13 -0
  237. package/src/runtime/event-command-map.specs.ts +136 -0
  238. package/src/runtime/event-command-map.ts +38 -0
  239. package/src/runtime/phased-executor.specs.ts +358 -0
  240. package/src/runtime/phased-executor.ts +224 -0
  241. package/src/runtime/pipeline-runtime.specs.ts +214 -0
  242. package/src/runtime/pipeline-runtime.ts +119 -0
  243. package/src/runtime/settled-tracker.specs.ts +448 -0
  244. package/src/runtime/settled-tracker.ts +237 -0
  245. package/src/server/full-orchestration.e2e.specs.ts +672 -0
  246. package/src/server/pipeline-server.e2e.specs.ts +505 -0
  247. package/src/server/pipeline-server.specs.ts +761 -0
  248. package/src/server/pipeline-server.ts +656 -0
  249. package/src/server/sse-manager.specs.ts +208 -0
  250. package/src/server/sse-manager.ts +79 -0
  251. package/src/testing/event-capture.specs.ts +143 -0
  252. package/src/testing/event-capture.ts +65 -0
  253. package/src/testing/fixtures/kanban-full.pipeline.specs.ts +337 -0
  254. package/src/testing/fixtures/kanban-full.pipeline.ts +225 -0
  255. package/src/testing/fixtures/kanban-todo.config.ts +19 -0
  256. package/src/testing/fixtures/kanban.pipeline.specs.ts +33 -0
  257. package/src/testing/fixtures/kanban.pipeline.ts +124 -0
  258. package/src/testing/kanban-todo.e2e.specs.ts +209 -0
  259. package/src/testing/mock-handlers.specs.ts +229 -0
  260. package/src/testing/mock-handlers.ts +58 -0
  261. package/src/testing/real-execution.e2e.specs.ts +193 -0
  262. package/src/testing/real-plugin.e2e.specs.ts +94 -0
  263. package/src/testing/server-startup.e2e.specs.ts +162 -0
  264. package/src/testing/snapshot-compare.specs.ts +136 -0
  265. package/src/testing/snapshot-compare.ts +106 -0
  266. package/src/testing/snapshot-sanitize.specs.ts +131 -0
  267. package/src/testing/snapshot-sanitize.ts +17 -0
  268. package/tsconfig.json +11 -0
  269. package/tsconfig.test.json +9 -0
  270. package/vitest.config.ts +29 -0
@@ -0,0 +1,395 @@
1
+ # Pipeline Package Testing Analysis
2
+
3
+ ## Source: CLI E2E Snapshots Analysis
4
+
5
+ This document captures the findings from analyzing the CLI's E2E test snapshots to inform how we test the pipeline package's orchestration capabilities.
6
+
7
+ ---
8
+
9
+ ## Snapshot Files Analyzed
10
+
11
+ | File | Purpose | Key Insights |
12
+ | ------------------------------ | ----------------------------------- | ------------------------------------------------------------------- |
13
+ | `registry.snapshot.json` | Expected `/registry` response | 11 event handlers, 16 command handlers, full metadata |
14
+ | `pipeline-graph.snapshot.json` | Expected `/pipeline` response | 11 nodes, 13 edges, `commandToEvents` and `eventToCommand` mappings |
15
+ | `event-stream.snapshot.json` | Full event sequence from workflow | ~200+ events showing scatter-gather, retry, phased execution |
16
+ | `golden-master.snapshot.json` | Complete baseline + execution state | Too large to load fully, contains status progression |
17
+
18
+ ---
19
+
20
+ ## Registry Response Shape
21
+
22
+ ```typescript
23
+ interface RegistryResponse {
24
+ eventHandlers: string[]; // ['SchemaExported', 'SliceGenerated', ...]
25
+ commandHandlers: string[]; // ['CheckClient', 'CheckLint', 'CheckTests', ...]
26
+ commandsWithMetadata: Array<{
27
+ id: string; // '@auto-engineer/narrative/export:schema'
28
+ name: string; // 'ExportSchema'
29
+ alias: string; // 'export:schema'
30
+ description: string; // 'Export flow schemas to context directory'
31
+ package: string; // '@auto-engineer/narrative'
32
+ version: string; // '0.13.1'
33
+ category: string; // 'export'
34
+ icon: string; // 'download'
35
+ }>;
36
+ folds: string[]; // [] (empty in kanban example)
37
+ }
38
+ ```
39
+
40
+ **Event Handlers (11):**
41
+
42
+ - SchemaExported, SliceGenerated, SliceImplemented, ServerGenerated
43
+ - IAGenerated, ClientGenerated, ComponentImplemented, ComponentImplementationFailed
44
+ - ClientChecked
45
+
46
+ **Command Handlers (16):**
47
+
48
+ - CheckClient, CheckLint, CheckTests, CheckTypes
49
+ - CopyExample, ExportSchema, GenerateClient, GenerateIA, GenerateServer
50
+ - ImplementClient, ImplementComponent, ImplementServer, ImplementSlice
51
+ - ImportDesignSystem, StartClient, StartServer
52
+
53
+ ---
54
+
55
+ ## Pipeline Graph Response Shape
56
+
57
+ ```typescript
58
+ interface PipelineResponse {
59
+ nodes: Array<{
60
+ id: string; // '@auto-engineer/narrative/export:schema'
61
+ name: string; // 'ExportSchema'
62
+ title: string; // 'Export Schema'
63
+ alias: string; // 'export:schema'
64
+ description: string;
65
+ package: string;
66
+ version: string;
67
+ category: string;
68
+ icon: string;
69
+ status: 'None' | 'idle' | 'running' | 'pass' | 'fail';
70
+ }>;
71
+ edges: Array<{
72
+ from: string; // '@auto-engineer/narrative/export:schema'
73
+ to: string; // '@auto-engineer/server-generator-apollo-emmett/generate:server'
74
+ }>;
75
+ commandToEvents: Record<string, string[]>; // { 'CheckTypes': ['TypeCheckPassed', 'TypeCheckFailed'] }
76
+ eventToCommand: Record<string, string>; // { 'TypeCheckPassed': 'CheckTypes' }
77
+ }
78
+ ```
79
+
80
+ **Key Edges (showing workflow):**
81
+
82
+ 1. `export:schema` → `generate:server`
83
+ 2. `generate:server` → `implement:slice`
84
+ 3. `implement:slice` → `check:tests`, `check:types`, `check:lint` (scatter)
85
+ 4. `check:tests`, `check:types`, `check:lint` → `implement:slice` (retry loop)
86
+ 5. `generate:server` → `generate:ia`, `start:server` (parallel)
87
+ 6. `generate:ia` → `generate:client`
88
+ 7. `generate:client` → `implement:component`, `start:client`
89
+
90
+ ---
91
+
92
+ ## Event Stream Analysis
93
+
94
+ ### Event Types and Counts (from partial analysis)
95
+
96
+ | Event Type | Count | Notes |
97
+ | ---------------------- | ----- | -------------------------------------------- |
98
+ | SchemaExported | 2 | Initial + possibly retry |
99
+ | SliceGenerated | 10+ | One per slice (5 slices × retries) |
100
+ | ServerGenerationFailed | 1 | pnpm install failure |
101
+ | ServerGenerated | 1 | Success after retry |
102
+ | SliceImplemented | 31 | Multiple implementations per slice (retries) |
103
+ | TypeCheckPassed | 24 | After successful checks |
104
+ | TypeCheckFailed | ? | Triggers retry |
105
+ | TestsCheckPassed | 31 | One per slice implementation |
106
+ | LintCheckPassed | 25 | One per slice implementation |
107
+ | ComponentImplemented | 58 | All components across phases |
108
+
109
+ ### Workflow Sequence Pattern
110
+
111
+ ```
112
+ 1. ExportSchema command
113
+ └── SchemaExported event
114
+
115
+ 2. SchemaExported triggers GenerateServer
116
+ └── SliceGenerated × N (one per slice)
117
+ └── ServerGenerated (when all slices generated)
118
+
119
+ 3. SliceGenerated triggers ImplementSlice (per slice)
120
+ └── SliceImplemented event
121
+
122
+ 4. SliceImplemented triggers SCATTER:
123
+ ├── CheckTests → TestsCheckPassed | TestsCheckFailed
124
+ ├── CheckTypes → TypeCheckPassed | TypeCheckFailed
125
+ └── CheckLint → LintCheckPassed | LintCheckFailed
126
+
127
+ 5. on.settled(['CheckTests', 'CheckTypes', 'CheckLint']) GATHER:
128
+ └── If any failed AND attempts < MAX_RETRIES:
129
+ └── ImplementSlice with error context → goto step 3
130
+ └── If all passed OR max retries exceeded:
131
+ └── Continue (no dispatch)
132
+
133
+ 6. ServerGenerated triggers PARALLEL:
134
+ ├── GenerateIA → IAGenerated
135
+ └── StartServer → ServerStarted
136
+
137
+ 7. IAGenerated triggers GenerateClient
138
+ └── ClientGenerated event (with components list)
139
+
140
+ 8. ClientGenerated triggers PHASED EXECUTION:
141
+ Phase 1: molecules (parallel)
142
+ └── ImplementComponent × N → ComponentImplemented × N
143
+ Phase 2: organisms (parallel, after ALL molecules complete)
144
+ └── ImplementComponent × N → ComponentImplemented × N
145
+ Phase 3: pages (parallel, after ALL organisms complete)
146
+ └── ImplementComponent × N → ComponentImplemented × N
147
+ ```
148
+
149
+ ---
150
+
151
+ ## Orchestration Patterns to Test
152
+
153
+ ### 1. Scatter-Gather Pattern
154
+
155
+ **Trigger:** `SliceImplemented` event
156
+ **Scatter:** Dispatch `CheckTests`, `CheckTypes`, `CheckLint` in parallel
157
+ **Gather:** Wait for all 3 to complete (via correlationId tracking)
158
+ **Decision:** Fire `ImplementSlice` with errors if any check failed
159
+
160
+ ```typescript
161
+ // Test scenario
162
+ it('should scatter 3 checks and gather results', async () => {
163
+ // Send ImplementSlice command
164
+ await dispatchCommand('ImplementSlice', { slicePath: './test-slice' });
165
+
166
+ // Wait for SliceImplemented event
167
+ await waitForEvent('SliceImplemented');
168
+
169
+ // Verify all 3 checks were dispatched
170
+ const messages = await getMessages();
171
+ const checkCommands = messages.filter(
172
+ (m) => m.messageType === 'command' && ['CheckTests', 'CheckTypes', 'CheckLint'].includes(m.message.type),
173
+ );
174
+ expect(checkCommands).toHaveLength(3);
175
+
176
+ // Verify same correlationId
177
+ const correlationIds = new Set(checkCommands.map((c) => c.message.correlationId));
178
+ expect(correlationIds.size).toBe(1);
179
+ });
180
+ ```
181
+
182
+ ### 2. Retry Loop Pattern
183
+
184
+ **Trigger:** `on.settled` handler fires with failures
185
+ **Action:** Dispatch `ImplementSlice` with error context
186
+ **Limit:** MAX_RETRIES = 4
187
+
188
+ ```typescript
189
+ // Test scenario
190
+ it('should retry up to MAX_RETRIES times on failure', async () => {
191
+ // Configure CheckTypes to fail first 3 times
192
+ mockHandler('CheckTypes', (cmd, attempt) =>
193
+ attempt < 3 ? { type: 'TypeCheckFailed', data: { errors: 'TS2322' } } : { type: 'TypeCheckPassed', data: {} },
194
+ );
195
+
196
+ await dispatchCommand('ImplementSlice', { slicePath: './test' });
197
+ await waitForSettled(10000);
198
+
199
+ const events = await getEvents();
200
+ const typeCheckEvents = events.filter((e) => e.type.includes('TypeCheck'));
201
+
202
+ // Should have 3 failures then 1 success
203
+ expect(typeCheckEvents.map((e) => e.type)).toEqual([
204
+ 'TypeCheckFailed',
205
+ 'TypeCheckFailed',
206
+ 'TypeCheckFailed',
207
+ 'TypeCheckPassed',
208
+ ]);
209
+ });
210
+
211
+ it('should stop retrying after MAX_RETRIES', async () => {
212
+ // Configure CheckTypes to always fail
213
+ mockHandler('CheckTypes', () => ({ type: 'TypeCheckFailed', data: {} }));
214
+
215
+ await dispatchCommand('ImplementSlice', { slicePath: './test' });
216
+ await waitForSettled(10000);
217
+
218
+ const events = await getEvents();
219
+ const implementSliceCommands = events.filter((e) => e.type === 'SliceImplemented');
220
+
221
+ // Should have MAX_RETRIES + 1 attempts (initial + retries)
222
+ expect(implementSliceCommands.length).toBeLessThanOrEqual(5); // 1 + MAX_RETRIES
223
+ });
224
+ ```
225
+
226
+ ### 3. Phased Execution Pattern
227
+
228
+ **Trigger:** `ClientGenerated` event with components list
229
+ **Phases:** `['molecule', 'organism', 'page']`
230
+ **Gate:** All items in phase N must complete before phase N+1 starts
231
+
232
+ ```typescript
233
+ // Test scenario
234
+ it('should execute phases in order', async () => {
235
+ const dispatchOrder: string[] = [];
236
+
237
+ mockHandler('ImplementComponent', (cmd) => {
238
+ dispatchOrder.push(cmd.data.componentType);
239
+ return { type: 'ComponentImplemented', data: cmd.data };
240
+ });
241
+
242
+ await dispatchCommand('GenerateClient', {});
243
+ // Mock returns: { components: [
244
+ // { type: 'molecule', filePath: 'm1.tsx' },
245
+ // { type: 'organism', filePath: 'o1.tsx' },
246
+ // { type: 'page', filePath: 'p1.tsx' },
247
+ // ]}
248
+
249
+ await waitForAllComponentsImplemented(10000);
250
+
251
+ // Verify order: all molecules before any organisms
252
+ const moleculeIndices = dispatchOrder.map((t, i) => (t === 'molecule' ? i : -1)).filter((i) => i >= 0);
253
+ const organismIndices = dispatchOrder.map((t, i) => (t === 'organism' ? i : -1)).filter((i) => i >= 0);
254
+
255
+ expect(Math.max(...moleculeIndices)).toBeLessThan(Math.min(...organismIndices));
256
+ });
257
+ ```
258
+
259
+ ### 4. Parallel Dispatch Pattern
260
+
261
+ **Trigger:** `ServerGenerated` event
262
+ **Action:** Dispatch `GenerateIA` AND `StartServer` simultaneously
263
+
264
+ ```typescript
265
+ // Test scenario
266
+ it('should dispatch parallel commands from single event', async () => {
267
+ await dispatchCommand('GenerateServer', { modelPath: './schema.json' });
268
+ await waitForEvent('ServerGenerated');
269
+
270
+ const messages = await getMessages();
271
+ const commandsAfterServerGenerated = messages
272
+ .filter((m) => m.messageType === 'command')
273
+ .filter((m) => ['GenerateIA', 'StartServer'].includes(m.message.type));
274
+
275
+ expect(commandsAfterServerGenerated).toHaveLength(2);
276
+
277
+ // Verify same correlationId (dispatched from same trigger)
278
+ const correlationIds = new Set(commandsAfterServerGenerated.map((c) => c.message.correlationId));
279
+ expect(correlationIds.size).toBe(1);
280
+ });
281
+ ```
282
+
283
+ ---
284
+
285
+ ## Testing Approach for Pipeline Package
286
+
287
+ ### Unit Tests (per component)
288
+
289
+ 1. **SettledTracker** - Track commands, fire on completion
290
+ 2. **EventCommandMapper** - Map events to source commands
291
+ 3. **PhasedExecutor** - Gate phases, track completion
292
+ 4. **EventLogger** - Write events to disk
293
+
294
+ ### Integration Tests (component combinations)
295
+
296
+ 1. **Runtime + SettledTracker** - Handler dispatches command, tracker fires
297
+ 2. **Server + Runtime + Tracker** - HTTP request triggers full flow
298
+ 3. **Server + Logger** - Events written to disk
299
+
300
+ ### E2E Tests (full workflow)
301
+
302
+ 1. **Scatter-Gather Test** - SliceImplemented → 3 checks → gather
303
+ 2. **Retry Test** - Failed checks → retry loop → success
304
+ 3. **Phased Test** - ClientGenerated → molecules → organisms → pages
305
+ 4. **Snapshot Test** - Compare event sequence to CLI snapshot
306
+
307
+ ### Mock Handlers
308
+
309
+ ```typescript
310
+ interface MockHandlerConfig {
311
+ [commandType: string]: (command: Command, attempt: number) => Event | Event[];
312
+ }
313
+
314
+ function createMockHandlers(config: MockHandlerConfig): CommandHandler[] {
315
+ const attemptCounts = new Map<string, number>();
316
+
317
+ return Object.entries(config).map(([name, factory]) => ({
318
+ name,
319
+ events: inferEventsFromFactory(factory),
320
+ handle: async (cmd: Command) => {
321
+ const key = `${name}:${JSON.stringify(cmd.data)}`;
322
+ const attempt = (attemptCounts.get(key) ?? 0) + 1;
323
+ attemptCounts.set(key, attempt);
324
+ return factory(cmd, attempt);
325
+ },
326
+ }));
327
+ }
328
+ ```
329
+
330
+ ---
331
+
332
+ ## Snapshot Comparison Strategy
333
+
334
+ ### Event Type Sequence (order-aware)
335
+
336
+ ```typescript
337
+ interface SequenceComparisonResult {
338
+ match: boolean;
339
+ missing: string[]; // Events in expected but not actual
340
+ extra: string[]; // Events in actual but not expected
341
+ orderViolations: Array<{
342
+ // Events out of expected order
343
+ event: string;
344
+ expectedAfter: string;
345
+ actuallyBefore: string;
346
+ }>;
347
+ }
348
+ ```
349
+
350
+ ### Event Count Validation (order-agnostic)
351
+
352
+ ```typescript
353
+ interface CountComparisonResult {
354
+ match: boolean;
355
+ mismatches: Array<{
356
+ eventType: string;
357
+ expected: number;
358
+ actual: number;
359
+ }>;
360
+ }
361
+ ```
362
+
363
+ ### Causal Chain Validation
364
+
365
+ Verify that events respect causal dependencies:
366
+
367
+ - `SchemaExported` BEFORE `SliceGenerated`
368
+ - `SliceImplemented` BEFORE `TestsCheckPassed`
369
+ - `ComponentImplemented(molecule)` BEFORE `ComponentImplemented(organism)`
370
+
371
+ ```typescript
372
+ const causalDependencies: [string, string][] = [
373
+ ['SchemaExported', 'SliceGenerated'],
374
+ ['SliceGenerated', 'SliceImplemented'],
375
+ ['SliceImplemented', 'TestsCheckPassed'],
376
+ ['SliceImplemented', 'TypeCheckPassed'],
377
+ ['SliceImplemented', 'LintCheckPassed'],
378
+ ['ServerGenerated', 'IAGenerated'],
379
+ ['IAGenerated', 'ClientGenerated'],
380
+ ['ClientGenerated', 'ComponentImplemented'],
381
+ ];
382
+ ```
383
+
384
+ ---
385
+
386
+ ## File Locations
387
+
388
+ | Test Type | Location |
389
+ | ----------------- | ------------------------------------------------- |
390
+ | Unit tests | `packages/pipeline/src/**/*.specs.ts` |
391
+ | Integration tests | `packages/pipeline/src/**/*.integration.specs.ts` |
392
+ | E2E tests | `packages/pipeline/src/server/*.e2e.specs.ts` |
393
+ | Snapshot fixtures | `packages/pipeline/src/testing/__snapshots__/` |
394
+ | Mock handlers | `packages/pipeline/src/testing/mock-handlers.ts` |
395
+ | Test utilities | `packages/pipeline/src/testing/helpers.ts` |
package/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@auto-engineer/pipeline",
3
+ "type": "module",
4
+ "main": "./dist/src/index.js",
5
+ "types": "./dist/src/index.d.ts",
6
+ "dependencies": {
7
+ "cors": "^2.8.5",
8
+ "dotenv": "^16.4.5",
9
+ "express": "^4.18.0",
10
+ "get-port": "^7.1.0",
11
+ "nanoid": "^5.0.0",
12
+ "@auto-engineer/message-store": "0.13.3",
13
+ "@auto-engineer/message-bus": "0.13.3"
14
+ },
15
+ "devDependencies": {
16
+ "@types/cors": "^2.8.17",
17
+ "@types/express": "^5.0.0"
18
+ },
19
+ "publishConfig": {
20
+ "access": "public"
21
+ },
22
+ "version": "0.0.1",
23
+ "scripts": {
24
+ "build": "tsc && tsx ../../scripts/fix-esm-imports.ts",
25
+ "test": "vitest run --reporter=dot",
26
+ "test:e2e": "vitest run --reporter=dot --include 'src/**/*.e2e.specs.ts'",
27
+ "type-check": "tsc --noEmit",
28
+ "e2e:kanban": "tsx scripts/run-kanban-e2e.ts",
29
+ "serve": "tsx --watch scripts/start-server.ts"
30
+ }
31
+ }