@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.
- package/.turbo/turbo-build.log +5 -0
- package/LICENSE +10 -0
- package/claude.md +160 -0
- package/dist/src/builder/define.d.ts +90 -0
- package/dist/src/builder/define.d.ts.map +1 -0
- package/dist/src/builder/define.js +425 -0
- package/dist/src/builder/define.js.map +1 -0
- package/dist/src/builder/define.specs.d.ts +2 -0
- package/dist/src/builder/define.specs.d.ts.map +1 -0
- package/dist/src/builder/define.specs.js +435 -0
- package/dist/src/builder/define.specs.js.map +1 -0
- package/dist/src/config/pipeline-config.d.ts +13 -0
- package/dist/src/config/pipeline-config.d.ts.map +1 -0
- package/dist/src/config/pipeline-config.js +15 -0
- package/dist/src/config/pipeline-config.js.map +1 -0
- package/dist/src/core/descriptors.d.ts +84 -0
- package/dist/src/core/descriptors.d.ts.map +1 -0
- package/dist/src/core/descriptors.js +2 -0
- package/dist/src/core/descriptors.js.map +1 -0
- package/dist/src/core/descriptors.specs.d.ts +2 -0
- package/dist/src/core/descriptors.specs.d.ts.map +1 -0
- package/dist/src/core/descriptors.specs.js +24 -0
- package/dist/src/core/descriptors.specs.js.map +1 -0
- package/dist/src/core/types.d.ts +10 -0
- package/dist/src/core/types.d.ts.map +1 -0
- package/dist/src/core/types.js +4 -0
- package/dist/src/core/types.js.map +1 -0
- package/dist/src/core/types.specs.d.ts +2 -0
- package/dist/src/core/types.specs.d.ts.map +1 -0
- package/dist/src/core/types.specs.js +40 -0
- package/dist/src/core/types.specs.js.map +1 -0
- package/dist/src/graph/types.d.ts +17 -0
- package/dist/src/graph/types.d.ts.map +1 -0
- package/dist/src/graph/types.js +2 -0
- package/dist/src/graph/types.js.map +1 -0
- package/dist/src/graph/types.specs.d.ts +2 -0
- package/dist/src/graph/types.specs.d.ts.map +1 -0
- package/dist/src/graph/types.specs.js +148 -0
- package/dist/src/graph/types.specs.js.map +1 -0
- package/dist/src/index.d.ts +20 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +12 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/logging/event-logger.d.ts +21 -0
- package/dist/src/logging/event-logger.d.ts.map +1 -0
- package/dist/src/logging/event-logger.js +31 -0
- package/dist/src/logging/event-logger.js.map +1 -0
- package/dist/src/logging/event-logger.specs.d.ts +2 -0
- package/dist/src/logging/event-logger.specs.d.ts.map +1 -0
- package/dist/src/logging/event-logger.specs.js +81 -0
- package/dist/src/logging/event-logger.specs.js.map +1 -0
- package/dist/src/plugins/handler-adapter.d.ts +5 -0
- package/dist/src/plugins/handler-adapter.d.ts.map +1 -0
- package/dist/src/plugins/handler-adapter.js +17 -0
- package/dist/src/plugins/handler-adapter.js.map +1 -0
- package/dist/src/plugins/handler-adapter.specs.d.ts +2 -0
- package/dist/src/plugins/handler-adapter.specs.d.ts.map +1 -0
- package/dist/src/plugins/handler-adapter.specs.js +129 -0
- package/dist/src/plugins/handler-adapter.specs.js.map +1 -0
- package/dist/src/plugins/plugin-loader.d.ts +25 -0
- package/dist/src/plugins/plugin-loader.d.ts.map +1 -0
- package/dist/src/plugins/plugin-loader.js +150 -0
- package/dist/src/plugins/plugin-loader.js.map +1 -0
- package/dist/src/plugins/plugin-loader.specs.d.ts +2 -0
- package/dist/src/plugins/plugin-loader.specs.d.ts.map +1 -0
- package/dist/src/plugins/plugin-loader.specs.js +246 -0
- package/dist/src/plugins/plugin-loader.specs.js.map +1 -0
- package/dist/src/runtime/await-tracker.d.ts +10 -0
- package/dist/src/runtime/await-tracker.d.ts.map +1 -0
- package/dist/src/runtime/await-tracker.js +42 -0
- package/dist/src/runtime/await-tracker.js.map +1 -0
- package/dist/src/runtime/await-tracker.specs.d.ts +2 -0
- package/dist/src/runtime/await-tracker.specs.d.ts.map +1 -0
- package/dist/src/runtime/await-tracker.specs.js +46 -0
- package/dist/src/runtime/await-tracker.specs.js.map +1 -0
- package/dist/src/runtime/context.d.ts +12 -0
- package/dist/src/runtime/context.d.ts.map +1 -0
- package/dist/src/runtime/context.js +2 -0
- package/dist/src/runtime/context.js.map +1 -0
- package/dist/src/runtime/context.specs.d.ts +2 -0
- package/dist/src/runtime/context.specs.d.ts.map +1 -0
- package/dist/src/runtime/context.specs.js +26 -0
- package/dist/src/runtime/context.specs.js.map +1 -0
- package/dist/src/runtime/event-command-map.d.ts +15 -0
- package/dist/src/runtime/event-command-map.d.ts.map +1 -0
- package/dist/src/runtime/event-command-map.js +26 -0
- package/dist/src/runtime/event-command-map.js.map +1 -0
- package/dist/src/runtime/event-command-map.specs.d.ts +2 -0
- package/dist/src/runtime/event-command-map.specs.d.ts.map +1 -0
- package/dist/src/runtime/event-command-map.specs.js +108 -0
- package/dist/src/runtime/event-command-map.specs.js.map +1 -0
- package/dist/src/runtime/phased-executor.d.ts +29 -0
- package/dist/src/runtime/phased-executor.d.ts.map +1 -0
- package/dist/src/runtime/phased-executor.js +164 -0
- package/dist/src/runtime/phased-executor.js.map +1 -0
- package/dist/src/runtime/phased-executor.specs.d.ts +2 -0
- package/dist/src/runtime/phased-executor.specs.d.ts.map +1 -0
- package/dist/src/runtime/phased-executor.specs.js +256 -0
- package/dist/src/runtime/phased-executor.specs.js.map +1 -0
- package/dist/src/runtime/pipeline-runtime.d.ts +17 -0
- package/dist/src/runtime/pipeline-runtime.d.ts.map +1 -0
- package/dist/src/runtime/pipeline-runtime.js +87 -0
- package/dist/src/runtime/pipeline-runtime.js.map +1 -0
- package/dist/src/runtime/pipeline-runtime.specs.d.ts +2 -0
- package/dist/src/runtime/pipeline-runtime.specs.d.ts.map +1 -0
- package/dist/src/runtime/pipeline-runtime.specs.js +192 -0
- package/dist/src/runtime/pipeline-runtime.specs.js.map +1 -0
- package/dist/src/runtime/settled-tracker.d.ts +42 -0
- package/dist/src/runtime/settled-tracker.d.ts.map +1 -0
- package/dist/src/runtime/settled-tracker.js +161 -0
- package/dist/src/runtime/settled-tracker.js.map +1 -0
- package/dist/src/runtime/settled-tracker.specs.d.ts +2 -0
- package/dist/src/runtime/settled-tracker.specs.d.ts.map +1 -0
- package/dist/src/runtime/settled-tracker.specs.js +361 -0
- package/dist/src/runtime/settled-tracker.specs.js.map +1 -0
- package/dist/src/server/full-orchestration.e2e.specs.d.ts +2 -0
- package/dist/src/server/full-orchestration.e2e.specs.d.ts.map +1 -0
- package/dist/src/server/full-orchestration.e2e.specs.js +561 -0
- package/dist/src/server/full-orchestration.e2e.specs.js.map +1 -0
- package/dist/src/server/pipeline-server.d.ts +59 -0
- package/dist/src/server/pipeline-server.d.ts.map +1 -0
- package/dist/src/server/pipeline-server.e2e.specs.d.ts +2 -0
- package/dist/src/server/pipeline-server.e2e.specs.d.ts.map +1 -0
- package/dist/src/server/pipeline-server.e2e.specs.js +381 -0
- package/dist/src/server/pipeline-server.e2e.specs.js.map +1 -0
- package/dist/src/server/pipeline-server.js +527 -0
- package/dist/src/server/pipeline-server.js.map +1 -0
- package/dist/src/server/pipeline-server.specs.d.ts +2 -0
- package/dist/src/server/pipeline-server.specs.d.ts.map +1 -0
- package/dist/src/server/pipeline-server.specs.js +662 -0
- package/dist/src/server/pipeline-server.specs.js.map +1 -0
- package/dist/src/server/sse-manager.d.ts +12 -0
- package/dist/src/server/sse-manager.d.ts.map +1 -0
- package/dist/src/server/sse-manager.js +63 -0
- package/dist/src/server/sse-manager.js.map +1 -0
- package/dist/src/server/sse-manager.specs.d.ts +2 -0
- package/dist/src/server/sse-manager.specs.d.ts.map +1 -0
- package/dist/src/server/sse-manager.specs.js +158 -0
- package/dist/src/server/sse-manager.specs.js.map +1 -0
- package/dist/src/testing/event-capture.d.ts +14 -0
- package/dist/src/testing/event-capture.d.ts.map +1 -0
- package/dist/src/testing/event-capture.js +55 -0
- package/dist/src/testing/event-capture.js.map +1 -0
- package/dist/src/testing/event-capture.specs.d.ts +2 -0
- package/dist/src/testing/event-capture.specs.d.ts.map +1 -0
- package/dist/src/testing/event-capture.specs.js +114 -0
- package/dist/src/testing/event-capture.specs.js.map +1 -0
- package/dist/src/testing/fixtures/kanban-full.pipeline.d.ts +7 -0
- package/dist/src/testing/fixtures/kanban-full.pipeline.d.ts.map +1 -0
- package/dist/src/testing/fixtures/kanban-full.pipeline.js +168 -0
- package/dist/src/testing/fixtures/kanban-full.pipeline.js.map +1 -0
- package/dist/src/testing/fixtures/kanban-full.pipeline.specs.d.ts +2 -0
- package/dist/src/testing/fixtures/kanban-full.pipeline.specs.d.ts.map +1 -0
- package/dist/src/testing/fixtures/kanban-full.pipeline.specs.js +263 -0
- package/dist/src/testing/fixtures/kanban-full.pipeline.specs.js.map +1 -0
- package/dist/src/testing/fixtures/kanban-todo.config.d.ts +3 -0
- package/dist/src/testing/fixtures/kanban-todo.config.d.ts.map +1 -0
- package/dist/src/testing/fixtures/kanban-todo.config.js +19 -0
- package/dist/src/testing/fixtures/kanban-todo.config.js.map +1 -0
- package/dist/src/testing/fixtures/kanban.pipeline.d.ts +5 -0
- package/dist/src/testing/fixtures/kanban.pipeline.d.ts.map +1 -0
- package/dist/src/testing/fixtures/kanban.pipeline.js +76 -0
- package/dist/src/testing/fixtures/kanban.pipeline.js.map +1 -0
- package/dist/src/testing/fixtures/kanban.pipeline.specs.d.ts +2 -0
- package/dist/src/testing/fixtures/kanban.pipeline.specs.d.ts.map +1 -0
- package/dist/src/testing/fixtures/kanban.pipeline.specs.js +29 -0
- package/dist/src/testing/fixtures/kanban.pipeline.specs.js.map +1 -0
- package/dist/src/testing/kanban-todo.e2e.specs.d.ts +2 -0
- package/dist/src/testing/kanban-todo.e2e.specs.d.ts.map +1 -0
- package/dist/src/testing/kanban-todo.e2e.specs.js +160 -0
- package/dist/src/testing/kanban-todo.e2e.specs.js.map +1 -0
- package/dist/src/testing/mock-handlers.d.ts +21 -0
- package/dist/src/testing/mock-handlers.d.ts.map +1 -0
- package/dist/src/testing/mock-handlers.js +34 -0
- package/dist/src/testing/mock-handlers.js.map +1 -0
- package/dist/src/testing/mock-handlers.specs.d.ts +2 -0
- package/dist/src/testing/mock-handlers.specs.d.ts.map +1 -0
- package/dist/src/testing/mock-handlers.specs.js +193 -0
- package/dist/src/testing/mock-handlers.specs.js.map +1 -0
- package/dist/src/testing/real-execution.e2e.specs.d.ts +2 -0
- package/dist/src/testing/real-execution.e2e.specs.d.ts.map +1 -0
- package/dist/src/testing/real-execution.e2e.specs.js +140 -0
- package/dist/src/testing/real-execution.e2e.specs.js.map +1 -0
- package/dist/src/testing/real-plugin.e2e.specs.d.ts +2 -0
- package/dist/src/testing/real-plugin.e2e.specs.d.ts.map +1 -0
- package/dist/src/testing/real-plugin.e2e.specs.js +65 -0
- package/dist/src/testing/real-plugin.e2e.specs.js.map +1 -0
- package/dist/src/testing/server-startup.e2e.specs.d.ts +2 -0
- package/dist/src/testing/server-startup.e2e.specs.d.ts.map +1 -0
- package/dist/src/testing/server-startup.e2e.specs.js +104 -0
- package/dist/src/testing/server-startup.e2e.specs.js.map +1 -0
- package/dist/src/testing/snapshot-compare.d.ts +18 -0
- package/dist/src/testing/snapshot-compare.d.ts.map +1 -0
- package/dist/src/testing/snapshot-compare.js +86 -0
- package/dist/src/testing/snapshot-compare.js.map +1 -0
- package/dist/src/testing/snapshot-compare.specs.d.ts +2 -0
- package/dist/src/testing/snapshot-compare.specs.d.ts.map +1 -0
- package/dist/src/testing/snapshot-compare.specs.js +112 -0
- package/dist/src/testing/snapshot-compare.specs.js.map +1 -0
- package/dist/src/testing/snapshot-sanitize.d.ts +8 -0
- package/dist/src/testing/snapshot-sanitize.d.ts.map +1 -0
- package/dist/src/testing/snapshot-sanitize.js +10 -0
- package/dist/src/testing/snapshot-sanitize.js.map +1 -0
- package/dist/src/testing/snapshot-sanitize.specs.d.ts +2 -0
- package/dist/src/testing/snapshot-sanitize.specs.d.ts.map +1 -0
- package/dist/src/testing/snapshot-sanitize.specs.js +104 -0
- package/dist/src/testing/snapshot-sanitize.specs.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/docs/testing-analysis.md +395 -0
- package/package.json +31 -0
- package/pipeline-api-new.md +1078 -0
- package/pomodoro-plan.md +651 -0
- package/scripts/run-kanban-e2e.ts +219 -0
- package/scripts/start-server.ts +64 -0
- package/snapshots/e2e-run-2025-12-22T15-52-03.json +613 -0
- package/snapshots/e2e-run-2025-12-22T16-51-30.json +699 -0
- package/src/builder/define.specs.ts +531 -0
- package/src/builder/define.ts +700 -0
- package/src/config/pipeline-config.ts +32 -0
- package/src/core/descriptors.specs.ts +28 -0
- package/src/core/descriptors.ts +99 -0
- package/src/core/types.specs.ts +44 -0
- package/src/core/types.ts +16 -0
- package/src/graph/types.specs.ts +176 -0
- package/src/graph/types.ts +19 -0
- package/src/index.ts +54 -0
- package/src/logging/event-logger.specs.ts +100 -0
- package/src/logging/event-logger.ts +50 -0
- package/src/plugins/handler-adapter.specs.ts +164 -0
- package/src/plugins/handler-adapter.ts +21 -0
- package/src/plugins/plugin-loader.specs.ts +295 -0
- package/src/plugins/plugin-loader.ts +202 -0
- package/src/runtime/await-tracker.specs.ts +52 -0
- package/src/runtime/await-tracker.ts +50 -0
- package/src/runtime/context.specs.ts +28 -0
- package/src/runtime/context.ts +13 -0
- package/src/runtime/event-command-map.specs.ts +136 -0
- package/src/runtime/event-command-map.ts +38 -0
- package/src/runtime/phased-executor.specs.ts +358 -0
- package/src/runtime/phased-executor.ts +224 -0
- package/src/runtime/pipeline-runtime.specs.ts +214 -0
- package/src/runtime/pipeline-runtime.ts +119 -0
- package/src/runtime/settled-tracker.specs.ts +448 -0
- package/src/runtime/settled-tracker.ts +237 -0
- package/src/server/full-orchestration.e2e.specs.ts +672 -0
- package/src/server/pipeline-server.e2e.specs.ts +505 -0
- package/src/server/pipeline-server.specs.ts +761 -0
- package/src/server/pipeline-server.ts +656 -0
- package/src/server/sse-manager.specs.ts +208 -0
- package/src/server/sse-manager.ts +79 -0
- package/src/testing/event-capture.specs.ts +143 -0
- package/src/testing/event-capture.ts +65 -0
- package/src/testing/fixtures/kanban-full.pipeline.specs.ts +337 -0
- package/src/testing/fixtures/kanban-full.pipeline.ts +225 -0
- package/src/testing/fixtures/kanban-todo.config.ts +19 -0
- package/src/testing/fixtures/kanban.pipeline.specs.ts +33 -0
- package/src/testing/fixtures/kanban.pipeline.ts +124 -0
- package/src/testing/kanban-todo.e2e.specs.ts +209 -0
- package/src/testing/mock-handlers.specs.ts +229 -0
- package/src/testing/mock-handlers.ts +58 -0
- package/src/testing/real-execution.e2e.specs.ts +193 -0
- package/src/testing/real-plugin.e2e.specs.ts +94 -0
- package/src/testing/server-startup.e2e.specs.ts +162 -0
- package/src/testing/snapshot-compare.specs.ts +136 -0
- package/src/testing/snapshot-compare.ts +106 -0
- package/src/testing/snapshot-sanitize.specs.ts +131 -0
- package/src/testing/snapshot-sanitize.ts +17 -0
- package/tsconfig.json +11 -0
- package/tsconfig.test.json +9 -0
- package/vitest.config.ts +29 -0
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":"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"}
|