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
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
# Decorator Documentation Research - Index
|
|
2
|
+
|
|
3
|
+
**Research Date:** 2026-01-11
|
|
4
|
+
**Purpose:** Best practices for documenting TypeScript decorator options in README.md files
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Research Documents
|
|
9
|
+
|
|
10
|
+
### 1. Main Research Document
|
|
11
|
+
**File:** [DECORATOR_DOCUMENTATION_BEST_PRACTICES.md](./DECORATOR_DOCUMENTATION_BEST_PRACTICES.md)
|
|
12
|
+
**Size:** Comprehensive (500+ lines)
|
|
13
|
+
**Contains:**
|
|
14
|
+
- Executive summary of findings
|
|
15
|
+
- Documentation structure patterns
|
|
16
|
+
- Default value presentation methods
|
|
17
|
+
- Table formatting best practices
|
|
18
|
+
- Code example patterns
|
|
19
|
+
- Real-world examples from Groundswell
|
|
20
|
+
- Recommended templates
|
|
21
|
+
- URLs and references
|
|
22
|
+
- Action items for implementation
|
|
23
|
+
|
|
24
|
+
**Use when:** You need comprehensive understanding of decorator documentation best practices
|
|
25
|
+
|
|
26
|
+
### 2. Quick Reference Guide
|
|
27
|
+
**File:** [DECORATOR_DOCUMENTATION_QUICK_REF.md](./DECORATOR_DOCUMENTATION_QUICK_REF.md)
|
|
28
|
+
**Size:** Concise (150 lines)
|
|
29
|
+
**Contains:**
|
|
30
|
+
- Recommended table format
|
|
31
|
+
- Code example patterns
|
|
32
|
+
- Groundswell-specific improvements
|
|
33
|
+
- Common default values
|
|
34
|
+
- Validation checklist
|
|
35
|
+
- PRP template sections
|
|
36
|
+
|
|
37
|
+
**Use when:** You need fast reference while documenting decorators
|
|
38
|
+
|
|
39
|
+
### 3. Concrete Examples
|
|
40
|
+
**File:** [GROUNDSWELL_DECORATOR_EXAMPLES.md](./GROUNDSWELL_DECORATOR_EXAMPLES.md)
|
|
41
|
+
**Size:** Detailed (400+ lines)
|
|
42
|
+
**Contains:**
|
|
43
|
+
- Current vs recommended documentation for all three decorators
|
|
44
|
+
- Before/after comparisons
|
|
45
|
+
- Implementation checklist
|
|
46
|
+
- File references with line numbers
|
|
47
|
+
|
|
48
|
+
**Use when:** You need to see exactly how to improve existing documentation
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Key Findings Summary
|
|
53
|
+
|
|
54
|
+
### Top 3 Best Practices
|
|
55
|
+
|
|
56
|
+
1. **Add a Dedicated Default Column**
|
|
57
|
+
```markdown
|
|
58
|
+
| Option | Type | Default | Description |
|
|
59
|
+
```
|
|
60
|
+
Makes defaults immediately visible, reduces cognitive load
|
|
61
|
+
|
|
62
|
+
2. **Show Progressive Code Examples**
|
|
63
|
+
Start with defaults, then show overrides:
|
|
64
|
+
```typescript
|
|
65
|
+
@Step() // Default
|
|
66
|
+
@Step({ option: true }) // With option
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
3. **Document Default Behavior Explicitly**
|
|
70
|
+
Add a "Default Behavior" section before the options table
|
|
71
|
+
|
|
72
|
+
### Recommended Table Structure
|
|
73
|
+
|
|
74
|
+
```markdown
|
|
75
|
+
| Option | Type | Default | Description |
|
|
76
|
+
|--------|------|---------|-------------|
|
|
77
|
+
| `name` | `string` | method name | Custom name for logs |
|
|
78
|
+
| `enabled` | `boolean` | `true` | Enable feature |
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Groundswell Files to Update
|
|
84
|
+
|
|
85
|
+
| File | Current Lines | Key Changes |
|
|
86
|
+
|------|---------------|-------------|
|
|
87
|
+
| `docs/workflow.md` | 114-244 | Add Default column to all 3 decorators |
|
|
88
|
+
| `README.md` | 114-131 | Add inline comments explaining defaults |
|
|
89
|
+
| `src/types/decorators.ts` | 1-26 | Ensure JSDoc comments match docs |
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## URLs and External References
|
|
94
|
+
|
|
95
|
+
### Groundswell Internal Files
|
|
96
|
+
|
|
97
|
+
1. **Workflow Documentation**
|
|
98
|
+
- File: `/home/dustin/projects/groundswell/docs/workflow.md`
|
|
99
|
+
- Contains: @Step, @Task, @ObservedState documentation
|
|
100
|
+
- Status: Needs Default column added
|
|
101
|
+
|
|
102
|
+
2. **Main README**
|
|
103
|
+
- File: `/home/dustin/projects/groundswell/README.md`
|
|
104
|
+
- Contains: Quick start decorator usage
|
|
105
|
+
- Status: Needs inline default comments
|
|
106
|
+
|
|
107
|
+
3. **Type Definitions**
|
|
108
|
+
- File: `/home/dustin/projects/groundswell/src/types/decorators.ts`
|
|
109
|
+
- Contains: TypeScript interfaces
|
|
110
|
+
- Status: Reference for validation
|
|
111
|
+
|
|
112
|
+
4. **Example Code**
|
|
113
|
+
- File: `/home/dustin/projects/groundswell/examples/examples/02-decorator-options.ts`
|
|
114
|
+
- Contains: Executable decorator examples
|
|
115
|
+
- Status: Needs default values documented
|
|
116
|
+
|
|
117
|
+
### External Libraries (For Further Study)
|
|
118
|
+
|
|
119
|
+
**Note:** These URLs were identified for reference but could not be accessed during research due to API rate limits. They represent excellent examples of decorator documentation to study:
|
|
120
|
+
|
|
121
|
+
5. **class-validator**
|
|
122
|
+
- Repository: https://github.com/typestack/class-validator
|
|
123
|
+
- Known for: Extensive decorator options documentation
|
|
124
|
+
- Study focus: Table formatting, default value presentation
|
|
125
|
+
|
|
126
|
+
6. **TypeORM**
|
|
127
|
+
- Repository: https://github.com/typeorm/typeorm
|
|
128
|
+
- Documentation: https://typeorm.io/#/decorator-reference
|
|
129
|
+
- Known for: Entity and column decorator options
|
|
130
|
+
- Study focus: Complex option configuration
|
|
131
|
+
|
|
132
|
+
7. **NestJS**
|
|
133
|
+
- Repository: https://github.com/nestjs/nest
|
|
134
|
+
- Documentation: https://docs.nestjs.com/custom-decorators
|
|
135
|
+
- Known for: Clean decorator API design
|
|
136
|
+
- Study focus: Decorator composition patterns
|
|
137
|
+
|
|
138
|
+
8. **Angular Style Guide**
|
|
139
|
+
- Repository: https://github.com/angular/angular
|
|
140
|
+
- Documentation: https://angular.io/guide/styleguide#style-05-12
|
|
141
|
+
- Known for: Consistent decorator documentation
|
|
142
|
+
- Study focus: Documentation style guide
|
|
143
|
+
|
|
144
|
+
9. **InversifyJS**
|
|
145
|
+
- Repository: https://github.com/inversify/InversifyJS
|
|
146
|
+
- Known for: Dependency injection decorators
|
|
147
|
+
- Study focus: Optional vs required parameters
|
|
148
|
+
|
|
149
|
+
### Documentation Standards
|
|
150
|
+
|
|
151
|
+
10. **TypeScript Decorator Documentation**
|
|
152
|
+
- URL: https://www.typescriptlang.org/docs/handbook/decorators.html
|
|
153
|
+
- Official TypeScript handbook on decorators
|
|
154
|
+
|
|
155
|
+
11. **TSDoc Standard**
|
|
156
|
+
- URL: https://tsdoc.org/
|
|
157
|
+
- Documentation comment standard for TypeScript
|
|
158
|
+
|
|
159
|
+
12. **JSDoc Documentation**
|
|
160
|
+
- URL: https://jsdoc.app/
|
|
161
|
+
- Traditional JavaScript documentation tags
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Quick Actions
|
|
166
|
+
|
|
167
|
+
### For PRP Creation
|
|
168
|
+
|
|
169
|
+
```markdown
|
|
170
|
+
## Documentation Update
|
|
171
|
+
|
|
172
|
+
**Files to Update:**
|
|
173
|
+
1. `docs/workflow.md` - Add Default column to decorator tables
|
|
174
|
+
2. `README.md` - Add inline default value comments
|
|
175
|
+
3. `examples/02-decorator-options.ts` - Document defaults in JSDoc
|
|
176
|
+
|
|
177
|
+
**Reference:**
|
|
178
|
+
- Best practices: `plan/docs/research/P1M2T1S4/DECORATOR_DOCUMENTATION_BEST_PRACTICES.md`
|
|
179
|
+
- Examples: `plan/docs/research/P1M2T1S4/GROUNDSWELL_DECORATOR_EXAMPLES.md`
|
|
180
|
+
- Quick ref: `plan/docs/research/P1M2T1S4/DECORATOR_DOCUMENTATION_QUICK_REF.md`
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### For Implementation
|
|
184
|
+
|
|
185
|
+
1. Read `GROUNDSWELL_DECORATOR_EXAMPLES.md` for specific changes
|
|
186
|
+
2. Use `DECORATOR_DOCUMENTATION_QUICK_REF.md` for table format
|
|
187
|
+
3. Reference `DECORATOR_DOCUMENTATION_BEST_PRACTICES.md` for rationale
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## Related Research
|
|
192
|
+
|
|
193
|
+
- `plan/docs/research/bugfix_typescript_patterns.md` - TypeScript patterns for error handling
|
|
194
|
+
- `plan/docs/research/CYCLE_DETECTION_PATTERNS.md` - Cycle detection patterns
|
|
195
|
+
- `plan/docs/research/error_handling_patterns.md` - Error handling best practices
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## Confidence Score
|
|
200
|
+
|
|
201
|
+
**Overall Confidence:** 9/10
|
|
202
|
+
|
|
203
|
+
**Reasoning:**
|
|
204
|
+
- Analyzed actual Groundswell codebase
|
|
205
|
+
- Identified specific improvement areas
|
|
206
|
+
- Provided actionable recommendations
|
|
207
|
+
- External libraries identified but not accessed (rate limits)
|
|
208
|
+
- Patterns based on established documentation best practices
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
**Research Complete:** 2026-01-11
|
|
213
|
+
**Next Step:** Apply findings to improve Groundswell decorator documentation
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Codebase Structure for P1.M2.T1.S4
|
|
2
|
+
|
|
3
|
+
## Relevant Source Files
|
|
4
|
+
```
|
|
5
|
+
/home/dustin/projects/groundswell/
|
|
6
|
+
├── src/
|
|
7
|
+
│ ├── core/
|
|
8
|
+
│ │ └── workflow.ts # Contains getRootObservers() (lines 124-139)
|
|
9
|
+
│ ├── __tests__/
|
|
10
|
+
│ │ └── unit/
|
|
11
|
+
│ │ └── workflow.test.ts # Add test here (after line 223)
|
|
12
|
+
│ └── index.js # Main exports
|
|
13
|
+
└── plan/
|
|
14
|
+
└── bugfix/
|
|
15
|
+
└── P1M2T1S4/ # This subtask directory
|
|
16
|
+
├── research/ # Research findings (this file)
|
|
17
|
+
└── PRP.md # Target PRP location
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Key Files
|
|
21
|
+
- **Implementation**: `/home/dustin/projects/groundswell/src/core/workflow.ts`
|
|
22
|
+
- **Test File**: `/home/dustin/projects/groundswell/src/__tests__/unit/workflow.test.ts`
|
|
23
|
+
- **PRP Location**: `/home/dustin/projects/groundswell/plan/bugfix/P1M2T1S4/PRP.md`
|
|
24
|
+
|
|
25
|
+
## Existing Related Tests (workflow.test.ts)
|
|
26
|
+
- Line 209-223: `should detect circular parent relationship` (getRoot() test)
|
|
27
|
+
- P1.M2.T1.S2 test is the template to follow
|
|
28
|
+
|
|
29
|
+
## Test Location for New Test
|
|
30
|
+
Add after line 223 (within the same `describe('Workflow', ...)` block)
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Existing Test Pattern for Cycle Detection (P1.M2.T1.S2)
|
|
2
|
+
|
|
3
|
+
## File Reference
|
|
4
|
+
- **Test File**: `/home/dustin/projects/groundswell/src/__tests__/unit/workflow.test.ts`
|
|
5
|
+
- **Test Location**: Lines 209-223
|
|
6
|
+
|
|
7
|
+
## Complete Test Code (P1.M2.T1.S2)
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
it('should detect circular parent relationship', () => {
|
|
11
|
+
// Arrange: Create parent and child workflows
|
|
12
|
+
const parent = new SimpleWorkflow('Parent');
|
|
13
|
+
const child = new SimpleWorkflow('Child', parent);
|
|
14
|
+
|
|
15
|
+
// Act: Create circular reference manually
|
|
16
|
+
// This simulates a bug or malicious input that creates a cycle
|
|
17
|
+
parent.parent = child;
|
|
18
|
+
|
|
19
|
+
// Assert: getRoot() should throw error for circular reference
|
|
20
|
+
// Note: getRoot() is protected, so we cast to any to access it
|
|
21
|
+
expect(() => (parent as any).getRoot()).toThrow(
|
|
22
|
+
'Circular parent-child relationship detected'
|
|
23
|
+
);
|
|
24
|
+
});
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Key Patterns to Replicate
|
|
28
|
+
|
|
29
|
+
### 1. Test Structure
|
|
30
|
+
- **Arrange**: Create parent and child workflows with `new SimpleWorkflow('Name', parent)`
|
|
31
|
+
- **Act**: Create circular reference by setting `parent.parent = child`
|
|
32
|
+
- **Assert**: Use `expect(() => (workflow as any).method()).toThrow()` pattern
|
|
33
|
+
|
|
34
|
+
### 2. Error Message
|
|
35
|
+
- **Exact String**: `'Circular parent-child relationship detected'`
|
|
36
|
+
- Must match exactly or use `toThrow(Error)` for type-only matching
|
|
37
|
+
|
|
38
|
+
### 3. Test Utility Class
|
|
39
|
+
```typescript
|
|
40
|
+
class SimpleWorkflow extends Workflow {
|
|
41
|
+
async run(): Promise<string> {
|
|
42
|
+
this.setStatus('running');
|
|
43
|
+
this.logger.info('Running simple workflow');
|
|
44
|
+
this.setStatus('completed');
|
|
45
|
+
return 'done';
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### 4. Test Naming Convention
|
|
51
|
+
- Use clear, descriptive test names like "should detect circular parent relationship"
|
|
52
|
+
- Include comments explaining each step
|
|
53
|
+
|
|
54
|
+
### 5. Accessibility Workaround
|
|
55
|
+
- `getRoot()` is `protected` - accessed via `(parent as any).getRoot()`
|
|
56
|
+
- `getRootObservers()` is `private` - may need different access method
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# getRootObservers() Implementation Analysis (P1.M2.T1.S3)
|
|
2
|
+
|
|
3
|
+
## File Reference
|
|
4
|
+
- **Source File**: `/home/dustin/projects/groundswell/src/core/workflow.ts`
|
|
5
|
+
- **Method Location**: Lines 124-139
|
|
6
|
+
|
|
7
|
+
## Complete Implementation
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
/**
|
|
11
|
+
* Get observers from the root workflow
|
|
12
|
+
* Traverses up the tree to find the root
|
|
13
|
+
* Uses cycle detection to prevent infinite loops from circular parent-child relationships
|
|
14
|
+
*/
|
|
15
|
+
private getRootObservers(): WorkflowObserver[] {
|
|
16
|
+
const visited = new Set<Workflow>();
|
|
17
|
+
let root: Workflow = this;
|
|
18
|
+
let current: Workflow | null = this;
|
|
19
|
+
|
|
20
|
+
while (current) {
|
|
21
|
+
if (visited.has(current)) {
|
|
22
|
+
throw new Error('Circular parent-child relationship detected');
|
|
23
|
+
}
|
|
24
|
+
visited.add(current);
|
|
25
|
+
root = current;
|
|
26
|
+
current = current.parent;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return root.observers;
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Error Details
|
|
34
|
+
- **Error Type**: `Error` (standard JavaScript Error)
|
|
35
|
+
- **Error Message**: `"Circular parent-child relationship detected"`
|
|
36
|
+
- **Error Trigger**: When a visited workflow is encountered during parent traversal
|
|
37
|
+
|
|
38
|
+
## Comparison with getRoot()
|
|
39
|
+
Both methods use **identical cycle detection logic**:
|
|
40
|
+
- Same `Set<Workflow>` tracking approach
|
|
41
|
+
- Same error message
|
|
42
|
+
- Same traversal pattern
|
|
43
|
+
- Only difference is return value (`WorkflowObserver[]` vs `Workflow`)
|
|
44
|
+
|
|
45
|
+
## Accessibility Level
|
|
46
|
+
- **`getRootObservers()`**: `private` method
|
|
47
|
+
- **`getRoot()`**: `protected` method
|
|
48
|
+
|
|
49
|
+
## Usage Context
|
|
50
|
+
Called from:
|
|
51
|
+
1. Constructor (line 111) - for logger creation
|
|
52
|
+
2. `emitEvent()` method (line 205)
|
|
53
|
+
3. `snapshotState()` method (line 228)
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Test Conventions for Workflow Tests
|
|
2
|
+
|
|
3
|
+
## Test Framework
|
|
4
|
+
- **Framework**: Vitest
|
|
5
|
+
- **Config File**: `vitest.config.ts`
|
|
6
|
+
- **Test Pattern**: `src/__tests__/**/*.test.ts`
|
|
7
|
+
|
|
8
|
+
## Running Tests
|
|
9
|
+
```bash
|
|
10
|
+
npm test # Run all tests
|
|
11
|
+
npm run test:watch # Run in watch mode
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Test File Organization
|
|
15
|
+
- **Unit Tests**: `src/__tests__/unit/*.test.ts`
|
|
16
|
+
- **Integration Tests**: `src/__tests__/integration/*.test.ts`
|
|
17
|
+
- Test file names match source: `workflow.ts` → `workflow.test.ts`
|
|
18
|
+
|
|
19
|
+
## Standard Imports
|
|
20
|
+
```typescript
|
|
21
|
+
import { describe, it, expect } from 'vitest';
|
|
22
|
+
import { Workflow, WorkflowObserver, /* ... */ } from '../../index.js';
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Test Structure Pattern
|
|
26
|
+
```typescript
|
|
27
|
+
describe('Workflow', () => {
|
|
28
|
+
it('should [expected behavior]', () => {
|
|
29
|
+
// Arrange: Set up test data
|
|
30
|
+
// Act: Execute the behavior
|
|
31
|
+
// Assert: Verify the result
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Mock Observer Pattern
|
|
37
|
+
```typescript
|
|
38
|
+
const observer: WorkflowObserver = {
|
|
39
|
+
onLog: (entry) => logs.push(entry),
|
|
40
|
+
onEvent: (event) => events.push(event),
|
|
41
|
+
onStateUpdated: () => {},
|
|
42
|
+
onTreeChanged: () => {},
|
|
43
|
+
};
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Error Testing Pattern
|
|
47
|
+
```typescript
|
|
48
|
+
expect(() => (workflow as any).privateMethod()).toThrow('Expected error message');
|
|
49
|
+
```
|