groundswell 0.0.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +26 -9
- package/dist/cache/cache-key.d.ts +86 -0
- package/dist/cache/cache-key.d.ts.map +1 -0
- package/dist/cache/cache-key.js +204 -0
- package/dist/cache/cache-key.js.map +1 -0
- package/dist/cache/cache.d.ts +104 -0
- package/dist/cache/cache.d.ts.map +1 -0
- package/dist/cache/cache.js +179 -0
- package/dist/cache/cache.js.map +1 -0
- package/{src/cache/index.ts → dist/cache/index.d.ts} +1 -1
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +6 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/core/agent.d.ts +203 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +833 -0
- package/dist/core/agent.js.map +1 -0
- package/{src/core/context.ts → dist/core/context.d.ts} +16 -67
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +80 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/event-tree.d.ts +72 -0
- package/dist/core/event-tree.d.ts.map +1 -0
- package/dist/core/event-tree.js +211 -0
- package/dist/core/event-tree.js.map +1 -0
- package/{src/core/factory.ts → dist/core/factory.d.ts} +6 -27
- package/dist/core/factory.d.ts.map +1 -0
- package/dist/core/factory.js +110 -0
- package/dist/core/factory.js.map +1 -0
- package/{src/core/index.ts → dist/core/index.d.ts} +2 -10
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/logger.d.ts +50 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +91 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/mcp-handler.d.ts +127 -0
- package/dist/core/mcp-handler.d.ts.map +1 -0
- package/dist/core/mcp-handler.js +323 -0
- package/dist/core/mcp-handler.js.map +1 -0
- package/dist/core/prompt.d.ts +80 -0
- package/dist/core/prompt.d.ts.map +1 -0
- package/dist/core/prompt.js +120 -0
- package/dist/core/prompt.js.map +1 -0
- package/dist/core/workflow-context.d.ts +61 -0
- package/dist/core/workflow-context.d.ts.map +1 -0
- package/dist/core/workflow-context.js +358 -0
- package/dist/core/workflow-context.js.map +1 -0
- package/dist/core/workflow.d.ts +543 -0
- package/dist/core/workflow.d.ts.map +1 -0
- package/dist/core/workflow.js +986 -0
- package/dist/core/workflow.js.map +1 -0
- package/dist/debugger/event-replayer.d.ts +422 -0
- package/dist/debugger/event-replayer.d.ts.map +1 -0
- package/dist/debugger/event-replayer.js +639 -0
- package/dist/debugger/event-replayer.js.map +1 -0
- package/dist/debugger/index.d.ts +2 -0
- package/dist/debugger/index.d.ts.map +1 -0
- package/{src/debugger/index.ts → dist/debugger/index.js} +1 -0
- package/dist/debugger/index.js.map +1 -0
- package/dist/debugger/tree-debugger.d.ts +240 -0
- package/dist/debugger/tree-debugger.d.ts.map +1 -0
- package/dist/debugger/tree-debugger.js +620 -0
- package/dist/debugger/tree-debugger.js.map +1 -0
- package/dist/decorators/index.d.ts +4 -0
- package/dist/decorators/index.d.ts.map +1 -0
- package/{src/decorators/index.ts → dist/decorators/index.js} +1 -0
- package/dist/decorators/index.js.map +1 -0
- package/dist/decorators/observed-state.d.ts +32 -0
- package/dist/decorators/observed-state.d.ts.map +1 -0
- package/dist/decorators/observed-state.js +79 -0
- package/dist/decorators/observed-state.js.map +1 -0
- package/dist/decorators/step.d.ts +15 -0
- package/dist/decorators/step.d.ts.map +1 -0
- package/dist/decorators/step.js +192 -0
- package/dist/decorators/step.js.map +1 -0
- package/dist/decorators/task.d.ts +50 -0
- package/dist/decorators/task.d.ts.map +1 -0
- package/dist/decorators/task.js +118 -0
- package/dist/decorators/task.js.map +1 -0
- package/dist/examples/index.d.ts +3 -0
- package/dist/examples/index.d.ts.map +1 -0
- package/{src/examples/index.ts → dist/examples/index.js} +1 -0
- package/dist/examples/index.js.map +1 -0
- package/dist/examples/tdd-orchestrator.d.ts +15 -0
- package/dist/examples/tdd-orchestrator.d.ts.map +1 -0
- package/dist/examples/tdd-orchestrator.js +121 -0
- package/dist/examples/tdd-orchestrator.js.map +1 -0
- package/dist/examples/test-cycle-workflow.d.ts +14 -0
- package/dist/examples/test-cycle-workflow.d.ts.map +1 -0
- package/dist/examples/test-cycle-workflow.js +116 -0
- package/dist/examples/test-cycle-workflow.js.map +1 -0
- package/dist/harnesses/claude-code-harness.d.ts +391 -0
- package/dist/harnesses/claude-code-harness.d.ts.map +1 -0
- package/dist/harnesses/claude-code-harness.js +1076 -0
- package/dist/harnesses/claude-code-harness.js.map +1 -0
- package/dist/harnesses/harness-registry.d.ts +440 -0
- package/dist/harnesses/harness-registry.d.ts.map +1 -0
- package/dist/harnesses/harness-registry.js +543 -0
- package/dist/harnesses/harness-registry.js.map +1 -0
- package/dist/harnesses/index.d.ts +12 -0
- package/dist/harnesses/index.d.ts.map +1 -0
- package/dist/harnesses/index.js +11 -0
- package/dist/harnesses/index.js.map +1 -0
- package/dist/harnesses/pi-harness.d.ts +219 -0
- package/dist/harnesses/pi-harness.d.ts.map +1 -0
- package/dist/harnesses/pi-harness.js +676 -0
- package/dist/harnesses/pi-harness.js.map +1 -0
- package/dist/harnesses/pi-schema-converter.d.ts +24 -0
- package/dist/harnesses/pi-schema-converter.d.ts.map +1 -0
- package/dist/harnesses/pi-schema-converter.js +81 -0
- package/dist/harnesses/pi-schema-converter.js.map +1 -0
- package/dist/harnesses/register-defaults.d.ts +24 -0
- package/dist/harnesses/register-defaults.d.ts.map +1 -0
- package/dist/harnesses/register-defaults.js +40 -0
- package/dist/harnesses/register-defaults.js.map +1 -0
- package/dist/harnesses/session-store.d.ts +201 -0
- package/dist/harnesses/session-store.d.ts.map +1 -0
- package/dist/harnesses/session-store.js +254 -0
- package/dist/harnesses/session-store.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -0
- package/dist/index.js.map +1 -0
- package/dist/reflection/index.d.ts +5 -0
- package/dist/reflection/index.d.ts.map +1 -0
- package/{src/reflection/index.ts → dist/reflection/index.js} +1 -1
- package/dist/reflection/index.js.map +1 -0
- package/dist/reflection/reflection.d.ts +84 -0
- package/dist/reflection/reflection.d.ts.map +1 -0
- package/dist/reflection/reflection.js +344 -0
- package/dist/reflection/reflection.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +11 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/introspection.d.ts +165 -0
- package/dist/tools/introspection.d.ts.map +1 -0
- package/dist/tools/introspection.js +324 -0
- package/dist/tools/introspection.js.map +1 -0
- package/dist/types/agent.d.ts +1317 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +423 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/decorators.d.ts +40 -0
- package/dist/types/decorators.d.ts.map +1 -0
- package/dist/types/decorators.js +2 -0
- package/dist/types/decorators.js.map +1 -0
- package/dist/types/error-strategy.d.ts +13 -0
- package/dist/types/error-strategy.d.ts.map +1 -0
- package/dist/types/error-strategy.js +2 -0
- package/dist/types/error-strategy.js.map +1 -0
- package/dist/types/error.d.ts +20 -0
- package/dist/types/error.d.ts.map +1 -0
- package/dist/types/error.js +2 -0
- package/dist/types/error.js.map +1 -0
- package/dist/types/events.d.ts +113 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +2 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/harnesses.d.ts +474 -0
- package/dist/types/harnesses.d.ts.map +1 -0
- package/dist/types/harnesses.js +2 -0
- package/dist/types/harnesses.js.map +1 -0
- package/dist/types/index.d.ts +23 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/logging.d.ts +24 -0
- package/dist/types/logging.d.ts.map +1 -0
- package/dist/types/logging.js +2 -0
- package/dist/types/logging.js.map +1 -0
- package/dist/types/observer.d.ts +18 -0
- package/dist/types/observer.d.ts.map +1 -0
- package/dist/types/observer.js +2 -0
- package/dist/types/observer.js.map +1 -0
- package/dist/types/prompt.d.ts +31 -0
- package/dist/types/prompt.d.ts.map +1 -0
- package/dist/types/prompt.js +6 -0
- package/dist/types/prompt.js.map +1 -0
- package/dist/types/providers.d.ts +691 -0
- package/dist/types/providers.d.ts.map +1 -0
- package/dist/types/providers.js +14 -0
- package/dist/types/providers.js.map +1 -0
- package/dist/types/reflection.d.ts +96 -0
- package/dist/types/reflection.d.ts.map +1 -0
- package/dist/types/reflection.js +24 -0
- package/dist/types/reflection.js.map +1 -0
- package/dist/types/restart.d.ts +132 -0
- package/dist/types/restart.d.ts.map +1 -0
- package/dist/types/restart.js +2 -0
- package/dist/types/restart.js.map +1 -0
- package/dist/types/sdk-primitives.d.ts +118 -0
- package/dist/types/sdk-primitives.d.ts.map +1 -0
- package/dist/types/sdk-primitives.js +6 -0
- package/dist/types/sdk-primitives.js.map +1 -0
- package/{src/types/snapshot.ts → dist/types/snapshot.d.ts} +5 -5
- package/dist/types/snapshot.d.ts.map +1 -0
- package/dist/types/snapshot.js +2 -0
- package/dist/types/snapshot.js.map +1 -0
- package/dist/types/streaming.d.ts +194 -0
- package/dist/types/streaming.d.ts.map +1 -0
- package/dist/types/streaming.js +67 -0
- package/dist/types/streaming.js.map +1 -0
- package/dist/types/workflow-context.d.ts +275 -0
- package/dist/types/workflow-context.d.ts.map +1 -0
- package/dist/types/workflow-context.js +8 -0
- package/dist/types/workflow-context.js.map +1 -0
- package/dist/types/workflow.d.ts +30 -0
- package/dist/types/workflow.d.ts.map +1 -0
- package/dist/types/workflow.js +2 -0
- package/dist/types/workflow.js.map +1 -0
- package/dist/utils/agent-validation.d.ts +88 -0
- package/dist/utils/agent-validation.d.ts.map +1 -0
- package/dist/utils/agent-validation.js +87 -0
- package/dist/utils/agent-validation.js.map +1 -0
- package/dist/utils/delay.d.ts +7 -0
- package/dist/utils/delay.d.ts.map +1 -0
- package/dist/utils/delay.js +9 -0
- package/dist/utils/delay.js.map +1 -0
- package/dist/utils/harness-config.d.ts +180 -0
- package/dist/utils/harness-config.d.ts.map +1 -0
- package/dist/utils/harness-config.js +311 -0
- package/dist/utils/harness-config.js.map +1 -0
- package/dist/utils/id.d.ts +6 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js +12 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/utils/index.d.ts +13 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +11 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/model-spec.d.ts +110 -0
- package/dist/utils/model-spec.d.ts.map +1 -0
- package/dist/utils/model-spec.js +149 -0
- package/dist/utils/model-spec.js.map +1 -0
- package/dist/utils/observable.d.ts +54 -0
- package/dist/utils/observable.d.ts.map +1 -0
- package/dist/utils/observable.js +82 -0
- package/dist/utils/observable.js.map +1 -0
- package/dist/utils/provider-config.d.ts +10 -0
- package/dist/utils/provider-config.d.ts.map +1 -0
- package/dist/utils/provider-config.js +10 -0
- package/dist/utils/provider-config.js.map +1 -0
- package/dist/utils/restart-analysis.d.ts +202 -0
- package/dist/utils/restart-analysis.d.ts.map +1 -0
- package/dist/utils/restart-analysis.js +426 -0
- package/dist/utils/restart-analysis.js.map +1 -0
- package/dist/utils/session-serialization.d.ts +118 -0
- package/dist/utils/session-serialization.d.ts.map +1 -0
- package/dist/utils/session-serialization.js +217 -0
- package/dist/utils/session-serialization.js.map +1 -0
- package/dist/utils/workflow-error-utils.d.ts +22 -0
- package/dist/utils/workflow-error-utils.d.ts.map +1 -0
- package/dist/utils/workflow-error-utils.js +45 -0
- package/dist/utils/workflow-error-utils.js.map +1 -0
- package/package.json +34 -5
- package/.claude/commands/subtask-planning/prp-base-create.md +0 -120
- package/.claude/commands/subtask-planning/prp-base-execute.md +0 -65
- package/.claude/commands/task-breakdown.md +0 -94
- package/.claude/settings.local.json +0 -9
- package/.claude/system_prompts/task-breakdown.md +0 -101
- package/CHANGELOG.md +0 -188
- package/PRD.md +0 -543
- package/PRPs/001-hierarchical-workflow-engine.md +0 -2438
- package/PRPs/PRDs/002-agent-prompt.md +0 -390
- package/PRPs/PRDs/003-agent-prompt.md +0 -943
- package/PRPs/PRDs/004-agent-prompt.md +0 -1136
- package/PRPs/PRDs/tasks-001.json +0 -492
- package/PRPs/README.md +0 -83
- package/PRPs/templates/prp_base.md +0 -222
- package/docs/agent.md +0 -422
- package/docs/prompt.md +0 -419
- package/docs/workflow.md +0 -600
- package/examples/README.md +0 -258
- package/examples/examples/01-basic-workflow.ts +0 -100
- package/examples/examples/02-decorator-options.ts +0 -217
- package/examples/examples/03-parent-child.ts +0 -241
- package/examples/examples/04-observers-debugger.ts +0 -340
- package/examples/examples/05-error-handling.ts +0 -387
- package/examples/examples/06-concurrent-tasks.ts +0 -352
- package/examples/examples/07-agent-loops.ts +0 -432
- package/examples/examples/08-sdk-features.ts +0 -667
- package/examples/examples/09-reflection.ts +0 -573
- package/examples/examples/10-introspection.ts +0 -550
- package/examples/examples/11-reparenting-workflows.ts +0 -269
- package/examples/index.ts +0 -147
- package/examples/utils/helpers.ts +0 -57
- package/package-lock.json +0 -2398
- package/plan/001_d3bb02af4886/TEST_RESULTS.md +0 -259
- package/plan/001_d3bb02af4886/backlog.json +0 -867
- package/plan/001_d3bb02af4886/bug_fix_tasks.json +0 -484
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S1/PRP.md +0 -488
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S2/PRP.md +0 -581
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S3/PRP.md +0 -687
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S1/PRP.md +0 -492
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/PRP.md +0 -932
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/concurrent_error_testing_patterns.md +0 -1109
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/vitest_concurrent_testing.md +0 -802
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/workflow_engine_test_references.md +0 -603
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S1/PRP.md +0 -564
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S3/PRP.md +0 -518
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S4/PRP.md +0 -1252
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/PRP.md +0 -364
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/CODEBASE_INVENTORY.md +0 -114
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/DECORATOR_DOCUMENTATION_PATTERNS.md +0 -205
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/PRD_LOCATION_ANALYSIS.md +0 -199
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/ULTRATHINK_PRP_PLAN.md +0 -134
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S1/PRP.md +0 -495
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S1/research/console_error_inventory.md +0 -435
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S2/PRP.md +0 -506
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S3/PRP.md +0 -612
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T2S2/PRP.md +0 -558
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T2S2/research/external_research.md +0 -788
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T3S2/PRP.md +0 -460
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T3S3/PRP.md +0 -454
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/PRP.md +0 -520
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/RECOMMENDATION.md +0 -417
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/research/external_workflow_engines_research.md +0 -760
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/research/security_implications_analysis.md +0 -245
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S2/PRP.md +0 -792
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S1/PRP.md +0 -535
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S1/TEST_EXECUTION_REPORT.md +0 -190
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/PRP.md +0 -654
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/TEST_FIX_REPORT.md +0 -227
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/KEY_FINDINGS.md +0 -345
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/QUICK_REFERENCE.md +0 -193
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/test_maintenance_research.md +0 -1323
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S1/BREAKING_CHANGES_AUDIT.md +0 -1011
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S1/PRP.md +0 -927
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S2/PRP.md +0 -505
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/architecture/logger_child_signature_analysis.md +0 -401
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/child_implementation_research.md +0 -142
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/test_patterns_research.md +0 -112
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/vitest_patterns_research.md +0 -159
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/PRP.md +0 -549
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/VERIFICATION_REPORT.md +0 -368
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/edge_case_analysis.md +0 -172
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/usage_inventory.md +0 -175
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T1S2/PRP.md +0 -696
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T1S4/PRP.md +0 -860
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/PRP.md +0 -1066
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/01-testing-aggregated-errors.md +0 -1103
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/01_typescript_error_aggregation_patterns.md +0 -789
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/02-error-merge-strategy-testing-guide.md +0 -1098
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/02_aggregate_error_patterns.md +0 -1037
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/03-promise-allsettled-testing-patterns.md +0 -916
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/03_error_merging_strategies.md +0 -1045
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/04_github_stackoverflow_examples.md +0 -890
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/05_comprehensive_summary.md +0 -822
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/INDEX.md +0 -668
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/QUICK_REFERENCE.md +0 -706
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/README.md +0 -265
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/RESEARCH_REPORT.md +0 -655
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S4/research/vitest_testing_patterns.md +0 -1103
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T3S2/PRP.md +0 -426
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/PRP.md +0 -506
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/QUICK_REFERENCE.md +0 -114
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/RESEARCH_SUMMARY.md +0 -316
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/vitest_observer_error_logging_best_practices.md +0 -754
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S3/PRP.md +0 -612
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/PRP.md +0 -719
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/README.md +0 -215
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/analysis.md +0 -765
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S3/PRP.md +0 -718
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/DECISION.md +0 -149
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/PRP.md +0 -470
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/ULTRATHINK_PLAN.md +0 -332
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/codebase_workflow_name_analysis.md +0 -167
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/external_best_practices.md +0 -265
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/validation_patterns.md +0 -273
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T4S1/workflow_engine_ancestry_api_research.md +0 -760
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T4S3-PRP.md +0 -434
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S1/PRP.md +0 -717
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/PRP.md +0 -472
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/VALIDATION_REPORT.md +0 -125
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/research/ULTRATHINK_PRP_PLAN.md +0 -301
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/error-logging-best-practices.md +0 -1170
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/research_typescript_partial_and_overloads.md +0 -940
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/vitest-quick-reference.md +0 -151
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/vitest-research.md +0 -650
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/prd_snapshot.md +0 -259
- package/plan/001_d3bb02af4886/bugfix/P1M1T1S1/PRP.md +0 -457
- package/plan/001_d3bb02af4886/bugfix/RESEARCH_SUMMARY.md +0 -346
- package/plan/001_d3bb02af4886/bugfix/architecture/codebase_structure.md +0 -311
- package/plan/001_d3bb02af4886/bugfix/architecture/concurrent_execution_best_practices.md +0 -1565
- package/plan/001_d3bb02af4886/bugfix/architecture/error_handling_patterns.md +0 -288
- package/plan/001_d3bb02af4886/bugfix/architecture/promise_all_analysis.md +0 -741
- package/plan/001_d3bb02af4886/docs/PRP/P1M1T1S4-functional-workflow-error-state-capture-test.md +0 -652
- package/plan/001_d3bb02af4886/docs/PRP/P1P2-PRP.md +0 -527
- package/plan/001_d3bb02af4886/docs/PRP/P3P4-PRP.md +0 -1388
- package/plan/001_d3bb02af4886/docs/PRP/P4P5-PRP.md +0 -1136
- package/plan/001_d3bb02af4886/docs/PRP/PRP.md +0 -527
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S1-PRP.md +0 -415
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S2-PRP.md +0 -378
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S4-PRP.md +0 -713
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M2T1S4-PRP.md +0 -370
- package/plan/001_d3bb02af4886/docs/PRP_P1M3T1S3.md +0 -499
- package/plan/001_d3bb02af4886/docs/TEST_RESULTS.md +0 -230
- package/plan/001_d3bb02af4886/docs/architecture/external_deps.md +0 -358
- package/plan/001_d3bb02af4886/docs/architecture/system_context.md +0 -242
- package/plan/001_d3bb02af4886/docs/bugfix/ANALYSIS_PRD_VS_IMPLEMENTATION.md +0 -1134
- package/plan/001_d3bb02af4886/docs/bugfix/GAP_ANALYSIS_SUMMARY.md +0 -179
- package/plan/001_d3bb02af4886/docs/bugfix/P1M4T2S1/PRP.md +0 -629
- package/plan/001_d3bb02af4886/docs/bugfix/P1M4T2S1/validation-report.md +0 -214
- package/plan/001_d3bb02af4886/docs/bugfix/PRP_P1M4T2S3.md +0 -629
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_PRP.md +0 -529
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_QUICK_REFERENCE.md +0 -142
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_README.md +0 -304
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_TEST_RESULTS.md +0 -558
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_VALIDATION_SUMMARY.md +0 -256
- package/plan/001_d3bb02af4886/docs/bugfix/system_context.md +0 -346
- package/plan/001_d3bb02af4886/docs/bugfix-architecture/bug_analysis.md +0 -415
- package/plan/001_d3bb02af4886/docs/bugfix-architecture/implementation_patterns.md +0 -489
- package/plan/001_d3bb02af4886/docs/bugfix-architecture/system_context.md +0 -218
- package/plan/001_d3bb02af4886/docs/bugfix_INITIATION_SUMMARY.md +0 -380
- package/plan/001_d3bb02af4886/docs/research/CYCLE_DETECTION_PATTERNS.md +0 -1923
- package/plan/001_d3bb02af4886/docs/research/CYCLE_DETECTION_QUICK_REF.md +0 -319
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/codebase-context.md +0 -115
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/cycle-detection-algorithms.md +0 -134
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/test-patterns.md +0 -153
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/workflow-class.md +0 -132
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/DECORATOR_DOCUMENTATION_BEST_PRACTICES.md +0 -716
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/DECORATOR_DOCUMENTATION_QUICK_REF.md +0 -186
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/GROUNDSWELL_DECORATOR_EXAMPLES.md +0 -604
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/INDEX.md +0 -213
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/codebase_structure.md +0 -30
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/existing_test_pattern.md +0 -56
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/getRootObservers_implementation.md +0 -53
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/test_conventions.md +0 -49
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/PRP.md +0 -958
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/QUICK_REFERENCE.md +0 -339
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/README.md +0 -305
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/SUMMARY.md +0 -433
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/bidirectional-tree-consistency-testing.md +0 -1574
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/test-pattern-examples.md +0 -1014
- package/plan/001_d3bb02af4886/docs/research/P1P2/LRU_CACHE_BEST_PRACTICES.md +0 -1929
- package/plan/001_d3bb02af4886/docs/research/P1P2/LRU_CACHE_CODE_PATTERNS.md +0 -857
- package/plan/001_d3bb02af4886/docs/research/P1P2/LRU_CACHE_INTEGRATION_GUIDE.md +0 -738
- package/plan/001_d3bb02af4886/docs/research/P1P2/LRU_CACHE_RESEARCH_INDEX.md +0 -424
- package/plan/001_d3bb02af4886/docs/research/P1P2/REFLECTION_INDEX.md +0 -291
- package/plan/001_d3bb02af4886/docs/research/P1P2/REFLECTION_RESEARCH_REPORT.md +0 -1342
- package/plan/001_d3bb02af4886/docs/research/P1P2/RESEARCH_SUMMARY.md +0 -342
- package/plan/001_d3bb02af4886/docs/research/P1P2/anthropic-sdk.md +0 -174
- package/plan/001_d3bb02af4886/docs/research/P1P2/async-local-storage.md +0 -200
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-code-patterns.md +0 -1205
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-decision-matrix.md +0 -421
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-implementation-guide.md +0 -1341
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-integration-guide.md +0 -834
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-patterns.md +0 -1468
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-quick-reference.md +0 -558
- package/plan/001_d3bb02af4886/docs/research/P1P2/zod-schema.md +0 -152
- package/plan/001_d3bb02af4886/docs/research/P3P4/caching-lru.md +0 -116
- package/plan/001_d3bb02af4886/docs/research/P3P4/introspection-tools.md +0 -177
- package/plan/001_d3bb02af4886/docs/research/P3P4/reflection-patterns.md +0 -117
- package/plan/001_d3bb02af4886/docs/research/P4P5/RESEARCH_SUMMARY.md +0 -151
- package/plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_QUICK_REF.md +0 -376
- package/plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_RESEARCH.md +0 -1507
- package/plan/001_d3bb02af4886/docs/research/bugfix_typescript_patterns.md +0 -949
- package/plan/001_d3bb02af4886/docs/research/error-testing-research.md +0 -619
- package/plan/001_d3bb02af4886/docs/research/error_handling_patterns.md +0 -723
- package/plan/001_d3bb02af4886/docs/research/general/INTROSPECTION_RESEARCH_SUMMARY.md +0 -378
- package/plan/001_d3bb02af4886/docs/research/general/README-INTROSPECTION.md +0 -352
- package/plan/001_d3bb02af4886/docs/research/general/agent-introspection-patterns.md +0 -1085
- package/plan/001_d3bb02af4886/docs/research/general/introspection-security-guide.md +0 -984
- package/plan/001_d3bb02af4886/docs/research/general/introspection-tool-examples.md +0 -875
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/PRP_TEMPLATE.md +0 -460
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/QUICK_REFERENCE.md +0 -324
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/README.md +0 -175
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/RESEARCH_REPORT.md +0 -499
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/SUMMARY.md +0 -163
- package/plan/001_d3bb02af4886/prd_snapshot.md +0 -543
- package/plan/bugfix/BUG_FIX_SUMMARY.md +0 -961
- package/scripts/generate-llms-full.ts +0 -206
- package/src/__tests__/adversarial/attachChild-performance.test.ts +0 -216
- package/src/__tests__/adversarial/circular-reference.test.ts +0 -101
- package/src/__tests__/adversarial/complex-circular-reference.test.ts +0 -139
- package/src/__tests__/adversarial/concurrent-task-failures.test.ts +0 -571
- package/src/__tests__/adversarial/deep-analysis.test.ts +0 -729
- package/src/__tests__/adversarial/deep-hierarchy-stress.test.ts +0 -213
- package/src/__tests__/adversarial/e2e-prd-validation.test.ts +0 -448
- package/src/__tests__/adversarial/edge-case.test.ts +0 -703
- package/src/__tests__/adversarial/error-merge-strategy.test.ts +0 -760
- package/src/__tests__/adversarial/incremental-performance.test.ts +0 -140
- package/src/__tests__/adversarial/node-map-update-benchmarks.test.ts +0 -457
- package/src/__tests__/adversarial/observer-propagation.test.ts +0 -487
- package/src/__tests__/adversarial/parent-validation.test.ts +0 -143
- package/src/__tests__/adversarial/prd-12-2-compliance.test.ts +0 -611
- package/src/__tests__/adversarial/prd-compliance.test.ts +0 -731
- package/src/__tests__/compatibility/backward-compatibility.test.ts +0 -1572
- package/src/__tests__/helpers/index.ts +0 -18
- package/src/__tests__/helpers/tree-verification.ts +0 -257
- package/src/__tests__/integration/agent-workflow.test.ts +0 -256
- package/src/__tests__/integration/bidirectional-consistency.test.ts +0 -847
- package/src/__tests__/integration/observer-logging.test.ts +0 -643
- package/src/__tests__/integration/tree-mirroring.test.ts +0 -151
- package/src/__tests__/integration/workflow-reparenting.test.ts +0 -303
- package/src/__tests__/unit/agent.test.ts +0 -169
- package/src/__tests__/unit/cache-key.test.ts +0 -182
- package/src/__tests__/unit/cache.test.ts +0 -172
- package/src/__tests__/unit/context.test.ts +0 -217
- package/src/__tests__/unit/decorators.test.ts +0 -100
- package/src/__tests__/unit/introspection-tools.test.ts +0 -277
- package/src/__tests__/unit/logger.test.ts +0 -293
- package/src/__tests__/unit/observable.test.ts +0 -321
- package/src/__tests__/unit/prompt.test.ts +0 -135
- package/src/__tests__/unit/reflection.test.ts +0 -210
- package/src/__tests__/unit/tree-debugger-incremental.test.ts +0 -170
- package/src/__tests__/unit/tree-debugger.test.ts +0 -85
- package/src/__tests__/unit/utils/workflow-error-utils.test.ts +0 -209
- package/src/__tests__/unit/workflow-detachChild.test.ts +0 -100
- package/src/__tests__/unit/workflow-emitEvent-childDetached.test.ts +0 -153
- package/src/__tests__/unit/workflow-isDescendantOf.test.ts +0 -180
- package/src/__tests__/unit/workflow.test.ts +0 -357
- package/src/cache/cache-key.ts +0 -244
- package/src/cache/cache.ts +0 -236
- package/src/core/agent.ts +0 -593
- package/src/core/event-tree.ts +0 -260
- package/src/core/logger.ts +0 -112
- package/src/core/mcp-handler.ts +0 -184
- package/src/core/prompt.ts +0 -150
- package/src/core/workflow-context.ts +0 -351
- package/src/core/workflow.ts +0 -540
- package/src/debugger/tree-debugger.ts +0 -255
- package/src/decorators/observed-state.ts +0 -95
- package/src/decorators/step.ts +0 -139
- package/src/decorators/task.ts +0 -159
- package/src/examples/tdd-orchestrator.ts +0 -65
- package/src/examples/test-cycle-workflow.ts +0 -64
- package/src/index.ts +0 -142
- package/src/reflection/reflection.ts +0 -407
- package/src/tools/index.ts +0 -36
- package/src/tools/introspection.ts +0 -464
- package/src/types/agent.ts +0 -90
- package/src/types/decorators.ts +0 -32
- package/src/types/error-strategy.ts +0 -13
- package/src/types/error.ts +0 -20
- package/src/types/events.ts +0 -75
- package/src/types/index.ts +0 -55
- package/src/types/logging.ts +0 -24
- package/src/types/observer.ts +0 -18
- package/src/types/prompt.ts +0 -40
- package/src/types/reflection.ts +0 -117
- package/src/types/sdk-primitives.ts +0 -128
- package/src/types/workflow-context.ts +0 -163
- package/src/types/workflow.ts +0 -37
- package/src/utils/id.ts +0 -11
- package/src/utils/index.ts +0 -4
- package/src/utils/observable.ts +0 -106
- package/src/utils/workflow-error-utils.ts +0 -56
- package/tsconfig.json +0 -22
- package/vitest.config.ts +0 -16
|
@@ -1,668 +0,0 @@
|
|
|
1
|
-
# Testing Error Aggregation Research Index
|
|
2
|
-
|
|
3
|
-
**Research Date:** 2026-01-12
|
|
4
|
-
**Task:** P1.M2.T2.S2 - Research testing patterns for error aggregation
|
|
5
|
-
**Project:** groundswell - Hierarchical workflow orchestration engine
|
|
6
|
-
|
|
7
|
-
## Quick Start
|
|
8
|
-
|
|
9
|
-
**For immediate implementation:** Start with `02-error-merge-strategy-testing-guide.md`
|
|
10
|
-
**For comprehensive understanding:** Read `01-testing-aggregated-errors.md`
|
|
11
|
-
**For Promise.allSettled specifics:** Reference `03-promise-allsettled-testing-patterns.md`
|
|
12
|
-
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
## Research Documents
|
|
16
|
-
|
|
17
|
-
### Core Research Documents
|
|
18
|
-
|
|
19
|
-
#### 1. Testing Aggregated Errors (Comprehensive Guide)
|
|
20
|
-
**File:** `01-testing-aggregated-errors.md` (29.5 KB)
|
|
21
|
-
**Sections:**
|
|
22
|
-
- Testing aggregated errors patterns
|
|
23
|
-
- Promise.allSettled error scenarios
|
|
24
|
-
- Error event emission testing
|
|
25
|
-
- Mock patterns for error scenarios
|
|
26
|
-
- Assertion patterns for complex error objects
|
|
27
|
-
- Testing library recommendations (Vitest vs Jest)
|
|
28
|
-
- Best practices (10 key practices)
|
|
29
|
-
|
|
30
|
-
**Key Takeaways:**
|
|
31
|
-
- ARRANGE-ACT-ASSERT test structure
|
|
32
|
-
- Type guards for WorkflowError validation
|
|
33
|
-
- Partial object matching with `toMatchObject`
|
|
34
|
-
- Event observer setup patterns
|
|
35
|
-
- Factory functions for mock errors
|
|
36
|
-
|
|
37
|
-
---
|
|
38
|
-
|
|
39
|
-
#### 2. ErrorMergeStrategy Implementation & Testing Guide
|
|
40
|
-
**File:** `02-error-merge-strategy-testing-guide.md` (30.9 KB)
|
|
41
|
-
**Sections:**
|
|
42
|
-
- ErrorMergeStrategy interface specification
|
|
43
|
-
- Default error merger implementation
|
|
44
|
-
- Testing ErrorMergeStrategy functionality
|
|
45
|
-
- Integration with @Task decorator
|
|
46
|
-
- Complete test examples
|
|
47
|
-
- Best practices for error merging
|
|
48
|
-
|
|
49
|
-
**Key Takeaways:**
|
|
50
|
-
- Default merger aggregates: message, original errors, workflowId, stack, logs
|
|
51
|
-
- Custom combine function support
|
|
52
|
-
- maxMergeDepth parameter for limiting recursion
|
|
53
|
-
- Backward compatibility: disabled throws first error only
|
|
54
|
-
- Complete @Task decorator integration code
|
|
55
|
-
|
|
56
|
-
**Code Provided:**
|
|
57
|
-
```typescript
|
|
58
|
-
// Default merger implementation
|
|
59
|
-
export function mergeWorkflowErrors(errors: WorkflowError[]): WorkflowError {
|
|
60
|
-
// Aggregates message, stack, logs from all errors
|
|
61
|
-
// Uses first error's workflowId and state
|
|
62
|
-
// Returns merged WorkflowError
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// @Task decorator integration
|
|
66
|
-
if (opts.errorMergeStrategy?.enabled) {
|
|
67
|
-
const mergedError = opts.errorMergeStrategy.combine
|
|
68
|
-
? opts.errorMergeStrategy.combine(errors)
|
|
69
|
-
: mergeWorkflowErrors(errors);
|
|
70
|
-
|
|
71
|
-
wf.emitEvent({ type: 'error', node: wf.node, error: mergedError });
|
|
72
|
-
throw mergedError;
|
|
73
|
-
}
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
---
|
|
77
|
-
|
|
78
|
-
#### 3. Promise.allSettled Testing Patterns
|
|
79
|
-
**File:** `03-promise-allsettled-testing-patterns.md` (24.4 KB)
|
|
80
|
-
**Sections:**
|
|
81
|
-
- Promise.allSettled basics
|
|
82
|
-
- Type guards for PromiseSettledResult
|
|
83
|
-
- Testing patterns (basic, all-rejected, all-fulfilled, empty)
|
|
84
|
-
- Workflow-specific scenarios
|
|
85
|
-
- Error collection strategies
|
|
86
|
-
- Performance & concurrency testing
|
|
87
|
-
- Edge cases
|
|
88
|
-
|
|
89
|
-
**Key Takeaways:**
|
|
90
|
-
- Type guards: `isRejected` and `isFulfilled`
|
|
91
|
-
- Error extraction patterns
|
|
92
|
-
- Orphan prevention testing
|
|
93
|
-
- Concurrency verification with timestamps
|
|
94
|
-
- Performance testing with large batches (100+ workflows)
|
|
95
|
-
|
|
96
|
-
**Code Provided:**
|
|
97
|
-
```typescript
|
|
98
|
-
// Type guards
|
|
99
|
-
function isRejected(result: PromiseSettledResult<unknown>): result is PromiseRejectedResult {
|
|
100
|
-
return result.status === 'rejected';
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// Extract errors
|
|
104
|
-
function extractErrors(results: PromiseSettledResult<unknown>[]): unknown[] {
|
|
105
|
-
return results.filter(isRejected).map(r => r.reason);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// Orphan prevention test
|
|
109
|
-
const completions = new Map<string, 'success' | 'failure'>();
|
|
110
|
-
// Track all workflow completions
|
|
111
|
-
expect(completions.size).toBe(totalWorkflows);
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
---
|
|
115
|
-
|
|
116
|
-
### Additional Reference Materials
|
|
117
|
-
|
|
118
|
-
#### 4. TypeScript Error Aggregation Patterns
|
|
119
|
-
**File:** `01_typescript_error_aggregation_patterns.md` (20.9 KB)
|
|
120
|
-
**Content:**
|
|
121
|
-
- TypeScript-specific patterns for error aggregation
|
|
122
|
-
- Type safety in error handling
|
|
123
|
-
- Generic error aggregation utilities
|
|
124
|
-
- Type-level error handling
|
|
125
|
-
|
|
126
|
-
---
|
|
127
|
-
|
|
128
|
-
#### 5. Aggregate Error Patterns
|
|
129
|
-
**File:** `02_aggregate_error_patterns.md` (27.3 KB)
|
|
130
|
-
**Content:**
|
|
131
|
-
- Aggregate error design patterns
|
|
132
|
-
- Error collection strategies
|
|
133
|
-
- Error hierarchy management
|
|
134
|
-
- Best practices for aggregate errors
|
|
135
|
-
|
|
136
|
-
---
|
|
137
|
-
|
|
138
|
-
#### 6. Error Merging Strategies
|
|
139
|
-
**File:** `03_error_merging_strategies.md` (24.8 KB)
|
|
140
|
-
**Content:**
|
|
141
|
-
- Different error merging approaches
|
|
142
|
-
- Strategy pattern implementation
|
|
143
|
-
- Custom error merger examples
|
|
144
|
-
- Error deduplication techniques
|
|
145
|
-
|
|
146
|
-
---
|
|
147
|
-
|
|
148
|
-
#### 7. GitHub & StackOverflow Examples
|
|
149
|
-
**File:** `04_github_stackoverflow_examples.md` (24.1 KB)
|
|
150
|
-
**Content:**
|
|
151
|
-
- Real-world examples from GitHub
|
|
152
|
-
- StackOverflow Q&A on error aggregation
|
|
153
|
-
- Community patterns and solutions
|
|
154
|
-
- Common pitfalls and how to avoid them
|
|
155
|
-
|
|
156
|
-
---
|
|
157
|
-
|
|
158
|
-
## Project-Specific Context
|
|
159
|
-
|
|
160
|
-
### Implementation Files
|
|
161
|
-
|
|
162
|
-
**Current Implementation:**
|
|
163
|
-
```typescript
|
|
164
|
-
// File: /home/dustin/projects/groundswell/src/decorators/task.ts
|
|
165
|
-
// Lines 111-122: Promise.allSettled implementation
|
|
166
|
-
|
|
167
|
-
const results = await Promise.allSettled(runnable.map((w) => w.run()));
|
|
168
|
-
|
|
169
|
-
const rejected = results.filter(
|
|
170
|
-
(r): r is PromiseRejectedResult => r.status === 'rejected'
|
|
171
|
-
);
|
|
172
|
-
|
|
173
|
-
if (rejected.length > 0) {
|
|
174
|
-
throw rejected[0].reason; // Currently throws first error only
|
|
175
|
-
}
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
**Required Changes for P1.M2.T2.S2:**
|
|
179
|
-
1. Check if `opts.errorMergeStrategy?.enabled` is true
|
|
180
|
-
2. Collect all errors from `rejected` results
|
|
181
|
-
3. Call custom or default merger
|
|
182
|
-
4. Emit error event with merged error
|
|
183
|
-
5. Throw merged error instead of first error
|
|
184
|
-
|
|
185
|
-
---
|
|
186
|
-
|
|
187
|
-
### Type Definitions
|
|
188
|
-
|
|
189
|
-
**ErrorMergeStrategy Interface:**
|
|
190
|
-
```typescript
|
|
191
|
-
// File: /home/dustin/projects/groundswell/src/types/error-strategy.ts
|
|
192
|
-
export interface ErrorMergeStrategy {
|
|
193
|
-
enabled: boolean;
|
|
194
|
-
maxMergeDepth?: number;
|
|
195
|
-
combine?(errors: WorkflowError[]): WorkflowError;
|
|
196
|
-
}
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
**WorkflowError Interface:**
|
|
200
|
-
```typescript
|
|
201
|
-
// File: /home/dustin/projects/groundswell/src/types/error.ts
|
|
202
|
-
export interface WorkflowError {
|
|
203
|
-
message: string;
|
|
204
|
-
original: unknown;
|
|
205
|
-
workflowId: string;
|
|
206
|
-
stack?: string;
|
|
207
|
-
state: SerializedWorkflowState;
|
|
208
|
-
logs: LogEntry[];
|
|
209
|
-
}
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
---
|
|
213
|
-
|
|
214
|
-
### Existing Tests
|
|
215
|
-
|
|
216
|
-
**Concurrent Task Failures Test:**
|
|
217
|
-
```typescript
|
|
218
|
-
// File: /home/dustin/projects/groundswell/src/__tests__/adversarial/concurrent-task-failures.test.ts
|
|
219
|
-
// 571 lines of comprehensive Promise.allSettled tests
|
|
220
|
-
|
|
221
|
-
describe('@Task decorator concurrent failure scenarios', () => {
|
|
222
|
-
// Single child failure
|
|
223
|
-
// Multiple concurrent failures
|
|
224
|
-
// Mixed success/failure scenarios
|
|
225
|
-
// All children failing
|
|
226
|
-
// No orphaned workflows
|
|
227
|
-
// Event emission verification
|
|
228
|
-
// Error collection correctness
|
|
229
|
-
});
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
---
|
|
233
|
-
|
|
234
|
-
## Implementation Workflow
|
|
235
|
-
|
|
236
|
-
### Step 1: Create Default Error Merger
|
|
237
|
-
|
|
238
|
-
**File to create:** `src/utils/error-merger.ts`
|
|
239
|
-
|
|
240
|
-
```typescript
|
|
241
|
-
import type { WorkflowError } from '../types/error.js';
|
|
242
|
-
|
|
243
|
-
export function mergeWorkflowErrors(errors: WorkflowError[]): WorkflowError {
|
|
244
|
-
if (errors.length === 0) {
|
|
245
|
-
throw new Error('Cannot merge empty error array');
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
if (errors.length === 1) {
|
|
249
|
-
return errors[0];
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
const message = `${errors.length} concurrent error${errors.length > 1 ? 's' : ''}: ` +
|
|
253
|
-
errors.map((e, i) => `[${i + 1}] ${e.message}`).join('; ');
|
|
254
|
-
|
|
255
|
-
const stack = errors
|
|
256
|
-
.map((e, i) => `=== Error ${i + 1} ===\n${e.stack || 'No stack trace'}`)
|
|
257
|
-
.join('\n\n');
|
|
258
|
-
|
|
259
|
-
const logs = errors.flatMap(e => e.logs);
|
|
260
|
-
const workflowId = errors[0].workflowId;
|
|
261
|
-
const state = errors[0].state;
|
|
262
|
-
|
|
263
|
-
return {
|
|
264
|
-
message,
|
|
265
|
-
original: errors,
|
|
266
|
-
workflowId,
|
|
267
|
-
stack,
|
|
268
|
-
state,
|
|
269
|
-
logs,
|
|
270
|
-
};
|
|
271
|
-
}
|
|
272
|
-
```
|
|
273
|
-
|
|
274
|
-
**Tests to create:** `src/__tests__/unit/error-merger.test.ts`
|
|
275
|
-
|
|
276
|
-
---
|
|
277
|
-
|
|
278
|
-
### Step 2: Update @Task Decorator
|
|
279
|
-
|
|
280
|
-
**File to edit:** `src/decorators/task.ts`
|
|
281
|
-
|
|
282
|
-
**Changes at lines 118-120:**
|
|
283
|
-
|
|
284
|
-
```typescript
|
|
285
|
-
if (rejected.length > 0) {
|
|
286
|
-
// Convert to WorkflowError
|
|
287
|
-
const errors = rejected.map((r) => {
|
|
288
|
-
const error = r.reason;
|
|
289
|
-
return isWorkflowError(error)
|
|
290
|
-
? error
|
|
291
|
-
: convertToWorkflowError(error, wf.id);
|
|
292
|
-
});
|
|
293
|
-
|
|
294
|
-
// Apply error merge strategy
|
|
295
|
-
if (opts.errorMergeStrategy?.enabled) {
|
|
296
|
-
const mergedError = opts.errorMergeStrategy.combine
|
|
297
|
-
? opts.errorMergeStrategy.combine(errors)
|
|
298
|
-
: mergeWorkflowErrors(errors);
|
|
299
|
-
|
|
300
|
-
wf.emitEvent({
|
|
301
|
-
type: 'error',
|
|
302
|
-
node: wf.node,
|
|
303
|
-
error: mergedError,
|
|
304
|
-
});
|
|
305
|
-
|
|
306
|
-
throw mergedError;
|
|
307
|
-
} else {
|
|
308
|
-
// Backward compatible: throw first error
|
|
309
|
-
wf.emitEvent({
|
|
310
|
-
type: 'error',
|
|
311
|
-
node: wf.node,
|
|
312
|
-
error: errors[0],
|
|
313
|
-
});
|
|
314
|
-
|
|
315
|
-
throw errors[0];
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
```
|
|
319
|
-
|
|
320
|
-
---
|
|
321
|
-
|
|
322
|
-
### Step 3: Create Test Suite
|
|
323
|
-
|
|
324
|
-
**File to create:** `src/__tests__/unit/error-merge-strategy.test.ts`
|
|
325
|
-
|
|
326
|
-
**Test coverage:**
|
|
327
|
-
- Default merger functionality
|
|
328
|
-
- Empty error array (throws)
|
|
329
|
-
- Single error (returned unchanged)
|
|
330
|
-
- Two errors (merged correctly)
|
|
331
|
-
- Multiple errors (3, 5, 10+)
|
|
332
|
-
- Message aggregation
|
|
333
|
-
- Stack trace concatenation
|
|
334
|
-
- Log flattening
|
|
335
|
-
- Parent context preservation
|
|
336
|
-
- Custom combine function
|
|
337
|
-
- maxMergeDepth parameter
|
|
338
|
-
- Backward compatibility
|
|
339
|
-
- Integration with @Task decorator
|
|
340
|
-
|
|
341
|
-
---
|
|
342
|
-
|
|
343
|
-
### Step 4: Run Tests
|
|
344
|
-
|
|
345
|
-
```bash
|
|
346
|
-
# Run all tests
|
|
347
|
-
npm test
|
|
348
|
-
|
|
349
|
-
# Run specific test file
|
|
350
|
-
npx vitest run src/__tests__/unit/error-merge-strategy.test.ts
|
|
351
|
-
|
|
352
|
-
# Watch mode
|
|
353
|
-
npm run test:watch
|
|
354
|
-
|
|
355
|
-
# Coverage
|
|
356
|
-
npm run test:coverage
|
|
357
|
-
```
|
|
358
|
-
|
|
359
|
-
**Expected outcome:**
|
|
360
|
-
- All 344+ existing tests pass
|
|
361
|
-
- New tests pass with 100% coverage
|
|
362
|
-
- No regressions introduced
|
|
363
|
-
|
|
364
|
-
---
|
|
365
|
-
|
|
366
|
-
## Testing Patterns Summary
|
|
367
|
-
|
|
368
|
-
### 1. Basic Error Aggregation Test
|
|
369
|
-
|
|
370
|
-
```typescript
|
|
371
|
-
it('should aggregate errors from multiple concurrent workflows', async () => {
|
|
372
|
-
// ARRANGE
|
|
373
|
-
const parent = new ParentWorkflow('Parent');
|
|
374
|
-
|
|
375
|
-
// ACT
|
|
376
|
-
const result = await parent.run();
|
|
377
|
-
|
|
378
|
-
// ASSERT
|
|
379
|
-
expect(result.message).toContain('3 concurrent errors');
|
|
380
|
-
expect(result.logs).toHaveLength(3);
|
|
381
|
-
});
|
|
382
|
-
```
|
|
383
|
-
|
|
384
|
-
### 2. Custom Merger Test
|
|
385
|
-
|
|
386
|
-
```typescript
|
|
387
|
-
it('should use custom error merge function', async () => {
|
|
388
|
-
const customMerger = (errors: WorkflowError[]) => ({
|
|
389
|
-
message: `CUSTOM: ${errors.length} errors`,
|
|
390
|
-
original: errors,
|
|
391
|
-
workflowId: 'custom',
|
|
392
|
-
state: {} as any,
|
|
393
|
-
logs: [],
|
|
394
|
-
});
|
|
395
|
-
|
|
396
|
-
const workflow = new TestWorkflow('Test');
|
|
397
|
-
const result = await workflow.run();
|
|
398
|
-
|
|
399
|
-
expect(result.message).toBe('CUSTOM: 3 errors');
|
|
400
|
-
});
|
|
401
|
-
```
|
|
402
|
-
|
|
403
|
-
### 3. Backward Compatibility Test
|
|
404
|
-
|
|
405
|
-
```typescript
|
|
406
|
-
it('should throw first error when disabled', async () => {
|
|
407
|
-
const workflow = new TestWorkflow('Test');
|
|
408
|
-
const result = await workflow.run();
|
|
409
|
-
|
|
410
|
-
expect(result.message).toContain('First error');
|
|
411
|
-
expect(result.message).not.toContain('Second error');
|
|
412
|
-
});
|
|
413
|
-
```
|
|
414
|
-
|
|
415
|
-
### 4. Event Emission Test
|
|
416
|
-
|
|
417
|
-
```typescript
|
|
418
|
-
it('should emit error event with merged error', async () => {
|
|
419
|
-
const events: WorkflowEvent[] = [];
|
|
420
|
-
const workflow = new TestWorkflow('Test');
|
|
421
|
-
|
|
422
|
-
workflow.addObserver({
|
|
423
|
-
onEvent: (e) => events.push(e),
|
|
424
|
-
onLog: () => {},
|
|
425
|
-
onStateUpdated: () => {},
|
|
426
|
-
onTreeChanged: () => {},
|
|
427
|
-
});
|
|
428
|
-
|
|
429
|
-
await workflow.run();
|
|
430
|
-
|
|
431
|
-
const errorEvents = events.filter(e => e.type === 'error');
|
|
432
|
-
expect(errorEvents[0].error.message).toContain('concurrent errors');
|
|
433
|
-
});
|
|
434
|
-
```
|
|
435
|
-
|
|
436
|
-
---
|
|
437
|
-
|
|
438
|
-
## Helper Functions
|
|
439
|
-
|
|
440
|
-
### Error Creation Helpers
|
|
441
|
-
|
|
442
|
-
```typescript
|
|
443
|
-
function createMockError(overrides?: Partial<WorkflowError>): WorkflowError {
|
|
444
|
-
return {
|
|
445
|
-
message: 'Mock error',
|
|
446
|
-
original: new Error('Mock'),
|
|
447
|
-
workflowId: 'mock-workflow',
|
|
448
|
-
state: {} as any,
|
|
449
|
-
logs: [],
|
|
450
|
-
...overrides
|
|
451
|
-
};
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
function createFailingWorkflow(parent: Workflow, name: string, errorMessage: string): Workflow {
|
|
455
|
-
return new (class extends Workflow {
|
|
456
|
-
async run() {
|
|
457
|
-
throw new Error(errorMessage);
|
|
458
|
-
}
|
|
459
|
-
})(name, parent);
|
|
460
|
-
}
|
|
461
|
-
```
|
|
462
|
-
|
|
463
|
-
### Type Guards
|
|
464
|
-
|
|
465
|
-
```typescript
|
|
466
|
-
function isWorkflowError(error: unknown): error is WorkflowError {
|
|
467
|
-
return (
|
|
468
|
-
typeof error === 'object' &&
|
|
469
|
-
error !== null &&
|
|
470
|
-
'message' in error &&
|
|
471
|
-
'workflowId' in error &&
|
|
472
|
-
'logs' in error
|
|
473
|
-
);
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
function isRejected(result: PromiseSettledResult<unknown>): result is PromiseRejectedResult {
|
|
477
|
-
return result.status === 'rejected';
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
function isFulfilled<T>(result: PromiseSettledResult<T>): result is PromiseFulfilledResult<T> {
|
|
481
|
-
return result.status === 'fulfilled';
|
|
482
|
-
}
|
|
483
|
-
```
|
|
484
|
-
|
|
485
|
-
### Test Setup Helpers
|
|
486
|
-
|
|
487
|
-
```typescript
|
|
488
|
-
function setupEventObserver(workflow: Workflow): WorkflowEvent[] {
|
|
489
|
-
const events: WorkflowEvent[] = [];
|
|
490
|
-
workflow.addObserver({
|
|
491
|
-
onLog: () => {},
|
|
492
|
-
onEvent: (e) => events.push(e),
|
|
493
|
-
onStateUpdated: () => {},
|
|
494
|
-
onTreeChanged: () => {},
|
|
495
|
-
});
|
|
496
|
-
return events;
|
|
497
|
-
}
|
|
498
|
-
```
|
|
499
|
-
|
|
500
|
-
---
|
|
501
|
-
|
|
502
|
-
## Best Practices Checklist
|
|
503
|
-
|
|
504
|
-
### Test Structure
|
|
505
|
-
- [ ] Use nested `describe` blocks for organization
|
|
506
|
-
- [ ] Follow ARRANGE-ACT-ASSERT pattern
|
|
507
|
-
- [ ] Keep tests independent (no shared state)
|
|
508
|
-
- [ ] Use descriptive test names
|
|
509
|
-
|
|
510
|
-
### Error Testing
|
|
511
|
-
- [ ] Test empty, single, and multiple error scenarios
|
|
512
|
-
- [ ] Verify all error properties are preserved
|
|
513
|
-
- [ ] Test both default and custom mergers
|
|
514
|
-
- [ ] Ensure backward compatibility
|
|
515
|
-
|
|
516
|
-
### Assertions
|
|
517
|
-
- [ ] Use `toMatchObject` for partial matching
|
|
518
|
-
- [ ] Use type guards for complex objects
|
|
519
|
-
- [ ] Test both positive and negative cases
|
|
520
|
-
- [ ] Include edge cases (0 errors, 1 error, 100+ errors)
|
|
521
|
-
|
|
522
|
-
### Performance
|
|
523
|
-
- [ ] Test with large error counts (10+, 100+)
|
|
524
|
-
- [ ] Verify concurrent execution (not sequential)
|
|
525
|
-
- [ ] Check for memory leaks
|
|
526
|
-
- [ ] Ensure no hanging promises
|
|
527
|
-
|
|
528
|
-
### Event Testing
|
|
529
|
-
- [ ] Verify error events are emitted
|
|
530
|
-
- [ ] Check event structure is correct
|
|
531
|
-
- [ ] Ensure events propagate to observers
|
|
532
|
-
- [ ] Test event ordering when relevant
|
|
533
|
-
|
|
534
|
-
---
|
|
535
|
-
|
|
536
|
-
## Common Pitfalls
|
|
537
|
-
|
|
538
|
-
### 1. Not Testing Empty Array
|
|
539
|
-
```typescript
|
|
540
|
-
// Bad: Doesn't test empty case
|
|
541
|
-
it('should merge errors', () => {
|
|
542
|
-
const result = mergeErrors([error1, error2]);
|
|
543
|
-
expect(result).toBeDefined();
|
|
544
|
-
});
|
|
545
|
-
|
|
546
|
-
// Good: Tests empty case
|
|
547
|
-
it('should throw on empty array', () => {
|
|
548
|
-
expect(() => mergeErrors([])).toThrow();
|
|
549
|
-
});
|
|
550
|
-
```
|
|
551
|
-
|
|
552
|
-
### 2. Only Testing with 2 Errors
|
|
553
|
-
```typescript
|
|
554
|
-
// Bad: Only tests 2 errors (edge case)
|
|
555
|
-
it('should merge two errors', () => {
|
|
556
|
-
const result = mergeErrors([error1, error2]);
|
|
557
|
-
expect(result.message).toContain('2 errors');
|
|
558
|
-
});
|
|
559
|
-
|
|
560
|
-
// Good: Tests 3+ errors (tests pluralization)
|
|
561
|
-
it('should merge multiple errors', () => {
|
|
562
|
-
const result = mergeErrors([error1, error2, error3]);
|
|
563
|
-
expect(result.message).toContain('3 concurrent errors');
|
|
564
|
-
});
|
|
565
|
-
```
|
|
566
|
-
|
|
567
|
-
### 3. Not Verifying All Properties
|
|
568
|
-
```typescript
|
|
569
|
-
// Bad: Only checks message
|
|
570
|
-
it('should merge errors', () => {
|
|
571
|
-
const result = mergeErrors([error1, error2]);
|
|
572
|
-
expect(result.message).toBeDefined();
|
|
573
|
-
});
|
|
574
|
-
|
|
575
|
-
// Good: Checks all properties
|
|
576
|
-
it('should merge all error properties', () => {
|
|
577
|
-
const result = mergeErrors([error1, error2]);
|
|
578
|
-
expect(result.message).toBeDefined();
|
|
579
|
-
expect(result.workflowId).toBeDefined();
|
|
580
|
-
expect(result.stack).toBeDefined();
|
|
581
|
-
expect(result.logs).toBeDefined();
|
|
582
|
-
expect(result.original).toEqual([error1, error2]);
|
|
583
|
-
});
|
|
584
|
-
```
|
|
585
|
-
|
|
586
|
-
### 4. Not Testing Backward Compatibility
|
|
587
|
-
```typescript
|
|
588
|
-
// Bad: Only tests new behavior
|
|
589
|
-
it('should merge errors when enabled', async () => {
|
|
590
|
-
const workflow = new TestWorkflow('Test');
|
|
591
|
-
const result = await workflow.run();
|
|
592
|
-
expect(result.message).toContain('concurrent errors');
|
|
593
|
-
});
|
|
594
|
-
|
|
595
|
-
// Good: Tests both old and new behavior
|
|
596
|
-
it('should maintain backward compatibility when disabled', async () => {
|
|
597
|
-
const workflow = new TestWorkflow('Test');
|
|
598
|
-
const result = await workflow.run();
|
|
599
|
-
expect(result.message).not.toContain('concurrent errors');
|
|
600
|
-
expect(result.message).toContain('First error');
|
|
601
|
-
});
|
|
602
|
-
```
|
|
603
|
-
|
|
604
|
-
---
|
|
605
|
-
|
|
606
|
-
## External Resources
|
|
607
|
-
|
|
608
|
-
### Documentation
|
|
609
|
-
- **Vitest Guide:** https://vitest.dev/guide/
|
|
610
|
-
- **Promise.allSettled MDN:** https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/allSettled
|
|
611
|
-
- **TypeScript Handbook:** https://www.typescriptlang.org/docs/handbook/intro.html
|
|
612
|
-
|
|
613
|
-
### Related Projects
|
|
614
|
-
- **Jest:** https://jestjs.io/
|
|
615
|
-
- **Testing Library:** https://testing-library.com/
|
|
616
|
-
|
|
617
|
-
### Design Patterns
|
|
618
|
-
- **Strategy Pattern:** Pluggable error merge strategies
|
|
619
|
-
- **Observer Pattern:** Error event emission
|
|
620
|
-
- **Aggregate Pattern:** Combining multiple errors
|
|
621
|
-
|
|
622
|
-
---
|
|
623
|
-
|
|
624
|
-
## Success Criteria
|
|
625
|
-
|
|
626
|
-
### Functional Requirements
|
|
627
|
-
- ✅ ErrorMergeStrategy interface in TaskOptions
|
|
628
|
-
- ✅ Default error merger implemented
|
|
629
|
-
- ✅ Custom combine function supported
|
|
630
|
-
- ✅ maxMergeDepth parameter working
|
|
631
|
-
- ✅ Error events emitted with merged errors
|
|
632
|
-
- ✅ Backward compatible (disabled throws first error)
|
|
633
|
-
|
|
634
|
-
### Test Requirements
|
|
635
|
-
- ✅ All 344+ existing tests pass
|
|
636
|
-
- ✅ New tests have 100% coverage
|
|
637
|
-
- ✅ No performance degradation
|
|
638
|
-
- ✅ No breaking changes
|
|
639
|
-
|
|
640
|
-
### Documentation Requirements
|
|
641
|
-
- ✅ JSDoc comments on public functions
|
|
642
|
-
- ✅ Code examples in tests
|
|
643
|
-
- ✅ PRD updated if needed
|
|
644
|
-
|
|
645
|
-
---
|
|
646
|
-
|
|
647
|
-
## Next Steps
|
|
648
|
-
|
|
649
|
-
1. **Implement mergeWorkflowErrors()** in `src/utils/error-merger.ts`
|
|
650
|
-
2. **Update @Task decorator** to use error merge strategy
|
|
651
|
-
3. **Create comprehensive test suite** in `src/__tests__/unit/error-merge-strategy.test.ts`
|
|
652
|
-
4. **Run all tests** to ensure no regressions
|
|
653
|
-
5. **Update documentation** with new behavior
|
|
654
|
-
|
|
655
|
-
---
|
|
656
|
-
|
|
657
|
-
## Questions?
|
|
658
|
-
|
|
659
|
-
Refer to individual research documents for detailed information:
|
|
660
|
-
- Implementation guide: `02-error-merge-strategy-testing-guide.md`
|
|
661
|
-
- Testing patterns: `01-testing-aggregated-errors.md`
|
|
662
|
-
- Promise.allSettled: `03-promise-allsettled-testing-patterns.md`
|
|
663
|
-
|
|
664
|
-
---
|
|
665
|
-
|
|
666
|
-
**Last Updated:** 2026-01-12
|
|
667
|
-
**Status:** Research Complete
|
|
668
|
-
**Next Phase:** Implementation (P1.M2.T2.S2)
|