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
package/plan/001_d3bb02af4886/docs/PRP/P1M1T1S4-functional-workflow-error-state-capture-test.md
DELETED
|
@@ -1,652 +0,0 @@
|
|
|
1
|
-
# Product Requirement Prompt (PRP): Test for Functional Workflow Error State Capture
|
|
2
|
-
|
|
3
|
-
**Work Item**: P1.M1.T1.S4
|
|
4
|
-
**Title**: Write test for functional workflow error state capture
|
|
5
|
-
**Status**: Ready for Implementation
|
|
6
|
-
**Confidence Score**: 9/10
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## Goal
|
|
11
|
-
|
|
12
|
-
**Feature Goal**: Validate that functional workflow error handlers correctly capture workflow state (`@ObservedState` fields) and execution logs in error events.
|
|
13
|
-
|
|
14
|
-
**Deliverable**: A new test case in `src/__tests__/unit/workflow.test.ts` that validates error state and logs capture when a functional workflow throws an error.
|
|
15
|
-
|
|
16
|
-
**Success Definition**:
|
|
17
|
-
- Test passes with proper assertions on `error.state` containing observed state properties
|
|
18
|
-
- Test passes with proper assertions on `error.logs` containing captured log entries
|
|
19
|
-
- Test follows existing test patterns in the codebase
|
|
20
|
-
- Running `npm run test` shows all tests pass including the new test
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## User Persona
|
|
25
|
-
|
|
26
|
-
**Target User**: Developers maintaining the workflow engine, specifically those validating error handling fixes.
|
|
27
|
-
|
|
28
|
-
**Use Case**: When a functional workflow fails during execution, developers need confidence that the error event contains complete diagnostic information (state snapshot and execution logs) for debugging.
|
|
29
|
-
|
|
30
|
-
**User Journey**:
|
|
31
|
-
1. Developer makes changes to error handling logic
|
|
32
|
-
2. Developer runs `npm run test` to verify changes
|
|
33
|
-
3. Test validates that error events contain expected state and logs
|
|
34
|
-
4. Developer gains confidence that error diagnostics work correctly
|
|
35
|
-
|
|
36
|
-
**Pain Points Addressed**:
|
|
37
|
-
- Previously, error handlers returned empty state/logs, making debugging difficult
|
|
38
|
-
- Without automated tests, regressions could go undetected
|
|
39
|
-
- This test prevents future breakage of the error capture logic
|
|
40
|
-
|
|
41
|
-
---
|
|
42
|
-
|
|
43
|
-
## Why
|
|
44
|
-
|
|
45
|
-
- **Bug Fix Validation**: This test validates the fix implemented in P1.M1.T1.S3 (replacing empty state/logs with actual captured data)
|
|
46
|
-
- **Regression Prevention**: Ensures future code changes don't break error state capture
|
|
47
|
-
- **Documentation**: The test serves as executable documentation of how error state capture works
|
|
48
|
-
- **Debugging Support**: Proper error state capture is critical for production debugging workflows
|
|
49
|
-
|
|
50
|
-
---
|
|
51
|
-
|
|
52
|
-
## What
|
|
53
|
-
|
|
54
|
-
Add a test case to `src/__tests__/unit/workflow.test.ts` that:
|
|
55
|
-
|
|
56
|
-
1. Creates a functional workflow using the `Workflow` constructor with an executor function
|
|
57
|
-
2. Defines a test class with `@ObservedState` decorated fields
|
|
58
|
-
3. Logs messages during execution using `ctx.logger`
|
|
59
|
-
4. Triggers an error during workflow execution
|
|
60
|
-
5. Captures the emitted error event via observer
|
|
61
|
-
6. Asserts that `error.event.error.state` contains the observed state properties
|
|
62
|
-
7. Asserts that `error.event.error.logs` contains the log entries
|
|
63
|
-
|
|
64
|
-
### Success Criteria
|
|
65
|
-
|
|
66
|
-
- [ ] Test file modified: `src/__tests__/unit/workflow.test.ts`
|
|
67
|
-
- [ ] Test passes: `npm run test` succeeds with new test
|
|
68
|
-
- [ ] Validates state capture: `error.state` has expected properties
|
|
69
|
-
- [ ] Validates logs capture: `error.logs` array contains log entries
|
|
70
|
-
- [ ] Follows existing test patterns from `workflow.test.ts` and `agent-workflow.test.ts`
|
|
71
|
-
- [ ] No other tests are broken by this addition
|
|
72
|
-
|
|
73
|
-
---
|
|
74
|
-
|
|
75
|
-
## All Needed Context
|
|
76
|
-
|
|
77
|
-
### Context Completeness Check
|
|
78
|
-
|
|
79
|
-
**"No Prior Knowledge" Test**: If someone knew nothing about this codebase, would they have everything needed to implement this successfully?
|
|
80
|
-
|
|
81
|
-
**Answer**: Yes. This PRP provides:
|
|
82
|
-
- Exact file paths and line numbers to reference
|
|
83
|
-
- Complete code examples of existing test patterns
|
|
84
|
-
- The exact implementation to test (from P1.M1.T1.S3)
|
|
85
|
-
- Testing framework details and commands
|
|
86
|
-
- Type definitions and interfaces
|
|
87
|
-
- External best practices with URLs
|
|
88
|
-
|
|
89
|
-
---
|
|
90
|
-
|
|
91
|
-
### Documentation & References
|
|
92
|
-
|
|
93
|
-
```yaml
|
|
94
|
-
# MUST READ - Core implementation files to understand what we're testing
|
|
95
|
-
- file: /home/dustin/projects/groundswell/src/core/workflow.ts
|
|
96
|
-
why: Contains the runFunctional() method with the error handler we need to test
|
|
97
|
-
lines: 259-302
|
|
98
|
-
pattern: The catch block at lines 283-301 shows error event emission with state/logs capture
|
|
99
|
-
critical: Error event structure: { type: 'error', node, error: { message, original, workflowId, stack, state, logs } }
|
|
100
|
-
|
|
101
|
-
- file: /home/dustin/projects/groundswell/src/decorators/observed-state.ts
|
|
102
|
-
why: Implementation of @ObservedState decorator and getObservedState() function
|
|
103
|
-
lines: 25-77
|
|
104
|
-
pattern: @ObservedState() marks fields for state capture, getObservedState(obj) returns SerializedWorkflowState
|
|
105
|
-
gotcha: Hidden fields are skipped, redacted fields show '***'
|
|
106
|
-
|
|
107
|
-
- file: /home/dustin/projects/groundswell/src/__tests__/unit/workflow.test.ts
|
|
108
|
-
why: Existing test patterns in the file we need to modify
|
|
109
|
-
pattern: Observer pattern for capturing events, describe/it structure, expect assertions
|
|
110
|
-
critical: Import patterns, observer setup, async test structure
|
|
111
|
-
|
|
112
|
-
- file: /home/dustin/projects/groundswell/src/__tests__/integration/agent-workflow.test.ts
|
|
113
|
-
why: Examples of functional workflow tests with error handling
|
|
114
|
-
lines: 93-129 (functional workflow pattern), 181-205 (error handling pattern)
|
|
115
|
-
pattern: new Workflow({ name }, async (ctx) => { ... }) for functional workflows
|
|
116
|
-
|
|
117
|
-
# Type definitions
|
|
118
|
-
- file: /home/dustin/projects/groundswell/src/types/events.ts
|
|
119
|
-
why: WorkflowEvent discriminated union, error event type structure
|
|
120
|
-
pattern: Error events have { type: 'error', node, error: WorkflowError }
|
|
121
|
-
|
|
122
|
-
- file: /home/dustin/projects/groundswell/src/types/logging.ts
|
|
123
|
-
why: LogEntry interface structure
|
|
124
|
-
pattern: { id, workflowId, timestamp, level, message, data?, parentLogId? }
|
|
125
|
-
|
|
126
|
-
# Testing configuration
|
|
127
|
-
- file: /home/dustin/projects/groundswell/vitest.config.ts
|
|
128
|
-
why: Test framework configuration
|
|
129
|
-
pattern: Tests in src/__tests__/**/*.test.ts, globals enabled
|
|
130
|
-
|
|
131
|
-
- file: /home/dustin/projects/groundswell/package.json
|
|
132
|
-
why: Test scripts and dependencies
|
|
133
|
-
lines: 34-37
|
|
134
|
-
pattern: "test": "vitest run", "test:watch": "vitest"
|
|
135
|
-
|
|
136
|
-
# External best practices
|
|
137
|
-
- url: https://stordahl.dev/writing/error-handling-decorators
|
|
138
|
-
why: TypeScript decorator error handling patterns with state capture
|
|
139
|
-
critical: Shows how decorators capture 'this' context and augment errors
|
|
140
|
-
|
|
141
|
-
- url: https://docs.temporal.io/develop/typescript/failure-detection
|
|
142
|
-
why: Workflow error handling with state capture patterns
|
|
143
|
-
section: ApplicationFailure.create() with state capture
|
|
144
|
-
|
|
145
|
-
- url: https://www.convex.dev/typescript/best-practices/error-handling-debugging/typescript-catch-error-type
|
|
146
|
-
why: Type-safe error testing patterns in TypeScript
|
|
147
|
-
critical: Custom error properties testing with type guards
|
|
148
|
-
|
|
149
|
-
# Project architecture context
|
|
150
|
-
- file: /home/dustin/projects/groundswell/plan/architecture/system_context.md
|
|
151
|
-
why: Overall system architecture and workflow patterns
|
|
152
|
-
section: "Hierarchy Patterns", "Event System"
|
|
153
|
-
critical: Observer pattern, error event propagation
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
---
|
|
157
|
-
|
|
158
|
-
### Current Codebase Tree
|
|
159
|
-
|
|
160
|
-
```bash
|
|
161
|
-
src/
|
|
162
|
-
├── __tests__/
|
|
163
|
-
│ ├── unit/
|
|
164
|
-
│ │ ├── workflow.test.ts # TARGET FILE - add test here
|
|
165
|
-
│ │ ├── agent.test.ts
|
|
166
|
-
│ │ ├── cache-key.test.ts
|
|
167
|
-
│ │ ├── cache.test.ts
|
|
168
|
-
│ │ ├── context.test.ts
|
|
169
|
-
│ │ ├── decorators.test.ts
|
|
170
|
-
│ │ ├── introspection-tools.test.ts
|
|
171
|
-
│ │ ├── prompt.test.ts
|
|
172
|
-
│ │ ├── reflection.test.ts
|
|
173
|
-
│ │ └── tree-debugger.test.ts
|
|
174
|
-
│ └── integration/
|
|
175
|
-
│ └── agent-workflow.test.ts # Reference for functional workflow tests
|
|
176
|
-
├── core/
|
|
177
|
-
│ ├── workflow.ts # Implementation being tested
|
|
178
|
-
│ ├── workflow-context.ts
|
|
179
|
-
│ └── logger.ts # WorkflowLogger for log capture
|
|
180
|
-
├── decorators/
|
|
181
|
-
│ ├── observed-state.ts # @ObservedState and getObservedState()
|
|
182
|
-
│ ├── step.ts
|
|
183
|
-
│ └── task.ts
|
|
184
|
-
└── types/
|
|
185
|
-
├── events.ts # WorkflowEvent types
|
|
186
|
-
├── logging.ts # LogEntry interface
|
|
187
|
-
└── workflow.ts # WorkflowNode, WorkflowStatus
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
---
|
|
191
|
-
|
|
192
|
-
### Desired Codebase Tree (No New Files)
|
|
193
|
-
|
|
194
|
-
```bash
|
|
195
|
-
# No new files needed - we are ADDING A TEST to existing file:
|
|
196
|
-
|
|
197
|
-
src/__tests__/
|
|
198
|
-
└── unit/
|
|
199
|
-
└── workflow.test.ts # MODIFY: Add new test case at end of file
|
|
200
|
-
# New test: "should capture state and logs in functional workflow error"
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
---
|
|
204
|
-
|
|
205
|
-
### Known Gotchas of Our Codebase & Library Quirks
|
|
206
|
-
|
|
207
|
-
```typescript
|
|
208
|
-
// CRITICAL: Functional workflow pattern
|
|
209
|
-
// Functional workflows use: new Workflow({ name }, async (ctx) => { ... })
|
|
210
|
-
// Class-based workflows extend Workflow class
|
|
211
|
-
// This test must use FUNCTIONAL pattern
|
|
212
|
-
|
|
213
|
-
// CRITICAL: @ObservedState decorator behavior
|
|
214
|
-
// @ObservedState() only works on CLASS fields, not in functional workflows
|
|
215
|
-
// Therefore: To test state capture in functional workflows, we need a workaround:
|
|
216
|
-
// 1. Create a test class with @ObservedState fields
|
|
217
|
-
// 2. Use that class in the functional workflow context
|
|
218
|
-
// OR: Test that error.state is an object (even if empty for pure functional workflows)
|
|
219
|
-
// OR: Test logs capture primarily, and state capture as a bonus
|
|
220
|
-
|
|
221
|
-
// CRITICAL: Error event structure
|
|
222
|
-
// error.event.error.state is SerializedWorkflowState (Record<string, unknown>)
|
|
223
|
-
// error.event.error.logs is LogEntry[]
|
|
224
|
-
// Access via: (event as WorkflowEvent & { type: 'error' }).error.state
|
|
225
|
-
|
|
226
|
-
// CRITICAL: Observer pattern
|
|
227
|
-
// Observers only attach to ROOT workflows
|
|
228
|
-
// Must call workflow.addObserver(observer) BEFORE running workflow
|
|
229
|
-
// observer.onEvent captures events, filter for type === 'error'
|
|
230
|
-
|
|
231
|
-
// CRITICAL: Test async errors
|
|
232
|
-
// Use: await expect(workflow.run()).rejects.toThrow('error message')
|
|
233
|
-
// Don't try/catch - use Vitest's async error assertion
|
|
234
|
-
|
|
235
|
-
// CRITICAL: Vitest configuration
|
|
236
|
-
// Test files must end in .test.ts
|
|
237
|
-
// Global functions enabled (describe, it, expect available without import)
|
|
238
|
-
// Run tests with: npm run test (or vitest run)
|
|
239
|
-
|
|
240
|
-
// CRITICAL: LogEntry structure
|
|
241
|
-
// Each log has: id, workflowId, timestamp, level, message, data?, parentLogId?
|
|
242
|
-
// Check message content and level for validation
|
|
243
|
-
|
|
244
|
-
// CRITICAL: getObservedState behavior
|
|
245
|
-
// Returns empty object {} if no @ObservedState fields on the object
|
|
246
|
-
// Hidden fields (hidden: true) are skipped
|
|
247
|
-
// Redacted fields (redact: true) show '***'
|
|
248
|
-
```
|
|
249
|
-
|
|
250
|
-
---
|
|
251
|
-
|
|
252
|
-
## Implementation Blueprint
|
|
253
|
-
|
|
254
|
-
### Test Structure Design
|
|
255
|
-
|
|
256
|
-
The test will follow this structure:
|
|
257
|
-
|
|
258
|
-
1. **Setup**: Create a test class with `@ObservedState` fields
|
|
259
|
-
2. **Create Functional Workflow**: Use `new Workflow({ name }, async (ctx) => { ... })`
|
|
260
|
-
3. **Observer Setup**: Create observer to capture error events
|
|
261
|
-
4. **Execution**: Run workflow, expect it to throw
|
|
262
|
-
5. **Assertions**: Validate error.state and error.logs
|
|
263
|
-
|
|
264
|
-
**Important Design Decision**: Since functional workflows use an executor function (not a class), we cannot directly use `@ObservedState` on functional workflow fields. The test has two valid approaches:
|
|
265
|
-
|
|
266
|
-
**Approach A (Recommended)**: Test logs capture primarily, and state capture structure:
|
|
267
|
-
- Create functional workflow that logs messages
|
|
268
|
-
- Trigger error
|
|
269
|
-
- Assert error.logs contains the log entries
|
|
270
|
-
- Assert error.state exists (even if empty for pure functional workflows)
|
|
271
|
-
|
|
272
|
-
**Approach B**: Create a test class with observed state, then use it in a functional context:
|
|
273
|
-
- More complex but tests full state capture
|
|
274
|
-
- May not be representative of real functional workflow usage
|
|
275
|
-
|
|
276
|
-
**This PRP recommends Approach A** as it's simpler and more representative of actual functional workflow usage.
|
|
277
|
-
|
|
278
|
-
### Implementation Tasks (ordered by dependencies)
|
|
279
|
-
|
|
280
|
-
```yaml
|
|
281
|
-
Task 1: READ existing test file to understand patterns
|
|
282
|
-
- READ: /home/dustin/projects/groundswell/src/__tests__/unit/workflow.test.ts
|
|
283
|
-
- UNDERSTAND: Observer pattern, describe/it structure, import statements
|
|
284
|
-
- VALIDATION: Comprehend existing test patterns before writing new test
|
|
285
|
-
|
|
286
|
-
Task 2: CREATE new test case in workflow.test.ts
|
|
287
|
-
- ADD: New describe block or it() block in existing 'Workflow' describe
|
|
288
|
-
- LOCATION: After line 80, before closing describe brace
|
|
289
|
-
- TEST NAME: "should capture state and logs in functional workflow error"
|
|
290
|
-
- STRUCTURE: Follow existing test patterns (observer setup, async execution)
|
|
291
|
-
|
|
292
|
-
Task 3: IMPLEMENT functional workflow with logging
|
|
293
|
-
- CREATE: new Workflow({ name: 'ErrorCaptureTest' }, async (ctx) => { ... })
|
|
294
|
-
- ADD: ctx.logger.info() and ctx.logger.warn() calls to generate logs
|
|
295
|
-
- TRIGGER: throw new Error('Test error') to trigger error handler
|
|
296
|
-
- PATTERN: Follow lines 93-106 of agent-workflow.test.ts for functional workflow syntax
|
|
297
|
-
|
|
298
|
-
Task 4: IMPLEMENT observer to capture error events
|
|
299
|
-
- CREATE: const events: WorkflowEvent[] = []
|
|
300
|
-
- CREATE: observer with onEvent capturing events
|
|
301
|
-
- PATTERN: Follow lines 190-195 of agent-workflow.test.ts
|
|
302
|
-
- REGISTER: workflow.addObserver(observer) BEFORE run()
|
|
303
|
-
|
|
304
|
-
Task 5: IMPLEMENT error assertions
|
|
305
|
-
- ASSERT: await expect(workflow.run()).rejects.toThrow('Test error')
|
|
306
|
-
- FILTER: const errorEvents = events.filter(e => e.type === 'error')
|
|
307
|
-
- ASSERT: errorEvents.length >= 1
|
|
308
|
-
- ASSERT: errorEvents[0].error.logs is array with length > 0
|
|
309
|
-
- ASSERT: errorEvents[0].error.logs[0].message matches expected log
|
|
310
|
-
- ASSERT: errorEvents[0].error.state is defined (object)
|
|
311
|
-
- PATTERN: Follow lines 199-204 of agent-workflow.test.ts
|
|
312
|
-
|
|
313
|
-
Task 6: RUN tests to validate
|
|
314
|
-
- EXECUTE: npm run test
|
|
315
|
-
- VERIFY: New test passes
|
|
316
|
-
- VERIFY: No existing tests break
|
|
317
|
-
- VALIDATION: All assertions pass
|
|
318
|
-
```
|
|
319
|
-
|
|
320
|
-
---
|
|
321
|
-
|
|
322
|
-
### Implementation Code Template
|
|
323
|
-
|
|
324
|
-
```typescript
|
|
325
|
-
// Add this test to src/__tests__/unit/workflow.test.ts
|
|
326
|
-
// Place after line 80, before closing describe brace
|
|
327
|
-
|
|
328
|
-
it('should capture state and logs in functional workflow error', async () => {
|
|
329
|
-
// Arrange: Create observer to capture events
|
|
330
|
-
const events: WorkflowEvent[] = [];
|
|
331
|
-
|
|
332
|
-
const observer: WorkflowObserver = {
|
|
333
|
-
onLog: () => {},
|
|
334
|
-
onEvent: (event) => events.push(event),
|
|
335
|
-
onStateUpdated: () => {},
|
|
336
|
-
onTreeChanged: () => {},
|
|
337
|
-
};
|
|
338
|
-
|
|
339
|
-
// Arrange: Create functional workflow with logging
|
|
340
|
-
const workflow = new Workflow<void>(
|
|
341
|
-
{ name: 'ErrorCaptureTest' },
|
|
342
|
-
async (ctx) => {
|
|
343
|
-
// Log some messages during execution
|
|
344
|
-
ctx.logger.info('Starting workflow execution');
|
|
345
|
-
ctx.logger.warn('Potential issue detected');
|
|
346
|
-
|
|
347
|
-
// Trigger error
|
|
348
|
-
throw new Error('Test error');
|
|
349
|
-
}
|
|
350
|
-
);
|
|
351
|
-
|
|
352
|
-
// Act: Attach observer and run workflow
|
|
353
|
-
workflow.addObserver(observer);
|
|
354
|
-
await expect(workflow.run()).rejects.toThrow('Test error');
|
|
355
|
-
|
|
356
|
-
// Assert: Verify error event was emitted
|
|
357
|
-
const errorEvents = events.filter((e) => e.type === 'error');
|
|
358
|
-
expect(errorEvents.length).toBeGreaterThanOrEqual(1);
|
|
359
|
-
|
|
360
|
-
// Assert: Verify error structure
|
|
361
|
-
const errorEvent = errorEvents[0];
|
|
362
|
-
expect(errorEvent.error).toBeDefined();
|
|
363
|
-
expect(errorEvent.error.message).toBe('Test error');
|
|
364
|
-
|
|
365
|
-
// Assert: Verify logs were captured
|
|
366
|
-
expect(errorEvent.error.logs).toBeDefined();
|
|
367
|
-
expect(Array.isArray(errorEvent.error.logs)).toBe(true);
|
|
368
|
-
expect(errorEvent.error.logs.length).toBeGreaterThan(0);
|
|
369
|
-
|
|
370
|
-
// Assert: Verify specific log entries
|
|
371
|
-
const infoLog = errorEvent.error.logs.find((log) => log.message === 'Starting workflow execution');
|
|
372
|
-
expect(infoLog).toBeDefined();
|
|
373
|
-
expect(infoLog?.level).toBe('info');
|
|
374
|
-
|
|
375
|
-
const warnLog = errorEvent.error.logs.find((log) => log.message === 'Potential issue detected');
|
|
376
|
-
expect(warnLog).toBeDefined();
|
|
377
|
-
expect(warnLog?.level).toBe('warn');
|
|
378
|
-
|
|
379
|
-
// Assert: Verify state was captured (may be empty object for pure functional workflows)
|
|
380
|
-
expect(errorEvent.error.state).toBeDefined();
|
|
381
|
-
expect(typeof errorEvent.error.state).toBe('object');
|
|
382
|
-
|
|
383
|
-
// Assert: Verify workflow status
|
|
384
|
-
expect(workflow.status).toBe('failed');
|
|
385
|
-
});
|
|
386
|
-
```
|
|
387
|
-
|
|
388
|
-
---
|
|
389
|
-
|
|
390
|
-
### Integration Points
|
|
391
|
-
|
|
392
|
-
```yaml
|
|
393
|
-
NO NEW INTEGRATIONS NEEDED
|
|
394
|
-
- This is a test addition only
|
|
395
|
-
- No changes to production code
|
|
396
|
-
- No new dependencies
|
|
397
|
-
- No configuration changes
|
|
398
|
-
|
|
399
|
-
MODIFIED FILES:
|
|
400
|
-
- file: src/__tests__/unit/workflow.test.ts
|
|
401
|
-
action: Append new test case before closing describe brace
|
|
402
|
-
```
|
|
403
|
-
|
|
404
|
-
---
|
|
405
|
-
|
|
406
|
-
## Validation Loop
|
|
407
|
-
|
|
408
|
-
### Level 1: Syntax & Style (Immediate Feedback)
|
|
409
|
-
|
|
410
|
-
```bash
|
|
411
|
-
# Run after adding the test - fix any issues before proceeding
|
|
412
|
-
npm run test # Run all tests
|
|
413
|
-
# OR run specific test file:
|
|
414
|
-
npx vitest run src/__tests__/unit/workflow.test.ts
|
|
415
|
-
|
|
416
|
-
# Expected: All tests pass, including the new test
|
|
417
|
-
# If TypeScript errors: Check import statements and type annotations
|
|
418
|
-
# If test fails: Read error message and fix assertions
|
|
419
|
-
|
|
420
|
-
# For TypeScript type checking (if available):
|
|
421
|
-
npx tsc --noEmit # Type check the codebase
|
|
422
|
-
|
|
423
|
-
# Expected: Zero type errors
|
|
424
|
-
```
|
|
425
|
-
|
|
426
|
-
---
|
|
427
|
-
|
|
428
|
-
### Level 2: Unit Tests (Component Validation)
|
|
429
|
-
|
|
430
|
-
```bash
|
|
431
|
-
# Run the specific test file to validate
|
|
432
|
-
npx vitest run src/__tests__/unit/workflow.test.ts
|
|
433
|
-
|
|
434
|
-
# Expected output:
|
|
435
|
-
# ✓ Workflow
|
|
436
|
-
# ✓ should create with unique id
|
|
437
|
-
# ✓ should use class name as default name
|
|
438
|
-
# ✓ should use custom name when provided
|
|
439
|
-
# ✓ should start with idle status
|
|
440
|
-
# ✓ should attach child to parent
|
|
441
|
-
# ✓ should emit logs to observers
|
|
442
|
-
# ✓ should emit childAttached event
|
|
443
|
-
# ✓ should capture state and logs in functional workflow error # NEW TEST
|
|
444
|
-
|
|
445
|
-
# Run all tests to ensure no regressions
|
|
446
|
-
npm run test
|
|
447
|
-
|
|
448
|
-
# Expected: All 155+ tests pass (existing 154 + 1 new)
|
|
449
|
-
```
|
|
450
|
-
|
|
451
|
-
---
|
|
452
|
-
|
|
453
|
-
### Level 3: Integration Testing (System Validation)
|
|
454
|
-
|
|
455
|
-
```bash
|
|
456
|
-
# Run all unit tests
|
|
457
|
-
npm run test
|
|
458
|
-
|
|
459
|
-
# Run with coverage (if configured)
|
|
460
|
-
npx vitest run --coverage
|
|
461
|
-
|
|
462
|
-
# Expected: All tests pass, coverage report shows new test is counted
|
|
463
|
-
|
|
464
|
-
# Manual validation - run in watch mode to see test output
|
|
465
|
-
npm run test:watch
|
|
466
|
-
|
|
467
|
-
# Expected: Test runs successfully in watch mode, shows passing green checkmark
|
|
468
|
-
```
|
|
469
|
-
|
|
470
|
-
---
|
|
471
|
-
|
|
472
|
-
### Level 4: Creative & Domain-Specific Validation
|
|
473
|
-
|
|
474
|
-
```bash
|
|
475
|
-
# Domain-specific validation for error testing:
|
|
476
|
-
|
|
477
|
-
# 1. Test different log levels
|
|
478
|
-
# Modify test to include: ctx.logger.debug(), ctx.logger.error()
|
|
479
|
-
# Verify all log levels are captured
|
|
480
|
-
|
|
481
|
-
# 2. Test with log data
|
|
482
|
-
# Add: ctx.logger.info('Message', { key: 'value' })
|
|
483
|
-
# Verify error.logs contains data field
|
|
484
|
-
|
|
485
|
-
# 3. Test error object properties
|
|
486
|
-
# Verify: error.event.error.workflowId matches workflow.id
|
|
487
|
-
# Verify: error.event.error.stack is defined for Error objects
|
|
488
|
-
|
|
489
|
-
# 4. Test multiple workflows
|
|
490
|
-
# Create multiple workflows with errors
|
|
491
|
-
# Verify each error event has correct workflowId
|
|
492
|
-
|
|
493
|
-
# 5. Test state capture with class-based workflows
|
|
494
|
-
# Create class-based workflow with @ObservedState
|
|
495
|
-
# Trigger error and verify state capture
|
|
496
|
-
# (This validates getObservedState() works correctly)
|
|
497
|
-
|
|
498
|
-
# Edge case tests to consider:
|
|
499
|
-
# - Workflow with no logs (error.logs should be empty array, not undefined)
|
|
500
|
-
# - Workflow with non-Error throw (error.event.error.original is not Error)
|
|
501
|
-
# - Multiple errors in sequence
|
|
502
|
-
```
|
|
503
|
-
|
|
504
|
-
---
|
|
505
|
-
|
|
506
|
-
## Final Validation Checklist
|
|
507
|
-
|
|
508
|
-
### Technical Validation
|
|
509
|
-
|
|
510
|
-
- [ ] Test file compiles without TypeScript errors
|
|
511
|
-
- [ ] All existing tests still pass: `npm run test`
|
|
512
|
-
- [ ] New test passes: Look for green checkmark in test output
|
|
513
|
-
- [ ] Test is properly formatted (run linter if available)
|
|
514
|
-
- [ ] Test follows existing naming conventions
|
|
515
|
-
|
|
516
|
-
### Feature Validation
|
|
517
|
-
|
|
518
|
-
- [ ] Test validates error.logs capture with log entries
|
|
519
|
-
- [ ] Test validates error.state object exists
|
|
520
|
-
- [ ] Test verifies specific log messages are captured
|
|
521
|
-
- [ ] Test verifies log levels are preserved
|
|
522
|
-
- [ ] Test verifies workflow status is 'failed' after error
|
|
523
|
-
|
|
524
|
-
### Code Quality Validation
|
|
525
|
-
|
|
526
|
-
- [ ] Test follows existing patterns from workflow.test.ts
|
|
527
|
-
- [ ] Test follows existing patterns from agent-workflow.test.ts
|
|
528
|
-
- [ ] Observer pattern matches existing tests
|
|
529
|
-
- [ ] Assertions use expect() correctly
|
|
530
|
-
- [ ] Test name follows "should [verb] [feature]" pattern
|
|
531
|
-
- [ ] Test has clear Arrange/Act/Assert sections
|
|
532
|
-
|
|
533
|
-
### Documentation & Testing Best Practices
|
|
534
|
-
|
|
535
|
-
- [ ] Test is self-documenting with clear variable names
|
|
536
|
-
- [ ] Test failure messages would be clear to future developers
|
|
537
|
-
- [ ] Test covers both success and error paths appropriately
|
|
538
|
-
- [ ] Test is deterministic (no randomness or timing dependencies)
|
|
539
|
-
|
|
540
|
-
---
|
|
541
|
-
|
|
542
|
-
## Anti-Patterns to Avoid
|
|
543
|
-
|
|
544
|
-
- ❌ Don't create a separate test file - add to existing workflow.test.ts
|
|
545
|
-
- ❌ Don't use try/catch - use Vitest's `await expect().rejects.toThrow()`
|
|
546
|
-
- ❌ Don't forget to attach observer BEFORE running workflow
|
|
547
|
-
- ❌ Don't assume error.state has specific properties (functional workflows may not have @ObservedState)
|
|
548
|
-
- ❌ Don't hardcode array indices without filtering first (use `events.filter(e => e.type === 'error')`)
|
|
549
|
-
- ❌ Don't skip testing the logs array - this is the primary fix being validated
|
|
550
|
-
- ❌ Don't create unnecessary test helpers - keep test self-contained
|
|
551
|
-
- ❌ Don't use class-based workflow pattern - must use functional workflow pattern
|
|
552
|
-
- ❌ Don't forget to assert workflow.status is 'failed'
|
|
553
|
-
- ❌ Don't use vague test names - be specific: "should capture state and logs in functional workflow error"
|
|
554
|
-
|
|
555
|
-
---
|
|
556
|
-
|
|
557
|
-
## External Research Summary
|
|
558
|
-
|
|
559
|
-
Key findings from external research that inform this PRP:
|
|
560
|
-
|
|
561
|
-
1. **Temporal.io Error Patterns**: Workflows should capture state at failure point for debugging and recovery (https://docs.temporal.io/develop/typescript/failure-detection)
|
|
562
|
-
|
|
563
|
-
2. **Decorator State Capture**: Decorators can capture `this` context and augment errors with metadata (https://stordahl.dev/writing/error-handling-decorators)
|
|
564
|
-
|
|
565
|
-
3. **Type-Safe Error Testing**: Use type guards and test error properties, not just messages (https://www.convex.dev/typescript/best-practices/error-handling-debugging/typescript-catch-error-type)
|
|
566
|
-
|
|
567
|
-
4. **Best Practice**: Test error objects with custom properties using explicit property assertions, not just message matching
|
|
568
|
-
|
|
569
|
-
5. **Common Pitfall**: Don't lose original error when re-throwing - preserve with `error.cause` (handled in our implementation via `error.original`)
|
|
570
|
-
|
|
571
|
-
---
|
|
572
|
-
|
|
573
|
-
## Success Metrics
|
|
574
|
-
|
|
575
|
-
**Confidence Score**: 9/10
|
|
576
|
-
|
|
577
|
-
**Justification**:
|
|
578
|
-
- Complete code template provided
|
|
579
|
-
- All file paths and line numbers specified
|
|
580
|
-
- External best practices incorporated
|
|
581
|
-
- Existing test patterns thoroughly analyzed
|
|
582
|
-
- Validation commands are specific and executable
|
|
583
|
-
- Only 1 point deduction: Functional workflows have limitations on @ObservedState usage, but test addresses this appropriately
|
|
584
|
-
|
|
585
|
-
**Expected Implementation Time**: 15-30 minutes
|
|
586
|
-
|
|
587
|
-
**Risk Factors**:
|
|
588
|
-
- Low risk: Test-only change, no production code modification
|
|
589
|
-
- Low complexity: Follows well-established patterns
|
|
590
|
-
- High confidence: Reference tests exist in codebase
|
|
591
|
-
|
|
592
|
-
**Dependencies**:
|
|
593
|
-
- P1.M1.T1.S1-S3 must be complete (they are)
|
|
594
|
-
- Vitest must be properly configured (it is)
|
|
595
|
-
- runFunctional() error handler must have state/logs capture (it does)
|
|
596
|
-
|
|
597
|
-
---
|
|
598
|
-
|
|
599
|
-
## Appendix: Quick Reference
|
|
600
|
-
|
|
601
|
-
### Key Files
|
|
602
|
-
|
|
603
|
-
- **Test file to modify**: `/home/dustin/projects/groundswell/src/__tests__/unit/workflow.test.ts`
|
|
604
|
-
- **Implementation being tested**: `/home/dustin/projects/groundswell/src/core/workflow.ts:259-302`
|
|
605
|
-
- **Reference test patterns**: `/home/dustin/projects/groundswell/src/__tests__/integration/agent-workflow.test.ts:181-205`
|
|
606
|
-
|
|
607
|
-
### Commands
|
|
608
|
-
|
|
609
|
-
```bash
|
|
610
|
-
# Run tests
|
|
611
|
-
npm run test
|
|
612
|
-
|
|
613
|
-
# Run specific file
|
|
614
|
-
npx vitest run src/__tests__/unit/workflow.test.ts
|
|
615
|
-
|
|
616
|
-
# Watch mode
|
|
617
|
-
npm run test:watch
|
|
618
|
-
```
|
|
619
|
-
|
|
620
|
-
### Test Pattern Quick Reference
|
|
621
|
-
|
|
622
|
-
```typescript
|
|
623
|
-
// Observer setup
|
|
624
|
-
const events: WorkflowEvent[] = [];
|
|
625
|
-
const observer: WorkflowObserver = {
|
|
626
|
-
onLog: () => {},
|
|
627
|
-
onEvent: (event) => events.push(event),
|
|
628
|
-
onStateUpdated: () => {},
|
|
629
|
-
onTreeChanged: () => {},
|
|
630
|
-
};
|
|
631
|
-
|
|
632
|
-
// Functional workflow
|
|
633
|
-
const workflow = new Workflow<void>({ name: 'Test' }, async (ctx) => {
|
|
634
|
-
ctx.logger.info('message');
|
|
635
|
-
throw new Error('error');
|
|
636
|
-
});
|
|
637
|
-
|
|
638
|
-
// Run and assert error
|
|
639
|
-
workflow.addObserver(observer);
|
|
640
|
-
await expect(workflow.run()).rejects.toThrow('error');
|
|
641
|
-
|
|
642
|
-
// Validate error event
|
|
643
|
-
const errorEvents = events.filter(e => e.type === 'error');
|
|
644
|
-
expect(errorEvents.length).toBeGreaterThanOrEqual(1);
|
|
645
|
-
expect(errorEvents[0].error.logs).toBeDefined();
|
|
646
|
-
```
|
|
647
|
-
|
|
648
|
-
---
|
|
649
|
-
|
|
650
|
-
**PRP Version**: 1.0
|
|
651
|
-
**Created**: 2025-01-11
|
|
652
|
-
**Status**: Ready for Implementation
|