@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,5 @@
1
+
2
+ > @auto-engineer/pipeline@0.0.1 build /home/runner/work/auto-engineer/auto-engineer/packages/pipeline
3
+ > tsc && tsx ../../scripts/fix-esm-imports.ts
4
+
5
+ Fixed ESM imports in dist/
package/LICENSE ADDED
@@ -0,0 +1,10 @@
1
+ Elastic License 2.0
2
+
3
+ Copyright 2024 Sam Hatoum
4
+
5
+ This software and associated documentation files (the "Software") are licensed under the Elastic License 2.0 (the "License"). You may not use this file except in compliance with the License.
6
+
7
+ You may obtain a copy of the License at:
8
+ https://www.elastic.co/licensing/elastic-license
9
+
10
+ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
package/claude.md ADDED
@@ -0,0 +1,160 @@
1
+ # Development Guide
2
+
3
+ ## Pomodoro + TDD + TCR + 100% Coverage
4
+
5
+ ```
6
+ ╔═════════════════════════════════════════════════════════════════════╗
7
+ ║ Red ───► Green ───►[TCR]───► Refactor ───►[TCR]───► Done ║
8
+ ║ ║
9
+ ║ [TCR] = test ──┬── pass ──► commit ──► continue ║
10
+ ║ └── fail ──► REVERT ──► RETHINK ║
11
+ ║ ║
12
+ ║ REVERT means STOP. Don't fix in place. ║
13
+ ║ RETHINK means try again with SMALLER STEPS OR try a NEW DESIGN ║
14
+ ╚═════════════════════════════════════════════════════════════════════╝
15
+ ```
16
+
17
+ ---
18
+
19
+ ## 🍅 Pomodoro Workflow
20
+
21
+ One atomic test + implementation per cycle (5-15 min).
22
+
23
+ **Planning a Pomodoro:**
24
+
25
+ - Independent, valuable, small, testable
26
+ - Define: value added, code surface size (S/M/L), complexity (S/M/L)
27
+ - 1-2 line approach description
28
+ - Create `pomodoro-plan.md` with sections: TODO / DONE
29
+ - Commit the plan with initial pomodoros
30
+
31
+ **Execution:**
32
+
33
+ 1. Write ONE failing test (Red)
34
+ 2. Write MINIMAL code to pass (Green)
35
+ 3. TCR: `test && commit || revert` (include plan update)
36
+ 4. Refactor if needed
37
+ 5. TCR: `test && commit || revert`
38
+ 6. Move pomodoro to DONE in the `pomodoro-plan.md`, commit with TCR
39
+
40
+ **TCR Command:**
41
+
42
+ ```bash
43
+ pnpm test --run && \
44
+ git add -A && git commit -m "<COMMITIZEN FORMAT>" || \
45
+ git checkout -- packages/<package>/
46
+ ```
47
+
48
+ ---
49
+
50
+ ## 🎯 TDD + 100% Coverage
51
+
52
+ All thresholds enforced at 100%. Tests drive the code.
53
+
54
+ | Do | Don't |
55
+ | ------------------------------- | ---------------------------------------- |
56
+ | Let tests drive all code | Write code without a failing test first |
57
+ | Add branches only when tested | Defensive `??`, `?:`, `if/else` untested |
58
+ | Test all error paths | Leave error handling unverified |
59
+ | Remove dead code after each run | Keep unused code "just in case" |
60
+
61
+ **NEVER Exclude Files to Dodge Coverage**
62
+
63
+ ```
64
+ ╔══════════════════════════════════════════════════════════════════════╗
65
+ ║ Excluding a file from coverage to avoid testing it is FORBIDDEN. ║
66
+ ║ "Hard to test" code (file system, dynamic imports, network, etc.) ║
67
+ ║ → Inject dependencies and mock them. That's what mocks are for. ║
68
+ ╚══════════════════════════════════════════════════════════════════════╝
69
+ ```
70
+
71
+ Coverage exclusions are ONLY for:
72
+
73
+ - Type-only files (interfaces, type definitions)
74
+ - Barrel exports (index.ts re-exports)
75
+ - Files that are genuinely 0% logic (pure declarations)
76
+
77
+ If you're tempted to exclude a file because it's "infrastructure" or "integration-focused" — STOP. The coverage requirement exists precisely to force testable design.
78
+
79
+ ---
80
+
81
+ ## 📝 Testing Guidelines
82
+
83
+ ### Test Title = Spec
84
+
85
+ The `it('should...')` title defines what you're testing. Body proves exactly that.
86
+
87
+ ```ts
88
+ // ✅ Title matches body
89
+ it('should reject empty usernames', () => {
90
+ const result = validate({ username: '' });
91
+ expect(result.valid).toBe(false);
92
+ });
93
+
94
+ // ❌ Body does more than title claims
95
+ it('should reject empty usernames', () => {
96
+ const result = validate({ username: '' });
97
+ expect(result.valid).toBe(false);
98
+ expect(result.errors).toContain('Username required'); // second spec
99
+ expect(logger.warn).toHaveBeenCalled(); // third spec
100
+ });
101
+ ```
102
+
103
+ ### Stubs Over Mocks
104
+
105
+ Use deterministic stubs. Mock at boundaries only when stubs aren't possible.
106
+
107
+ ```ts
108
+ // ✅ Deterministic stub
109
+ function createTestIdGenerator() {
110
+ let counter = 0;
111
+ return () => `test-id-${counter++}`;
112
+ }
113
+
114
+ it('creates user with generated id', () => {
115
+ const generateId = createTestIdGenerator();
116
+ const user = createUser({ name: 'Alice' }, generateId);
117
+ expect(user).toEqual({ id: 'test-id-0', name: 'Alice' });
118
+ });
119
+
120
+ // ❌ Mocking couples tests to implementation
121
+ it('creates user with generated id', () => {
122
+ const mockGenerateId = vi.fn().mockReturnValue('user-123');
123
+ const user = createUser({ name: 'Alice' }, mockGenerateId);
124
+ expect(mockGenerateId).toHaveBeenCalled();
125
+ });
126
+ ```
127
+
128
+ ### Assert Whole Objects
129
+
130
+ Catch structural changes. Don't cherry-pick properties.
131
+
132
+ ```ts
133
+ // ✅ Catches any unexpected changes
134
+ expect(result).toEqual({ type: 'USER', name: 'Alice', processed: true });
135
+
136
+ // ❌ Misses if extra properties added/removed
137
+ expect(result.type).toBe('USER');
138
+ expect(result.processed).toBe(true);
139
+ ```
140
+
141
+ ### Squint Test
142
+
143
+ All tests should look identical when you squint: **SETUP → EXECUTE → VERIFY**
144
+
145
+ ```ts
146
+ // ✅ Single clear structure
147
+ it('transforms user to uppercase', () => {
148
+ const input = { type: 'user' }; // SETUP
149
+ const result = transform(input); // EXECUTE
150
+ expect(result).toEqual({ type: 'USER' }); // VERIFY
151
+ });
152
+
153
+ // ❌ Multiple execute/verify = split into separate tests
154
+ it('does too many things', () => {
155
+ const result = transform({ type: 'user' });
156
+ expect(result.type).toBe('USER');
157
+ const updated = updateResult(result); // second execute
158
+ expect(updated.modified).toBe(true); // second verify
159
+ });
160
+ ```
@@ -0,0 +1,90 @@
1
+ import type { Event } from '@auto-engineer/message-bus';
2
+ import type { FailureContext, PipelineDescriptor, SuccessContext } from '../core/descriptors';
3
+ import type { CommandDispatch } from '../core/types';
4
+ import type { GraphIR } from '../graph/types';
5
+ import type { PipelineContext } from '../runtime/context';
6
+ export interface Pipeline {
7
+ descriptor: Readonly<PipelineDescriptor>;
8
+ toGraph(): GraphIR;
9
+ }
10
+ export interface PipelineBuilder {
11
+ version(v: string): PipelineBuilder;
12
+ description(d: string): PipelineBuilder;
13
+ key<E>(name: string, extractor: (event: E) => string): PipelineBuilder;
14
+ on(eventType: string): TriggerBuilder;
15
+ settled(commandTypes: readonly string[]): SettledBuilder;
16
+ build(): Pipeline;
17
+ }
18
+ export interface DispatchOptions<D extends readonly string[] = readonly string[]> {
19
+ dispatches: D;
20
+ }
21
+ export interface SettledBuilder {
22
+ dispatch<const D extends readonly string[]>(options: DispatchOptions<D>, handler: (events: Record<string, Event[]>, send: (commandType: D[number], data: unknown) => void) => void | {
23
+ persist: boolean;
24
+ }): SettledChain;
25
+ }
26
+ export interface SettledChain {
27
+ on(eventType: string): TriggerBuilder;
28
+ settled(commandTypes: readonly string[]): SettledBuilder;
29
+ build(): Pipeline;
30
+ }
31
+ export interface HandleOptions {
32
+ emits?: string[];
33
+ }
34
+ export interface TriggerBuilder {
35
+ when<E>(predicate: (event: E) => boolean): TriggerBuilder;
36
+ emit(commandType: string, data: unknown): EmitChain;
37
+ run(commands: CommandDispatch[]): RunBuilder;
38
+ run<E>(factory: (event: E) => CommandDispatch[]): RunBuilder;
39
+ forEach<E, T>(itemsSelector: (event: E) => T[]): ForEachBuilder<T>;
40
+ handle<E>(handler: (event: E, ctx: PipelineContext) => void | Promise<void>, options?: HandleOptions): HandleChain;
41
+ }
42
+ export interface ForEachBuilder<T> {
43
+ groupInto<P extends string>(phases: readonly P[], classifier: (item: T) => P): PhasedBuilder<T>;
44
+ }
45
+ export interface PhasedBuilder<T> {
46
+ process(commandType: string, dataFactory: (item: T) => Record<string, unknown>): PhasedChain<T>;
47
+ }
48
+ export interface CompletionConfig {
49
+ success: string;
50
+ failure: string;
51
+ itemKey: (event: Event) => string;
52
+ }
53
+ export interface PhasedChain<T> {
54
+ stopOnFailure(): PhasedChain<T>;
55
+ onComplete(config: CompletionConfig): PhasedTerminal;
56
+ build(): Pipeline;
57
+ }
58
+ export interface PhasedTerminal {
59
+ on(eventType: string): TriggerBuilder;
60
+ build(): Pipeline;
61
+ }
62
+ export interface RunBuilder {
63
+ awaitAll<E>(keyName: string, keyExtractor: (event: E) => string, options?: {
64
+ timeout?: number;
65
+ }): GatherBuilder;
66
+ }
67
+ export interface GatherBuilder {
68
+ onSuccess<T = unknown>(eventType: string, dataFactory: (ctx: SuccessContext<T>) => Record<string, unknown>): GatherChain;
69
+ onFailure<T = unknown>(eventType: string, dataFactory: (ctx: FailureContext<T>) => Record<string, unknown>): GatherChain;
70
+ on(eventType: string): TriggerBuilder;
71
+ build(): Pipeline;
72
+ }
73
+ export interface GatherChain {
74
+ onSuccess<T = unknown>(eventType: string, dataFactory: (ctx: SuccessContext<T>) => Record<string, unknown>): GatherChain;
75
+ onFailure<T = unknown>(eventType: string, dataFactory: (ctx: FailureContext<T>) => Record<string, unknown>): GatherChain;
76
+ on(eventType: string): TriggerBuilder;
77
+ build(): Pipeline;
78
+ }
79
+ export interface EmitChain {
80
+ emit(commandType: string, data: unknown): EmitChain;
81
+ on(eventType: string): TriggerBuilder;
82
+ settled(commandTypes: readonly string[]): SettledBuilder;
83
+ build(): Pipeline;
84
+ }
85
+ export interface HandleChain {
86
+ on(eventType: string): TriggerBuilder;
87
+ build(): Pipeline;
88
+ }
89
+ export declare function define(name: string): PipelineBuilder;
90
+ //# sourceMappingURL=define.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../../../src/builder/define.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,EAIV,cAAc,EAKd,kBAAkB,EAIlB,cAAc,EACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAa,OAAO,EAAa,MAAM,gBAAgB,CAAC;AACpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IACzC,OAAO,IAAI,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,eAAe,CAAC;IACpC,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,eAAe,CAAC;IACxC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,GAAG,eAAe,CAAC;IACvE,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAAC;IACtC,OAAO,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,GAAG,cAAc,CAAC;IACzD,KAAK,IAAI,QAAQ,CAAC;CACnB;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,SAAS,MAAM,EAAE,GAAG,SAAS,MAAM,EAAE;IAC9E,UAAU,EAAE,CAAC,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,CAAC,CAAC,SAAS,SAAS,MAAM,EAAE,EACxC,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,EAC3B,OAAO,EAAE,CACP,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAC/B,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,KAClD,IAAI,GAAG;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,GAC/B,YAAY,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAAC;IACtC,OAAO,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,GAAG,cAAc,CAAC;IACzD,KAAK,IAAI,QAAQ,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,cAAc,CAAC;IAC1D,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IACpD,GAAG,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,UAAU,CAAC;IAC7C,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,eAAe,EAAE,GAAG,UAAU,CAAC;IAC7D,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IACnE,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,eAAe,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,WAAW,CAAC;CACpH;AAED,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;CACjG;AAED,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;CACjG;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,aAAa,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;IAChC,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,cAAc,CAAC;IACrD,KAAK,IAAI,QAAQ,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAAC;IACtC,KAAK,IAAI,QAAQ,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,aAAa,CAAC;CACjH;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,CAAC,GAAG,OAAO,EACnB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/D,WAAW,CAAC;IACf,SAAS,CAAC,CAAC,GAAG,OAAO,EACnB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/D,WAAW,CAAC;IACf,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAAC;IACtC,KAAK,IAAI,QAAQ,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,CAAC,GAAG,OAAO,EACnB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/D,WAAW,CAAC;IACf,SAAS,CAAC,CAAC,GAAG,OAAO,EACnB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/D,WAAW,CAAC;IACf,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAAC;IACtC,KAAK,IAAI,QAAQ,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IACpD,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAAC;IACtC,OAAO,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,GAAG,cAAc,CAAC;IACzD,KAAK,IAAI,QAAQ,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAAC;IACtC,KAAK,IAAI,QAAQ,CAAC;CACnB;AAqjBD,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAEpD"}