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,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example 11: Reparenting Workflows
|
|
3
|
+
*
|
|
4
|
+
* Demonstrates the detach-then-attach pattern for reparenting workflows.
|
|
5
|
+
*
|
|
6
|
+
* Key concepts:
|
|
7
|
+
* - WRONG way: Direct attachChild() throws error (single-parent invariant)
|
|
8
|
+
* - RIGHT way: detachChild() then attachChild() pattern
|
|
9
|
+
* - Tree structure verification before/after reparenting
|
|
10
|
+
* - Observer propagation updates after reparenting
|
|
11
|
+
* - Dual-tree synchronization (workflow tree + node tree)
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import {
|
|
15
|
+
Workflow,
|
|
16
|
+
Step,
|
|
17
|
+
ObservedState,
|
|
18
|
+
WorkflowTreeDebugger,
|
|
19
|
+
WorkflowObserver,
|
|
20
|
+
WorkflowEvent,
|
|
21
|
+
} from 'groundswell';
|
|
22
|
+
import { printHeader, printSection, sleep } from '../utils/helpers.js';
|
|
23
|
+
|
|
24
|
+
// ============================================================
|
|
25
|
+
// SIMPLE WORKFLOW CLASS FOR DEMONSTRATION
|
|
26
|
+
// ============================================================
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Simple workflow for reparenting demonstration
|
|
30
|
+
*/
|
|
31
|
+
class SimpleWorkflow extends Workflow {
|
|
32
|
+
@ObservedState()
|
|
33
|
+
public value: string = '';
|
|
34
|
+
|
|
35
|
+
constructor(name: string, parent?: Workflow) {
|
|
36
|
+
super(name, parent);
|
|
37
|
+
this.value = name;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
@Step({ trackTiming: true })
|
|
41
|
+
async doWork(): Promise<void> {
|
|
42
|
+
this.logger.info(`${this.node.name} doing work`);
|
|
43
|
+
await sleep(50);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async run(): Promise<void> {
|
|
47
|
+
this.setStatus('running');
|
|
48
|
+
await this.doWork();
|
|
49
|
+
this.setStatus('completed');
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// ============================================================
|
|
54
|
+
// CUSTOM OBSERVER FOR EVENT TRACKING
|
|
55
|
+
// ============================================================
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Observer that tracks events for demonstration
|
|
59
|
+
*/
|
|
60
|
+
class EventTrackingObserver implements WorkflowObserver {
|
|
61
|
+
private events: WorkflowEvent[] = [];
|
|
62
|
+
private name: string;
|
|
63
|
+
|
|
64
|
+
constructor(name: string) {
|
|
65
|
+
this.name = name;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
onLog(): void {}
|
|
69
|
+
onStateUpdated(): void {}
|
|
70
|
+
|
|
71
|
+
onEvent(event: WorkflowEvent): void {
|
|
72
|
+
this.events.push(event);
|
|
73
|
+
console.log(` [${this.name}] Received event: ${event.type}`);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
onTreeChanged(): void {
|
|
77
|
+
console.log(` [${this.name}] Tree changed`);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
getEvents(): WorkflowEvent[] {
|
|
81
|
+
return this.events;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
clear(): void {
|
|
85
|
+
this.events = [];
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// ============================================================
|
|
90
|
+
// MAIN EXAMPLE FUNCTION
|
|
91
|
+
// ============================================================
|
|
92
|
+
|
|
93
|
+
export async function runReparentingExample(): Promise<void> {
|
|
94
|
+
printHeader('Example 11: Reparenting Workflows');
|
|
95
|
+
|
|
96
|
+
// ============================================================
|
|
97
|
+
// SECTION 1: THE WRONG WAY
|
|
98
|
+
// ============================================================
|
|
99
|
+
printSection('1. The WRONG Way: Direct attachChild()');
|
|
100
|
+
|
|
101
|
+
console.log('Creating parent1, parent2, and child attached to parent1...\n');
|
|
102
|
+
|
|
103
|
+
const parent1 = new SimpleWorkflow('Parent1');
|
|
104
|
+
const parent2 = new SimpleWorkflow('Parent2');
|
|
105
|
+
const child = new SimpleWorkflow('Child', parent1);
|
|
106
|
+
|
|
107
|
+
console.log(`Initial state:`);
|
|
108
|
+
console.log(` child.parent = '${child.parent?.node.name}'`);
|
|
109
|
+
console.log(` parent1.children = [${parent1.children.map((c) => c.node.name).join(', ')}]`);
|
|
110
|
+
console.log(` parent2.children = [${parent2.children.map((c) => c.node.name).join(', ')}]`);
|
|
111
|
+
|
|
112
|
+
console.log('\nAttempting: parent2.attachChild(child) (skipping detachChild)...\n');
|
|
113
|
+
|
|
114
|
+
try {
|
|
115
|
+
// WRONG: Direct attachChild() to new parent
|
|
116
|
+
parent2.attachChild(child);
|
|
117
|
+
console.log('✗ Unexpected: attachChild() succeeded (should have thrown)');
|
|
118
|
+
} catch (error) {
|
|
119
|
+
console.log('✓ Expected: Error thrown');
|
|
120
|
+
console.log(`\nError message:`);
|
|
121
|
+
console.log(` "${(error as Error).message}"`);
|
|
122
|
+
|
|
123
|
+
console.log('\n❌ WHY IT FAILED:');
|
|
124
|
+
console.log(' The child already has a parent (Parent1).');
|
|
125
|
+
console.log(' Groundswell enforces the SINGLE-PARENT invariant:');
|
|
126
|
+
console.log(' "A workflow can only have one parent at a time."');
|
|
127
|
+
console.log(' This prevents ambiguous tree traversal and observer propagation.');
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// ============================================================
|
|
131
|
+
// SECTION 2: THE RIGHT WAY
|
|
132
|
+
// ============================================================
|
|
133
|
+
printSection('2. The RIGHT Way: detachChild() then attachChild()');
|
|
134
|
+
|
|
135
|
+
console.log('Creating fresh workflows for clean demonstration...\n');
|
|
136
|
+
|
|
137
|
+
const parentA = new SimpleWorkflow('ParentA');
|
|
138
|
+
const parentB = new SimpleWorkflow('ParentB');
|
|
139
|
+
const workflowToReparent = new SimpleWorkflow('WorkflowToReparent', parentA);
|
|
140
|
+
|
|
141
|
+
// Create debugger for tree visualization
|
|
142
|
+
const debuggerA = new WorkflowTreeDebugger(parentA);
|
|
143
|
+
|
|
144
|
+
console.log('BEFORE reparenting:');
|
|
145
|
+
console.log(debuggerA.toTreeString());
|
|
146
|
+
|
|
147
|
+
console.log('\nStep 1: Detach from ParentA');
|
|
148
|
+
console.log(' parentA.detachChild(workflowToReparent);');
|
|
149
|
+
parentA.detachChild(workflowToReparent);
|
|
150
|
+
|
|
151
|
+
console.log('\nAfter detachChild():');
|
|
152
|
+
console.log(` workflowToReparent.parent = ${workflowToReparent.parent}`);
|
|
153
|
+
console.log(` parentA.children = [${parentA.children.map((c) => c.node.name).join(', ')}]`);
|
|
154
|
+
|
|
155
|
+
console.log('\nStep 2: Attach to ParentB');
|
|
156
|
+
console.log(' parentB.attachChild(workflowToReparent);');
|
|
157
|
+
parentB.attachChild(workflowToReparent);
|
|
158
|
+
|
|
159
|
+
console.log('\nAfter attachChild():');
|
|
160
|
+
console.log(` workflowToReparent.parent = '${workflowToReparent.parent.node.name}'`);
|
|
161
|
+
console.log(` parentB.children = [${parentB.children.map((c) => c.node.name).join(', ')}]`);
|
|
162
|
+
|
|
163
|
+
const debuggerB = new WorkflowTreeDebugger(parentB);
|
|
164
|
+
console.log('\nAFTER reparenting:');
|
|
165
|
+
console.log(debuggerB.toTreeString());
|
|
166
|
+
|
|
167
|
+
console.log('\n✅ SUCCESS: Workflow reparented from ParentA to ParentB');
|
|
168
|
+
|
|
169
|
+
// ============================================================
|
|
170
|
+
// SECTION 3: OBSERVER PROPAGATION
|
|
171
|
+
// ============================================================
|
|
172
|
+
printSection('3. Observer Propagation After Reparenting');
|
|
173
|
+
|
|
174
|
+
console.log('Creating workflows with observers...\n');
|
|
175
|
+
|
|
176
|
+
const obsParent1 = new SimpleWorkflow('ObsParent1');
|
|
177
|
+
const obsParent2 = new SimpleWorkflow('ObsParent2');
|
|
178
|
+
const obsChild = new SimpleWorkflow('ObsChild', obsParent1);
|
|
179
|
+
|
|
180
|
+
const observer1 = new EventTrackingObserver('Observer1');
|
|
181
|
+
const observer2 = new EventTrackingObserver('Observer2');
|
|
182
|
+
|
|
183
|
+
obsParent1.addObserver(observer1);
|
|
184
|
+
obsParent2.addObserver(observer2);
|
|
185
|
+
|
|
186
|
+
console.log('Initial state: ObsChild attached to ObsParent1');
|
|
187
|
+
console.log('Emitting event from ObsChild...\n');
|
|
188
|
+
|
|
189
|
+
observer1.clear();
|
|
190
|
+
observer2.clear();
|
|
191
|
+
obsChild.setStatus('running');
|
|
192
|
+
|
|
193
|
+
console.log('Observer1 (ObsParent1) events:', observer1.getEvents().map((e) => e.type));
|
|
194
|
+
console.log('Observer2 (ObsParent2) events:', observer2.getEvents().map((e) => e.type));
|
|
195
|
+
|
|
196
|
+
console.log('\nReparenting: ObsParent1 → ObsParent2');
|
|
197
|
+
obsParent1.detachChild(obsChild);
|
|
198
|
+
obsParent2.attachChild(obsChild);
|
|
199
|
+
|
|
200
|
+
console.log('\nAfter reparenting: ObsChild attached to ObsParent2');
|
|
201
|
+
console.log('Emitting event from ObsChild...\n');
|
|
202
|
+
|
|
203
|
+
observer1.clear();
|
|
204
|
+
observer2.clear();
|
|
205
|
+
obsChild.setStatus('completed');
|
|
206
|
+
|
|
207
|
+
console.log('Observer1 (ObsParent1) events:', observer1.getEvents().map((e) => e.type));
|
|
208
|
+
console.log('Observer2 (ObsParent2) events:', observer2.getEvents().map((e) => e.type));
|
|
209
|
+
|
|
210
|
+
console.log('\n✅ VERIFIED: Events now go to Observer2 (new parent\'s observer)');
|
|
211
|
+
|
|
212
|
+
// ============================================================
|
|
213
|
+
// SECTION 4: ERROR HANDLING
|
|
214
|
+
// ============================================================
|
|
215
|
+
printSection('4. Error Handling Patterns');
|
|
216
|
+
|
|
217
|
+
console.log('Demonstrating proper error handling...\n');
|
|
218
|
+
|
|
219
|
+
const errorParent1 = new SimpleWorkflow('ErrorParent1');
|
|
220
|
+
const errorParent2 = new SimpleWorkflow('ErrorParent2');
|
|
221
|
+
const errorChild = new SimpleWorkflow('ErrorChild');
|
|
222
|
+
|
|
223
|
+
console.log('Case 1: Detaching when child not attached');
|
|
224
|
+
try {
|
|
225
|
+
errorParent1.detachChild(errorChild);
|
|
226
|
+
console.log('✗ Unexpected: detachChild() succeeded');
|
|
227
|
+
} catch (error) {
|
|
228
|
+
console.log('✓ Expected: Error thrown');
|
|
229
|
+
console.log(` "${(error as Error).message}"`);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
console.log('\nCase 2: Proper reparenting with error handling');
|
|
233
|
+
try {
|
|
234
|
+
// Attach first
|
|
235
|
+
errorParent1.attachChild(errorChild);
|
|
236
|
+
console.log(' Step 1: Attached to ErrorParent1 ✓');
|
|
237
|
+
|
|
238
|
+
// Then reparent
|
|
239
|
+
errorParent1.detachChild(errorChild);
|
|
240
|
+
errorParent2.attachChild(errorChild);
|
|
241
|
+
console.log(' Step 2: Reparented to ErrorParent2 ✓');
|
|
242
|
+
} catch (error) {
|
|
243
|
+
console.log('✗ Unexpected error:', (error as Error).message);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// ============================================================
|
|
247
|
+
// SUMMARY
|
|
248
|
+
// ============================================================
|
|
249
|
+
printSection('Summary');
|
|
250
|
+
|
|
251
|
+
console.log('Key Takeaways:');
|
|
252
|
+
console.log(' 1. ALWAYS detachChild() before attachChild() when reparenting');
|
|
253
|
+
console.log(' 2. The single-parent invariant prevents ambiguous parent relationships');
|
|
254
|
+
console.log(' 3. Observer propagation updates after reparenting');
|
|
255
|
+
console.log(' 4. Both workflow tree and node tree stay synchronized');
|
|
256
|
+
console.log(' 5. Use try/catch when calling detachChild() and attachChild()');
|
|
257
|
+
|
|
258
|
+
console.log('\nReparenting Pattern:');
|
|
259
|
+
console.log(' oldParent.detachChild(child); // Step 1: Detach');
|
|
260
|
+
console.log(' newParent.attachChild(child); // Step 2: Attach');
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// ============================================================
|
|
264
|
+
// RUN IF EXECUTED DIRECTLY
|
|
265
|
+
// ============================================================
|
|
266
|
+
|
|
267
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
268
|
+
runReparentingExample().catch(console.error);
|
|
269
|
+
}
|
package/examples/index.ts
CHANGED
|
@@ -26,6 +26,7 @@ import { runAgentLoopsExample } from './examples/07-agent-loops.js';
|
|
|
26
26
|
import { runSDKFeaturesExample } from './examples/08-sdk-features.js';
|
|
27
27
|
import { runReflectionExample } from './examples/09-reflection.js';
|
|
28
28
|
import { runIntrospectionExample } from './examples/10-introspection.js';
|
|
29
|
+
import { runReparentingExample } from './examples/11-reparenting-workflows.js';
|
|
29
30
|
|
|
30
31
|
const BANNER = `
|
|
31
32
|
╔═══════════════════════════════════════════════════════════════════════════════════════════════════╗
|
|
@@ -55,6 +56,7 @@ Available Examples:
|
|
|
55
56
|
8. SDK Features - Tools, MCPs, hooks, skills integration
|
|
56
57
|
9. Multi-level Reflection - Workflow, agent, prompt reflection
|
|
57
58
|
10. Introspection Tools - Agent self-awareness and hierarchy navigation
|
|
59
|
+
11. Reparenting Workflows - Detach-then-attach pattern for moving workflows
|
|
58
60
|
|
|
59
61
|
A. Run All Examples
|
|
60
62
|
Q. Quit
|
|
@@ -88,6 +90,7 @@ async function runAllExamples(): Promise<void> {
|
|
|
88
90
|
{ name: '8. SDK Features', fn: runSDKFeaturesExample },
|
|
89
91
|
{ name: '9. Multi-level Reflection', fn: runReflectionExample },
|
|
90
92
|
{ name: '10. Introspection Tools', fn: runIntrospectionExample },
|
|
93
|
+
{ name: '11. Reparenting Workflows', fn: runReparentingExample },
|
|
91
94
|
];
|
|
92
95
|
|
|
93
96
|
for (const example of examples) {
|
|
@@ -131,6 +134,7 @@ Summary of Features Demonstrated:
|
|
|
131
134
|
✓ Multi-level reflection (workflow, agent, prompt)
|
|
132
135
|
✓ Introspection tools for hierarchy navigation
|
|
133
136
|
✓ Cache integration with metrics
|
|
137
|
+
✓ Reparenting workflows with detach-then-attach pattern
|
|
134
138
|
`);
|
|
135
139
|
}
|
|
136
140
|
|