@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
|
@@ -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
|
+
}
|