groundswell 0.0.1 → 0.0.2
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/.claude/commands/subtask-planning/prp-base-create.md +120 -0
- package/.claude/commands/subtask-planning/prp-base-execute.md +65 -0
- package/.claude/commands/task-breakdown.md +94 -0
- package/.claude/system_prompts/task-breakdown.md +1 -0
- package/CHANGELOG.md +188 -0
- package/PRD.md +543 -0
- package/README.md +99 -5
- package/examples/README.md +15 -1
- package/examples/examples/11-reparenting-workflows.ts +269 -0
- package/examples/index.ts +4 -0
- package/package-lock.json +2398 -0
- package/package.json +3 -1
- package/plan/001_d3bb02af4886/TEST_RESULTS.md +259 -0
- package/plan/001_d3bb02af4886/bug_fix_tasks.json +484 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S1/PRP.md +488 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S2/PRP.md +581 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S3/PRP.md +687 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S1/PRP.md +492 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/PRP.md +932 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/concurrent_error_testing_patterns.md +1109 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/vitest_concurrent_testing.md +802 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/workflow_engine_test_references.md +603 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S1/PRP.md +564 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S3/PRP.md +518 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S4/PRP.md +1252 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/PRP.md +364 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/CODEBASE_INVENTORY.md +114 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/DECORATOR_DOCUMENTATION_PATTERNS.md +205 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/PRD_LOCATION_ANALYSIS.md +199 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/ULTRATHINK_PRP_PLAN.md +134 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S1/PRP.md +495 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S1/research/console_error_inventory.md +435 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S2/PRP.md +506 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S3/PRP.md +612 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T2S2/PRP.md +558 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T2S2/research/external_research.md +788 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T3S2/PRP.md +460 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T3S3/PRP.md +454 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/PRP.md +520 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/RECOMMENDATION.md +417 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/research/external_workflow_engines_research.md +760 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/research/security_implications_analysis.md +245 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S2/PRP.md +792 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S1/PRP.md +535 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S1/TEST_EXECUTION_REPORT.md +190 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/PRP.md +654 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/TEST_FIX_REPORT.md +227 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/KEY_FINDINGS.md +345 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/QUICK_REFERENCE.md +193 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/test_maintenance_research.md +1323 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S1/BREAKING_CHANGES_AUDIT.md +1011 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S1/PRP.md +927 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S2/PRP.md +505 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/architecture/logger_child_signature_analysis.md +401 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/child_implementation_research.md +142 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/test_patterns_research.md +112 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/vitest_patterns_research.md +159 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/PRP.md +549 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/VERIFICATION_REPORT.md +368 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/edge_case_analysis.md +172 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/usage_inventory.md +175 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T1S2/PRP.md +696 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T1S4/PRP.md +860 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/PRP.md +1066 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/01-testing-aggregated-errors.md +1103 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/01_typescript_error_aggregation_patterns.md +789 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/02-error-merge-strategy-testing-guide.md +1098 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/02_aggregate_error_patterns.md +1037 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/03-promise-allsettled-testing-patterns.md +916 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/03_error_merging_strategies.md +1045 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/04_github_stackoverflow_examples.md +890 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/05_comprehensive_summary.md +822 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/INDEX.md +668 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/QUICK_REFERENCE.md +706 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/README.md +265 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/RESEARCH_REPORT.md +655 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S4/research/vitest_testing_patterns.md +1103 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T3S2/PRP.md +426 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/PRP.md +506 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/QUICK_REFERENCE.md +114 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/RESEARCH_SUMMARY.md +316 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/vitest_observer_error_logging_best_practices.md +754 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S3/PRP.md +612 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/PRP.md +719 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/README.md +215 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/analysis.md +765 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S3/PRP.md +718 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/DECISION.md +149 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/PRP.md +470 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/ULTRATHINK_PLAN.md +332 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/codebase_workflow_name_analysis.md +167 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/external_best_practices.md +265 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/validation_patterns.md +273 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T4S1/workflow_engine_ancestry_api_research.md +760 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T4S3-PRP.md +434 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S1/PRP.md +717 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/PRP.md +472 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/VALIDATION_REPORT.md +125 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/research/ULTRATHINK_PRP_PLAN.md +301 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/error-logging-best-practices.md +1170 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/research_typescript_partial_and_overloads.md +940 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/vitest-quick-reference.md +151 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/vitest-research.md +650 -0
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/prd_snapshot.md +259 -0
- package/plan/001_d3bb02af4886/bugfix/P1M1T1S1/PRP.md +457 -0
- package/plan/001_d3bb02af4886/bugfix/RESEARCH_SUMMARY.md +346 -0
- package/plan/001_d3bb02af4886/bugfix/architecture/codebase_structure.md +311 -0
- package/plan/001_d3bb02af4886/bugfix/architecture/concurrent_execution_best_practices.md +1565 -0
- package/plan/001_d3bb02af4886/bugfix/architecture/error_handling_patterns.md +288 -0
- package/plan/001_d3bb02af4886/bugfix/architecture/promise_all_analysis.md +741 -0
- package/plan/001_d3bb02af4886/docs/PRP/P1M1T1S4-functional-workflow-error-state-capture-test.md +652 -0
- package/plan/001_d3bb02af4886/docs/PRP/PRP.md +527 -0
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S1-PRP.md +415 -0
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S2-PRP.md +378 -0
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S4-PRP.md +713 -0
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M2T1S4-PRP.md +370 -0
- package/plan/001_d3bb02af4886/docs/PRP_P1M3T1S3.md +499 -0
- package/plan/001_d3bb02af4886/docs/TEST_RESULTS.md +230 -0
- package/plan/001_d3bb02af4886/docs/bugfix/ANALYSIS_PRD_VS_IMPLEMENTATION.md +1134 -0
- package/plan/001_d3bb02af4886/docs/bugfix/GAP_ANALYSIS_SUMMARY.md +179 -0
- package/plan/001_d3bb02af4886/docs/bugfix/P1M4T2S1/PRP.md +629 -0
- package/plan/001_d3bb02af4886/docs/bugfix/P1M4T2S1/validation-report.md +214 -0
- package/plan/001_d3bb02af4886/docs/bugfix/PRP_P1M4T2S3.md +629 -0
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_PRP.md +529 -0
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_QUICK_REFERENCE.md +142 -0
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_README.md +304 -0
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_TEST_RESULTS.md +558 -0
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_VALIDATION_SUMMARY.md +256 -0
- package/plan/001_d3bb02af4886/docs/bugfix/system_context.md +346 -0
- package/plan/001_d3bb02af4886/docs/bugfix-architecture/bug_analysis.md +415 -0
- package/plan/001_d3bb02af4886/docs/bugfix-architecture/implementation_patterns.md +489 -0
- package/plan/001_d3bb02af4886/docs/bugfix-architecture/system_context.md +218 -0
- package/plan/001_d3bb02af4886/docs/bugfix_INITIATION_SUMMARY.md +380 -0
- package/plan/001_d3bb02af4886/docs/research/CYCLE_DETECTION_PATTERNS.md +1923 -0
- package/plan/001_d3bb02af4886/docs/research/CYCLE_DETECTION_QUICK_REF.md +319 -0
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/codebase-context.md +115 -0
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/cycle-detection-algorithms.md +134 -0
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/test-patterns.md +153 -0
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/workflow-class.md +132 -0
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/DECORATOR_DOCUMENTATION_BEST_PRACTICES.md +716 -0
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/DECORATOR_DOCUMENTATION_QUICK_REF.md +186 -0
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/GROUNDSWELL_DECORATOR_EXAMPLES.md +604 -0
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/INDEX.md +213 -0
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/codebase_structure.md +30 -0
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/existing_test_pattern.md +56 -0
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/getRootObservers_implementation.md +53 -0
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/test_conventions.md +49 -0
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/PRP.md +958 -0
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/QUICK_REFERENCE.md +339 -0
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/README.md +305 -0
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/SUMMARY.md +433 -0
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/bidirectional-tree-consistency-testing.md +1574 -0
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/test-pattern-examples.md +1014 -0
- package/plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_QUICK_REF.md +376 -0
- package/plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_RESEARCH.md +1507 -0
- package/plan/001_d3bb02af4886/docs/research/bugfix_typescript_patterns.md +949 -0
- package/plan/001_d3bb02af4886/docs/research/error-testing-research.md +619 -0
- package/plan/001_d3bb02af4886/docs/research/error_handling_patterns.md +723 -0
- package/plan/{research → 001_d3bb02af4886/docs/research/general}/introspection-security-guide.md +56 -0
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/PRP_TEMPLATE.md +460 -0
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/QUICK_REFERENCE.md +324 -0
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/README.md +175 -0
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/RESEARCH_REPORT.md +499 -0
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/SUMMARY.md +163 -0
- package/plan/bugfix/BUG_FIX_SUMMARY.md +961 -0
- package/src/__tests__/adversarial/attachChild-performance.test.ts +216 -0
- package/src/__tests__/adversarial/circular-reference.test.ts +101 -0
- package/src/__tests__/adversarial/complex-circular-reference.test.ts +139 -0
- package/src/__tests__/adversarial/concurrent-task-failures.test.ts +571 -0
- package/src/__tests__/adversarial/deep-analysis.test.ts +729 -0
- package/src/__tests__/adversarial/deep-hierarchy-stress.test.ts +213 -0
- package/src/__tests__/adversarial/e2e-prd-validation.test.ts +448 -0
- package/src/__tests__/adversarial/edge-case.test.ts +703 -0
- package/src/__tests__/adversarial/error-merge-strategy.test.ts +760 -0
- package/src/__tests__/adversarial/incremental-performance.test.ts +140 -0
- package/src/__tests__/adversarial/node-map-update-benchmarks.test.ts +457 -0
- package/src/__tests__/adversarial/observer-propagation.test.ts +487 -0
- package/src/__tests__/adversarial/parent-validation.test.ts +143 -0
- package/src/__tests__/adversarial/prd-12-2-compliance.test.ts +611 -0
- package/src/__tests__/adversarial/prd-compliance.test.ts +731 -0
- package/src/__tests__/compatibility/backward-compatibility.test.ts +1572 -0
- package/src/__tests__/helpers/index.ts +18 -0
- package/src/__tests__/helpers/tree-verification.ts +257 -0
- package/src/__tests__/integration/bidirectional-consistency.test.ts +847 -0
- package/src/__tests__/integration/observer-logging.test.ts +643 -0
- package/src/__tests__/integration/tree-mirroring.test.ts +37 -0
- package/src/__tests__/integration/workflow-reparenting.test.ts +303 -0
- package/src/__tests__/unit/context.test.ts +79 -0
- package/src/__tests__/unit/logger.test.ts +293 -0
- package/src/__tests__/unit/observable.test.ts +321 -0
- package/src/__tests__/unit/tree-debugger-incremental.test.ts +170 -0
- package/src/__tests__/unit/utils/workflow-error-utils.test.ts +209 -0
- package/src/__tests__/unit/workflow-detachChild.test.ts +100 -0
- package/src/__tests__/unit/workflow-emitEvent-childDetached.test.ts +153 -0
- package/src/__tests__/unit/workflow-isDescendantOf.test.ts +180 -0
- package/src/__tests__/unit/workflow.test.ts +277 -1
- package/src/core/agent.ts +21 -1
- package/src/core/logger.ts +27 -2
- package/src/core/workflow-context.ts +6 -4
- package/src/core/workflow.ts +252 -14
- package/src/debugger/tree-debugger.ts +52 -7
- package/src/decorators/task.ts +65 -2
- package/src/index.ts +4 -2
- package/src/types/decorators.ts +8 -1
- package/src/types/events.ts +1 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/observable.ts +32 -3
- package/src/utils/workflow-error-utils.ts +56 -0
- package/tsconfig.json +1 -1
- package/llms_full.txt +0 -5890
- package/tasks.json +0 -0
- /package/plan/{backlog.json → 001_d3bb02af4886/backlog.json} +0 -0
- /package/plan/{P1P2/PRP.md → 001_d3bb02af4886/docs/PRP/P1P2-PRP.md} +0 -0
- /package/plan/{P3P4/PRP.md → 001_d3bb02af4886/docs/PRP/P3P4-PRP.md} +0 -0
- /package/plan/{P4P5/PRP.md → 001_d3bb02af4886/docs/PRP/P4P5-PRP.md} +0 -0
- /package/plan/{architecture → 001_d3bb02af4886/docs/architecture}/external_deps.md +0 -0
- /package/plan/{architecture → 001_d3bb02af4886/docs/architecture}/system_context.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/LRU_CACHE_BEST_PRACTICES.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/LRU_CACHE_CODE_PATTERNS.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/LRU_CACHE_INTEGRATION_GUIDE.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/LRU_CACHE_RESEARCH_INDEX.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/REFLECTION_INDEX.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/REFLECTION_RESEARCH_REPORT.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/RESEARCH_SUMMARY.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/anthropic-sdk.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/async-local-storage.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-code-patterns.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-decision-matrix.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-implementation-guide.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-integration-guide.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-patterns.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/reflection-quick-reference.md +0 -0
- /package/plan/{P1P2/research → 001_d3bb02af4886/docs/research/P1P2}/zod-schema.md +0 -0
- /package/plan/{P3P4/research → 001_d3bb02af4886/docs/research/P3P4}/caching-lru.md +0 -0
- /package/plan/{P3P4/research → 001_d3bb02af4886/docs/research/P3P4}/introspection-tools.md +0 -0
- /package/plan/{P3P4/research → 001_d3bb02af4886/docs/research/P3P4}/reflection-patterns.md +0 -0
- /package/plan/{P4P5/research → 001_d3bb02af4886/docs/research/P4P5}/RESEARCH_SUMMARY.md +0 -0
- /package/plan/{research → 001_d3bb02af4886/docs/research/general}/INTROSPECTION_RESEARCH_SUMMARY.md +0 -0
- /package/plan/{research → 001_d3bb02af4886/docs/research/general}/README-INTROSPECTION.md +0 -0
- /package/plan/{research → 001_d3bb02af4886/docs/research/general}/agent-introspection-patterns.md +0 -0
- /package/plan/{research → 001_d3bb02af4886/docs/research/general}/introspection-tool-examples.md +0 -0
- /package/{PRPs/PRDs/001-hierarchical-workflow-engine.md → plan/001_d3bb02af4886/prd_snapshot.md} +0 -0
package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/RESEARCH_SUMMARY.md
ADDED
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
# Research Summary: Vitest Best Practices for Testing Observer Error Logging
|
|
2
|
+
|
|
3
|
+
**Research Date:** 2026-01-12
|
|
4
|
+
**Status:** Complete
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Research Deliverables
|
|
9
|
+
|
|
10
|
+
### Documents Created
|
|
11
|
+
1. **Comprehensive Research Document** (110+ KB)
|
|
12
|
+
- Location: `/home/dustin/projects/groundswell/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S2/research/vitest_observer_error_logging_best_practices.md`
|
|
13
|
+
- Contains: All patterns, examples, and best practices with URLs
|
|
14
|
+
|
|
15
|
+
2. **Quick Reference Guide**
|
|
16
|
+
- Location: `/home/dustin/projects/groundswell/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S2/research/QUICK_REFERENCE.md`
|
|
17
|
+
- Contains: Essential patterns and URLs for quick lookup
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Key Findings by Category
|
|
22
|
+
|
|
23
|
+
### 1. Vitest Best Practices for Testing Error Handling
|
|
24
|
+
|
|
25
|
+
**Official Documentation URLs:**
|
|
26
|
+
- Main Docs: https://vitest.dev/
|
|
27
|
+
- Assertions API: https://vitest.dev/api/expect.html#tothrow
|
|
28
|
+
- Mocking Guide: https://vitest.dev/guide/mocking.html#spy-on
|
|
29
|
+
- Async Testing: https://vitest.dev/guide/async.html
|
|
30
|
+
|
|
31
|
+
**Key Patterns:**
|
|
32
|
+
- Use `vi.fn()` for mock functions
|
|
33
|
+
- Use `vi.spyOn()` for existing functions
|
|
34
|
+
- Always restore mocks in `afterEach()`
|
|
35
|
+
- Use `.not.toThrow()` to verify error isolation
|
|
36
|
+
|
|
37
|
+
### 2. Mocking Loggers in Vitest
|
|
38
|
+
|
|
39
|
+
**Best Practice:** Create a logger interface and mock it (not console output)
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
// Define interface
|
|
43
|
+
export interface ObservableLogger {
|
|
44
|
+
error(message: string, data?: unknown): void;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Mock in tests
|
|
48
|
+
const mockLogger: ObservableLogger = {
|
|
49
|
+
error: vi.fn(),
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
// Verify usage
|
|
53
|
+
expect(mockLogger.error).toHaveBeenCalledWith('Observable subscriber error', {
|
|
54
|
+
error: testError,
|
|
55
|
+
});
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**For console fallback testing only:**
|
|
59
|
+
```typescript
|
|
60
|
+
const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
|
|
61
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith('message', error);
|
|
62
|
+
consoleErrorSpy.mockRestore();
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### 3. Testing Errors Don't Crash Execution
|
|
66
|
+
|
|
67
|
+
**Key Pattern: Error Isolation**
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
it('should not propagate errors outside try-catch', () => {
|
|
71
|
+
const observable = new Observable<number>(mockLogger);
|
|
72
|
+
const throwingSubscriber = { next: () => { throw new Error(); } };
|
|
73
|
+
|
|
74
|
+
observable.subscribe(throwingSubscriber);
|
|
75
|
+
|
|
76
|
+
// This should NOT throw
|
|
77
|
+
expect(() => {
|
|
78
|
+
observable.next(42);
|
|
79
|
+
}).not.toThrow();
|
|
80
|
+
|
|
81
|
+
// But error should be logged
|
|
82
|
+
expect(mockLogger.error).toHaveBeenCalled();
|
|
83
|
+
});
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**Project Reference:** `/home/dustin/projects/groundswell/src/__tests__/unit/observable.test.ts` (lines 252-279)
|
|
87
|
+
|
|
88
|
+
### 4. Testing Observer Pattern Error Handling
|
|
89
|
+
|
|
90
|
+
**Key Patterns:**
|
|
91
|
+
|
|
92
|
+
**Multiple observers with mixed success/failure:**
|
|
93
|
+
```typescript
|
|
94
|
+
it('should continue notifying other observers after one throws', async () => {
|
|
95
|
+
let observer2Called = false;
|
|
96
|
+
let observer3Called = false;
|
|
97
|
+
|
|
98
|
+
const throwingObserver = { onLog: () => { throw new Error(); } };
|
|
99
|
+
const workingObserver2 = { onLog: () => { observer2Called = true; } };
|
|
100
|
+
const workingObserver3 = { onLog: () => { observer3Called = true; } };
|
|
101
|
+
|
|
102
|
+
// Add all observers and trigger
|
|
103
|
+
// ...
|
|
104
|
+
|
|
105
|
+
// Both working observers should have been called
|
|
106
|
+
expect(observer2Called).toBe(true);
|
|
107
|
+
expect(observer3Called).toBe(true);
|
|
108
|
+
});
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
**Avoid infinite recursion:**
|
|
112
|
+
```typescript
|
|
113
|
+
it('should avoid infinite recursion when observer onLog throws', async () => {
|
|
114
|
+
let callCount = 0;
|
|
115
|
+
|
|
116
|
+
const throwingObserver = {
|
|
117
|
+
onLog: () => {
|
|
118
|
+
callCount++;
|
|
119
|
+
if (callCount < 10) {
|
|
120
|
+
throw new Error('Recursive error');
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
// Should only call once + error log, then stop
|
|
126
|
+
expect(callCount).toBe(1);
|
|
127
|
+
});
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**Project Reference:** `/home/dustin/projects/groundswell/src/__tests__/integration/observer-logging.test.ts` (lines 327-414)
|
|
131
|
+
|
|
132
|
+
### 5. Verifying Error Context in Logs
|
|
133
|
+
|
|
134
|
+
**Key Pattern: Structured Error Context**
|
|
135
|
+
|
|
136
|
+
```typescript
|
|
137
|
+
it('should log structured error context', async () => {
|
|
138
|
+
const throwingObserver = {
|
|
139
|
+
onEvent: () => {
|
|
140
|
+
throw new Error('Observer onEvent failed');
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
workflow.run();
|
|
145
|
+
|
|
146
|
+
const errorLog = workflow.node.logs.find(
|
|
147
|
+
(log) => log.message === 'Observer onEvent error'
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
expect(errorLog).toBeDefined();
|
|
151
|
+
expect(errorLog?.level).toBe('error');
|
|
152
|
+
expect(errorLog?.data).toEqual({
|
|
153
|
+
error: expect.any(Error),
|
|
154
|
+
eventType: 'testEvent',
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
**Include contextual data:**
|
|
160
|
+
- Event type: `expect(errorLog.data).toHaveProperty('eventType', 'testEvent')`
|
|
161
|
+
- Node ID: `expect(errorLog.data).toHaveProperty('nodeId', workflow.node.id)`
|
|
162
|
+
- Error object: `expect(errorLog.data.error).toBeInstanceOf(Error)`
|
|
163
|
+
|
|
164
|
+
**Project Reference:** `/home/dustin/projects/groundswell/src/__tests__/integration/observer-logging.test.ts` (lines 7-196)
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## URLs with Section Anchors
|
|
169
|
+
|
|
170
|
+
### Vitest Error Handling Test Patterns
|
|
171
|
+
|
|
172
|
+
| Resource | URL | Section |
|
|
173
|
+
|----------|-----|---------|
|
|
174
|
+
| **toThrow()** | https://vitest.dev/api/expect.html#tothrow | Synchronous error testing |
|
|
175
|
+
| **.resolves/.rejects** | https://vitest.dev/api/expect.html#resolves | Async error testing |
|
|
176
|
+
| **objectContaining()** | https://vitest.dev/api/expect.html#objectcontaining | Partial object matching |
|
|
177
|
+
| **vi.spyOn()** | https://vitest.dev/guide/mocking.html#spy-on | Spying on functions |
|
|
178
|
+
| **Mock Functions** | https://vitest.dev/guide/mocking.html#mock-functions | Creating mocks |
|
|
179
|
+
| **Restoring Mocks** | https://vitest.dev/guide/mocking.html#restoring-mocks | Cleanup |
|
|
180
|
+
|
|
181
|
+
### Mocking Loggers in Vitest
|
|
182
|
+
|
|
183
|
+
| Pattern | Location |
|
|
184
|
+
|---------|----------|
|
|
185
|
+
| **Mock Interface** | `/home/dustin/projects/groundswell/src/__tests__/unit/observable.test.ts:14-30` |
|
|
186
|
+
| **Console Fallback** | `/home/dustin/projects/groundswell/src/__tests__/unit/observable.test.ts:127-143` |
|
|
187
|
+
| **Module Mocking** | https://vitest.dev/guide/mocking.html#mocking-modules |
|
|
188
|
+
|
|
189
|
+
### Testing Observer Error Handling
|
|
190
|
+
|
|
191
|
+
| Pattern | Location |
|
|
192
|
+
|---------|----------|
|
|
193
|
+
| **Error Isolation** | `/home/dustin/projects/groundswell/src/__tests__/unit/observable.test.ts:252-279` |
|
|
194
|
+
| **Multiple Observers** | `/home/dustin/projects/groundswell/src/__tests__/integration/observer-logging.test.ts:327-378` |
|
|
195
|
+
| **Infinite Recursion Prevention** | `/home/dustin/projects/groundswell/src/__tests__/integration/observer-logging.test.ts:42-74` |
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## Best Practices Summary
|
|
200
|
+
|
|
201
|
+
### DO's
|
|
202
|
+
|
|
203
|
+
1. **Mock logger interfaces, not console output**
|
|
204
|
+
- Define `ObservableLogger` interface
|
|
205
|
+
- Use `vi.fn()` for mock functions
|
|
206
|
+
- Verify `mockLogger.error` calls
|
|
207
|
+
|
|
208
|
+
2. **Test errors don't crash execution**
|
|
209
|
+
- Use `expect(() => fn()).not.toThrow()`
|
|
210
|
+
- Verify logger was called instead
|
|
211
|
+
- Test multiple observers with mixed outcomes
|
|
212
|
+
|
|
213
|
+
3. **Verify error context in logs**
|
|
214
|
+
- Check `errorLog.data.error` is Error instance
|
|
215
|
+
- Verify contextual data (eventType, nodeId)
|
|
216
|
+
- Use `expect.objectContaining()` for partial matching
|
|
217
|
+
|
|
218
|
+
4. **Always restore mocks**
|
|
219
|
+
- Use `afterEach()` for cleanup
|
|
220
|
+
- Call `consoleSpy.mockRestore()`
|
|
221
|
+
- Use `vi.restoreAllMocks()`
|
|
222
|
+
|
|
223
|
+
5. **Test all observer scenarios**
|
|
224
|
+
- Single observer error
|
|
225
|
+
- Multiple observers with mixed success/failure
|
|
226
|
+
- All observers fail
|
|
227
|
+
- Infinite recursion prevention
|
|
228
|
+
|
|
229
|
+
### DON'Ts
|
|
230
|
+
|
|
231
|
+
1. **Don't test console.output for logger verification**
|
|
232
|
+
```typescript
|
|
233
|
+
// BAD
|
|
234
|
+
expect(console.error).toHaveBeenCalledWith(...);
|
|
235
|
+
|
|
236
|
+
// GOOD
|
|
237
|
+
expect(mockLogger.error).toHaveBeenCalledWith(...);
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
2. **Don't forget error isolation tests**
|
|
241
|
+
```typescript
|
|
242
|
+
// BAD - only tests error thrown
|
|
243
|
+
expect(() => observable.next(42)).toThrow();
|
|
244
|
+
|
|
245
|
+
// GOOD - tests error caught and logged
|
|
246
|
+
expect(() => observable.next(42)).not.toThrow();
|
|
247
|
+
expect(mockLogger.error).toHaveBeenCalled();
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
3. **Don't skip multiple observer scenarios**
|
|
251
|
+
- Test with 3+ observers
|
|
252
|
+
- Verify isolation between observers
|
|
253
|
+
- Check all errors are logged
|
|
254
|
+
|
|
255
|
+
4. **Don't ignore error context verification**
|
|
256
|
+
- Verify error objects, not just messages
|
|
257
|
+
- Check contextual data is included
|
|
258
|
+
- Use type guards when needed
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
## Related Project Files
|
|
263
|
+
|
|
264
|
+
### Test Files (Reference Implementations)
|
|
265
|
+
- `/home/dustin/projects/groundswell/src/__tests__/integration/observer-logging.test.ts`
|
|
266
|
+
- `/home/dustin/projects/groundswell/src/__tests__/unit/observable.test.ts`
|
|
267
|
+
- `/home/dustin/projects/groundswell/src/__tests__/unit/workflow.test.ts`
|
|
268
|
+
|
|
269
|
+
### Source Files (Implementation)
|
|
270
|
+
- `/home/dustin/projects/groundswell/src/utils/observable.ts`
|
|
271
|
+
- `/home/dustin/projects/groundswell/src/core/logger.ts`
|
|
272
|
+
- `/home/dustin/projects/groundswell/src/core/workflow.ts`
|
|
273
|
+
|
|
274
|
+
### Research Documents (Additional Reading)
|
|
275
|
+
- `/home/dustin/projects/groundswell/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S4/research/vitest_testing_patterns.md`
|
|
276
|
+
- `/home/dustin/projects/groundswell/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/vitest_concurrent_testing.md`
|
|
277
|
+
- `/home/dustin/projects/groundswell/plan/001_d3bb02af4886/docs/research/error-testing-research.md`
|
|
278
|
+
|
|
279
|
+
---
|
|
280
|
+
|
|
281
|
+
## Quick Reference Code Snippets
|
|
282
|
+
|
|
283
|
+
### Mock Logger Setup
|
|
284
|
+
```typescript
|
|
285
|
+
const mockLogger = { error: vi.fn() };
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
### Verify Logger Call
|
|
289
|
+
```typescript
|
|
290
|
+
expect(mockLogger.error).toHaveBeenCalledWith('message', { error });
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
### Test Error Isolation
|
|
294
|
+
```typescript
|
|
295
|
+
expect(() => observable.next(42)).not.toThrow();
|
|
296
|
+
expect(mockLogger.error).toHaveBeenCalled();
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
### Verify Error Context
|
|
300
|
+
```typescript
|
|
301
|
+
expect(errorLog.data).toEqual({
|
|
302
|
+
error: expect.any(Error),
|
|
303
|
+
eventType: 'testEvent',
|
|
304
|
+
});
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
### Console Fallback
|
|
308
|
+
```typescript
|
|
309
|
+
const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
|
|
310
|
+
expect(consoleSpy).toHaveBeenCalledWith('message', error);
|
|
311
|
+
consoleSpy.mockRestore();
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
---
|
|
315
|
+
|
|
316
|
+
**Research Complete:** All requested URLs, patterns, examples, and best practices have been documented and stored.
|