groundswell 0.0.2 → 0.0.3
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/dist/__tests__/adversarial/attachChild-performance.test.d.ts +16 -0
- package/dist/__tests__/adversarial/attachChild-performance.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/attachChild-performance.test.js +187 -0
- package/dist/__tests__/adversarial/attachChild-performance.test.js.map +1 -0
- package/dist/__tests__/adversarial/circular-reference.test.d.ts +13 -0
- package/dist/__tests__/adversarial/circular-reference.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/circular-reference.test.js +92 -0
- package/dist/__tests__/adversarial/circular-reference.test.js.map +1 -0
- package/dist/__tests__/adversarial/complex-circular-reference.test.d.ts +16 -0
- package/dist/__tests__/adversarial/complex-circular-reference.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/complex-circular-reference.test.js +127 -0
- package/dist/__tests__/adversarial/complex-circular-reference.test.js.map +1 -0
- package/dist/__tests__/adversarial/concurrent-task-failures.test.d.ts +21 -0
- package/dist/__tests__/adversarial/concurrent-task-failures.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/concurrent-task-failures.test.js +667 -0
- package/dist/__tests__/adversarial/concurrent-task-failures.test.js.map +1 -0
- package/dist/__tests__/adversarial/deep-analysis.test.d.ts +6 -0
- package/dist/__tests__/adversarial/deep-analysis.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/deep-analysis.test.js +877 -0
- package/dist/__tests__/adversarial/deep-analysis.test.js.map +1 -0
- package/dist/__tests__/adversarial/deep-hierarchy-stress.test.d.ts +13 -0
- package/dist/__tests__/adversarial/deep-hierarchy-stress.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/deep-hierarchy-stress.test.js +186 -0
- package/dist/__tests__/adversarial/deep-hierarchy-stress.test.js.map +1 -0
- package/dist/__tests__/adversarial/e2e-prd-validation.test.d.ts +6 -0
- package/dist/__tests__/adversarial/e2e-prd-validation.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/e2e-prd-validation.test.js +626 -0
- package/dist/__tests__/adversarial/e2e-prd-validation.test.js.map +1 -0
- package/dist/__tests__/adversarial/edge-case.test.d.ts +6 -0
- package/dist/__tests__/adversarial/edge-case.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/edge-case.test.js +857 -0
- package/dist/__tests__/adversarial/edge-case.test.js.map +1 -0
- package/dist/__tests__/adversarial/error-merge-strategy.test.d.ts +20 -0
- package/dist/__tests__/adversarial/error-merge-strategy.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/error-merge-strategy.test.js +907 -0
- package/dist/__tests__/adversarial/error-merge-strategy.test.js.map +1 -0
- package/dist/__tests__/adversarial/incremental-performance.test.d.ts +2 -0
- package/dist/__tests__/adversarial/incremental-performance.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/incremental-performance.test.js +113 -0
- package/dist/__tests__/adversarial/incremental-performance.test.js.map +1 -0
- package/dist/__tests__/adversarial/node-map-update-benchmarks.test.d.ts +22 -0
- package/dist/__tests__/adversarial/node-map-update-benchmarks.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/node-map-update-benchmarks.test.js +383 -0
- package/dist/__tests__/adversarial/node-map-update-benchmarks.test.js.map +1 -0
- package/dist/__tests__/adversarial/observer-propagation.test.d.ts +21 -0
- package/dist/__tests__/adversarial/observer-propagation.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/observer-propagation.test.js +404 -0
- package/dist/__tests__/adversarial/observer-propagation.test.js.map +1 -0
- package/dist/__tests__/adversarial/parent-validation.test.d.ts +13 -0
- package/dist/__tests__/adversarial/parent-validation.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/parent-validation.test.js +128 -0
- package/dist/__tests__/adversarial/parent-validation.test.js.map +1 -0
- package/dist/__tests__/adversarial/prd-12-2-compliance.test.d.ts +20 -0
- package/dist/__tests__/adversarial/prd-12-2-compliance.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/prd-12-2-compliance.test.js +482 -0
- package/dist/__tests__/adversarial/prd-12-2-compliance.test.js.map +1 -0
- package/dist/__tests__/adversarial/prd-compliance.test.d.ts +6 -0
- package/dist/__tests__/adversarial/prd-compliance.test.d.ts.map +1 -0
- package/dist/__tests__/adversarial/prd-compliance.test.js +886 -0
- package/dist/__tests__/adversarial/prd-compliance.test.js.map +1 -0
- package/dist/__tests__/compatibility/backward-compatibility.test.d.ts +22 -0
- package/dist/__tests__/compatibility/backward-compatibility.test.d.ts.map +1 -0
- package/dist/__tests__/compatibility/backward-compatibility.test.js +1843 -0
- package/dist/__tests__/compatibility/backward-compatibility.test.js.map +1 -0
- package/dist/__tests__/helpers/index.d.ts +10 -0
- package/dist/__tests__/helpers/index.d.ts.map +1 -0
- package/{src/__tests__/helpers/index.ts → dist/__tests__/helpers/index.js} +2 -10
- package/dist/__tests__/helpers/index.js.map +1 -0
- package/dist/__tests__/helpers/tree-verification.d.ts +90 -0
- package/dist/__tests__/helpers/tree-verification.d.ts.map +1 -0
- package/dist/__tests__/helpers/tree-verification.js +202 -0
- package/dist/__tests__/helpers/tree-verification.js.map +1 -0
- package/dist/__tests__/integration/agent-workflow.test.d.ts +2 -0
- package/dist/__tests__/integration/agent-workflow.test.d.ts.map +1 -0
- package/dist/__tests__/integration/agent-workflow.test.js +256 -0
- package/dist/__tests__/integration/agent-workflow.test.js.map +1 -0
- package/dist/__tests__/integration/bidirectional-consistency.test.d.ts +14 -0
- package/dist/__tests__/integration/bidirectional-consistency.test.d.ts.map +1 -0
- package/dist/__tests__/integration/bidirectional-consistency.test.js +668 -0
- package/dist/__tests__/integration/bidirectional-consistency.test.js.map +1 -0
- package/dist/__tests__/integration/observer-logging.test.d.ts +2 -0
- package/dist/__tests__/integration/observer-logging.test.d.ts.map +1 -0
- package/dist/__tests__/integration/observer-logging.test.js +517 -0
- package/dist/__tests__/integration/observer-logging.test.js.map +1 -0
- package/dist/__tests__/integration/tree-mirroring.test.d.ts +2 -0
- package/dist/__tests__/integration/tree-mirroring.test.d.ts.map +1 -0
- package/dist/__tests__/integration/tree-mirroring.test.js +117 -0
- package/dist/__tests__/integration/tree-mirroring.test.js.map +1 -0
- package/dist/__tests__/integration/workflow-reparenting.test.d.ts +12 -0
- package/dist/__tests__/integration/workflow-reparenting.test.d.ts.map +1 -0
- package/dist/__tests__/integration/workflow-reparenting.test.js +239 -0
- package/dist/__tests__/integration/workflow-reparenting.test.js.map +1 -0
- package/dist/__tests__/unit/agent.test.d.ts +2 -0
- package/dist/__tests__/unit/agent.test.d.ts.map +1 -0
- package/dist/__tests__/unit/agent.test.js +143 -0
- package/dist/__tests__/unit/agent.test.js.map +1 -0
- package/dist/__tests__/unit/cache-key.test.d.ts +5 -0
- package/dist/__tests__/unit/cache-key.test.d.ts.map +1 -0
- package/dist/__tests__/unit/cache-key.test.js +145 -0
- package/dist/__tests__/unit/cache-key.test.js.map +1 -0
- package/dist/__tests__/unit/cache.test.d.ts +5 -0
- package/dist/__tests__/unit/cache.test.d.ts.map +1 -0
- package/dist/__tests__/unit/cache.test.js +132 -0
- package/dist/__tests__/unit/cache.test.js.map +1 -0
- package/dist/__tests__/unit/context.test.d.ts +2 -0
- package/dist/__tests__/unit/context.test.d.ts.map +1 -0
- package/dist/__tests__/unit/context.test.js +220 -0
- package/dist/__tests__/unit/context.test.js.map +1 -0
- package/dist/__tests__/unit/decorators.test.d.ts +2 -0
- package/dist/__tests__/unit/decorators.test.d.ts.map +1 -0
- package/dist/__tests__/unit/decorators.test.js +162 -0
- package/dist/__tests__/unit/decorators.test.js.map +1 -0
- package/dist/__tests__/unit/introspection-tools.test.d.ts +5 -0
- package/dist/__tests__/unit/introspection-tools.test.d.ts.map +1 -0
- package/dist/__tests__/unit/introspection-tools.test.js +191 -0
- package/dist/__tests__/unit/introspection-tools.test.js.map +1 -0
- package/dist/__tests__/unit/logger.test.d.ts +2 -0
- package/dist/__tests__/unit/logger.test.d.ts.map +1 -0
- package/dist/__tests__/unit/logger.test.js +241 -0
- package/dist/__tests__/unit/logger.test.js.map +1 -0
- package/dist/__tests__/unit/observable.test.d.ts +2 -0
- package/dist/__tests__/unit/observable.test.d.ts.map +1 -0
- package/dist/__tests__/unit/observable.test.js +251 -0
- package/dist/__tests__/unit/observable.test.js.map +1 -0
- package/dist/__tests__/unit/prompt.test.d.ts +2 -0
- package/dist/__tests__/unit/prompt.test.d.ts.map +1 -0
- package/dist/__tests__/unit/prompt.test.js +113 -0
- package/dist/__tests__/unit/prompt.test.js.map +1 -0
- package/dist/__tests__/unit/reflection.test.d.ts +5 -0
- package/dist/__tests__/unit/reflection.test.d.ts.map +1 -0
- package/dist/__tests__/unit/reflection.test.js +160 -0
- package/dist/__tests__/unit/reflection.test.js.map +1 -0
- package/dist/__tests__/unit/tree-debugger-incremental.test.d.ts +2 -0
- package/dist/__tests__/unit/tree-debugger-incremental.test.d.ts.map +1 -0
- package/dist/__tests__/unit/tree-debugger-incremental.test.js +136 -0
- package/dist/__tests__/unit/tree-debugger-incremental.test.js.map +1 -0
- package/dist/__tests__/unit/tree-debugger.test.d.ts +2 -0
- package/dist/__tests__/unit/tree-debugger.test.d.ts.map +1 -0
- package/dist/__tests__/unit/tree-debugger.test.js +69 -0
- package/dist/__tests__/unit/tree-debugger.test.js.map +1 -0
- package/dist/__tests__/unit/utils/workflow-error-utils.test.d.ts +2 -0
- package/dist/__tests__/unit/utils/workflow-error-utils.test.d.ts.map +1 -0
- package/dist/__tests__/unit/utils/workflow-error-utils.test.js +154 -0
- package/dist/__tests__/unit/utils/workflow-error-utils.test.js.map +1 -0
- package/dist/__tests__/unit/workflow-detachChild.test.d.ts +2 -0
- package/dist/__tests__/unit/workflow-detachChild.test.d.ts.map +1 -0
- package/dist/__tests__/unit/workflow-detachChild.test.js +76 -0
- package/dist/__tests__/unit/workflow-detachChild.test.js.map +1 -0
- package/dist/__tests__/unit/workflow-emitEvent-childDetached.test.d.ts +2 -0
- package/dist/__tests__/unit/workflow-emitEvent-childDetached.test.d.ts.map +1 -0
- package/dist/__tests__/unit/workflow-emitEvent-childDetached.test.js +122 -0
- package/dist/__tests__/unit/workflow-emitEvent-childDetached.test.js.map +1 -0
- package/dist/__tests__/unit/workflow-isDescendantOf.test.d.ts +2 -0
- package/dist/__tests__/unit/workflow-isDescendantOf.test.d.ts.map +1 -0
- package/dist/__tests__/unit/workflow-isDescendantOf.test.js +140 -0
- package/dist/__tests__/unit/workflow-isDescendantOf.test.js.map +1 -0
- package/dist/__tests__/unit/workflow.test.d.ts +2 -0
- package/dist/__tests__/unit/workflow.test.d.ts.map +1 -0
- package/dist/__tests__/unit/workflow.test.js +330 -0
- package/dist/__tests__/unit/workflow.test.js.map +1 -0
- package/dist/cache/cache-key.d.ts +66 -0
- package/dist/cache/cache-key.d.ts.map +1 -0
- package/dist/cache/cache-key.js +195 -0
- package/dist/cache/cache-key.js.map +1 -0
- package/dist/cache/cache.d.ts +104 -0
- package/dist/cache/cache.d.ts.map +1 -0
- package/dist/cache/cache.js +179 -0
- package/dist/cache/cache.js.map +1 -0
- package/{src/cache/index.ts → dist/cache/index.d.ts} +1 -1
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +6 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/core/agent.d.ts +112 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +426 -0
- package/dist/core/agent.js.map +1 -0
- package/{src/core/context.ts → dist/core/context.d.ts} +16 -67
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +80 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/event-tree.d.ts +72 -0
- package/dist/core/event-tree.d.ts.map +1 -0
- package/dist/core/event-tree.js +211 -0
- package/dist/core/event-tree.js.map +1 -0
- package/{src/core/factory.ts → dist/core/factory.d.ts} +6 -27
- package/dist/core/factory.d.ts.map +1 -0
- package/dist/core/factory.js +110 -0
- package/dist/core/factory.js.map +1 -0
- package/{src/core/index.ts → dist/core/index.d.ts} +2 -10
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/logger.d.ts +50 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +91 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/mcp-handler.d.ts +69 -0
- package/dist/core/mcp-handler.d.ts.map +1 -0
- package/dist/core/mcp-handler.js +143 -0
- package/dist/core/mcp-handler.js.map +1 -0
- package/dist/core/prompt.d.ts +80 -0
- package/dist/core/prompt.d.ts.map +1 -0
- package/dist/core/prompt.js +120 -0
- package/dist/core/prompt.js.map +1 -0
- package/dist/core/workflow-context.d.ts +57 -0
- package/dist/core/workflow-context.d.ts.map +1 -0
- package/dist/core/workflow-context.js +263 -0
- package/dist/core/workflow-context.js.map +1 -0
- package/dist/core/workflow.d.ts +241 -0
- package/dist/core/workflow.d.ts.map +1 -0
- package/dist/core/workflow.js +464 -0
- package/dist/core/workflow.js.map +1 -0
- package/dist/debugger/index.d.ts +2 -0
- package/dist/debugger/index.d.ts.map +1 -0
- package/{src/debugger/index.ts → dist/debugger/index.js} +1 -0
- package/dist/debugger/index.js.map +1 -0
- package/dist/debugger/tree-debugger.d.ts +71 -0
- package/dist/debugger/tree-debugger.d.ts.map +1 -0
- package/dist/debugger/tree-debugger.js +198 -0
- package/dist/debugger/tree-debugger.js.map +1 -0
- package/dist/decorators/index.d.ts +4 -0
- package/dist/decorators/index.d.ts.map +1 -0
- package/{src/decorators/index.ts → dist/decorators/index.js} +1 -0
- package/dist/decorators/index.js.map +1 -0
- package/dist/decorators/observed-state.d.ts +32 -0
- package/dist/decorators/observed-state.d.ts.map +1 -0
- package/dist/decorators/observed-state.js +79 -0
- package/dist/decorators/observed-state.js.map +1 -0
- package/dist/decorators/step.d.ts +15 -0
- package/dist/decorators/step.d.ts.map +1 -0
- package/dist/decorators/step.js +110 -0
- package/dist/decorators/step.js.map +1 -0
- package/dist/decorators/task.d.ts +50 -0
- package/dist/decorators/task.d.ts.map +1 -0
- package/dist/decorators/task.js +118 -0
- package/dist/decorators/task.js.map +1 -0
- package/dist/examples/index.d.ts +3 -0
- package/dist/examples/index.d.ts.map +1 -0
- package/{src/examples/index.ts → dist/examples/index.js} +1 -0
- package/dist/examples/index.js.map +1 -0
- package/dist/examples/tdd-orchestrator.d.ts +15 -0
- package/dist/examples/tdd-orchestrator.d.ts.map +1 -0
- package/dist/examples/tdd-orchestrator.js +121 -0
- package/dist/examples/tdd-orchestrator.js.map +1 -0
- package/dist/examples/test-cycle-workflow.d.ts +14 -0
- package/dist/examples/test-cycle-workflow.d.ts.map +1 -0
- package/dist/examples/test-cycle-workflow.js +116 -0
- package/dist/examples/test-cycle-workflow.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/reflection/index.d.ts +5 -0
- package/dist/reflection/index.d.ts.map +1 -0
- package/{src/reflection/index.ts → dist/reflection/index.js} +1 -1
- package/dist/reflection/index.js.map +1 -0
- package/dist/reflection/reflection.d.ts +84 -0
- package/dist/reflection/reflection.d.ts.map +1 -0
- package/dist/reflection/reflection.js +329 -0
- package/dist/reflection/reflection.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +11 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/introspection.d.ts +165 -0
- package/dist/tools/introspection.d.ts.map +1 -0
- package/dist/tools/introspection.js +324 -0
- package/dist/tools/introspection.js.map +1 -0
- package/dist/types/agent.d.ts +66 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +6 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/decorators.d.ts +31 -0
- package/dist/types/decorators.d.ts.map +1 -0
- package/dist/types/decorators.js +2 -0
- package/dist/types/decorators.js.map +1 -0
- package/dist/types/error-strategy.d.ts +13 -0
- package/dist/types/error-strategy.d.ts.map +1 -0
- package/dist/types/error-strategy.js +2 -0
- package/dist/types/error-strategy.js.map +1 -0
- package/dist/types/error.d.ts +20 -0
- package/dist/types/error.d.ts.map +1 -0
- package/dist/types/error.js +2 -0
- package/dist/types/error.js.map +1 -0
- package/dist/types/events.d.ts +87 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +2 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/index.d.ts +15 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/logging.d.ts +24 -0
- package/dist/types/logging.d.ts.map +1 -0
- package/dist/types/logging.js +2 -0
- package/dist/types/logging.js.map +1 -0
- package/dist/types/observer.d.ts +18 -0
- package/dist/types/observer.d.ts.map +1 -0
- package/dist/types/observer.js +2 -0
- package/dist/types/observer.js.map +1 -0
- package/dist/types/prompt.d.ts +31 -0
- package/dist/types/prompt.d.ts.map +1 -0
- package/dist/types/prompt.js +6 -0
- package/dist/types/prompt.js.map +1 -0
- package/dist/types/reflection.d.ts +96 -0
- package/dist/types/reflection.d.ts.map +1 -0
- package/dist/types/reflection.js +24 -0
- package/dist/types/reflection.js.map +1 -0
- package/dist/types/sdk-primitives.d.ts +118 -0
- package/dist/types/sdk-primitives.d.ts.map +1 -0
- package/dist/types/sdk-primitives.js +6 -0
- package/dist/types/sdk-primitives.js.map +1 -0
- package/{src/types/snapshot.ts → dist/types/snapshot.d.ts} +5 -5
- package/dist/types/snapshot.d.ts.map +1 -0
- package/dist/types/snapshot.js +2 -0
- package/dist/types/snapshot.js.map +1 -0
- package/dist/types/workflow-context.d.ts +139 -0
- package/dist/types/workflow-context.d.ts.map +1 -0
- package/dist/types/workflow-context.js +8 -0
- package/dist/types/workflow-context.js.map +1 -0
- package/dist/types/workflow.d.ts +30 -0
- package/dist/types/workflow.d.ts.map +1 -0
- package/dist/types/workflow.js +2 -0
- package/dist/types/workflow.js.map +1 -0
- package/dist/utils/id.d.ts +6 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js +12 -0
- package/dist/utils/id.js.map +1 -0
- package/{src/utils/index.ts → dist/utils/index.d.ts} +1 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/observable.d.ts +54 -0
- package/dist/utils/observable.d.ts.map +1 -0
- package/dist/utils/observable.js +82 -0
- package/dist/utils/observable.js.map +1 -0
- package/dist/utils/workflow-error-utils.d.ts +22 -0
- package/dist/utils/workflow-error-utils.d.ts.map +1 -0
- package/dist/utils/workflow-error-utils.js +45 -0
- package/dist/utils/workflow-error-utils.js.map +1 -0
- package/package.json +5 -2
- package/.claude/commands/subtask-planning/prp-base-create.md +0 -120
- package/.claude/commands/subtask-planning/prp-base-execute.md +0 -65
- package/.claude/commands/task-breakdown.md +0 -94
- package/.claude/settings.local.json +0 -9
- package/.claude/system_prompts/task-breakdown.md +0 -101
- package/PRD.md +0 -543
- package/PRPs/001-hierarchical-workflow-engine.md +0 -2438
- package/PRPs/PRDs/002-agent-prompt.md +0 -390
- package/PRPs/PRDs/003-agent-prompt.md +0 -943
- package/PRPs/PRDs/004-agent-prompt.md +0 -1136
- package/PRPs/PRDs/tasks-001.json +0 -492
- package/PRPs/README.md +0 -83
- package/PRPs/templates/prp_base.md +0 -222
- package/docs/agent.md +0 -422
- package/docs/prompt.md +0 -419
- package/docs/workflow.md +0 -600
- package/examples/README.md +0 -258
- package/examples/examples/01-basic-workflow.ts +0 -100
- package/examples/examples/02-decorator-options.ts +0 -217
- package/examples/examples/03-parent-child.ts +0 -241
- package/examples/examples/04-observers-debugger.ts +0 -340
- package/examples/examples/05-error-handling.ts +0 -387
- package/examples/examples/06-concurrent-tasks.ts +0 -352
- package/examples/examples/07-agent-loops.ts +0 -432
- package/examples/examples/08-sdk-features.ts +0 -667
- package/examples/examples/09-reflection.ts +0 -573
- package/examples/examples/10-introspection.ts +0 -550
- package/examples/examples/11-reparenting-workflows.ts +0 -269
- package/examples/index.ts +0 -147
- package/examples/utils/helpers.ts +0 -57
- package/package-lock.json +0 -2398
- package/plan/001_d3bb02af4886/TEST_RESULTS.md +0 -259
- package/plan/001_d3bb02af4886/backlog.json +0 -867
- package/plan/001_d3bb02af4886/bug_fix_tasks.json +0 -484
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S1/PRP.md +0 -488
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S2/PRP.md +0 -581
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S3/PRP.md +0 -687
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S1/PRP.md +0 -492
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/PRP.md +0 -932
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/concurrent_error_testing_patterns.md +0 -1109
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/vitest_concurrent_testing.md +0 -802
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/workflow_engine_test_references.md +0 -603
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S1/PRP.md +0 -564
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S3/PRP.md +0 -518
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S4/PRP.md +0 -1252
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/PRP.md +0 -364
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/CODEBASE_INVENTORY.md +0 -114
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/DECORATOR_DOCUMENTATION_PATTERNS.md +0 -205
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/PRD_LOCATION_ANALYSIS.md +0 -199
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/ULTRATHINK_PRP_PLAN.md +0 -134
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S1/PRP.md +0 -495
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S1/research/console_error_inventory.md +0 -435
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S2/PRP.md +0 -506
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S3/PRP.md +0 -612
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T2S2/PRP.md +0 -558
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T2S2/research/external_research.md +0 -788
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T3S2/PRP.md +0 -460
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T3S3/PRP.md +0 -454
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/PRP.md +0 -520
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/RECOMMENDATION.md +0 -417
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/research/external_workflow_engines_research.md +0 -760
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/research/security_implications_analysis.md +0 -245
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S2/PRP.md +0 -792
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S1/PRP.md +0 -535
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S1/TEST_EXECUTION_REPORT.md +0 -190
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/PRP.md +0 -654
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/TEST_FIX_REPORT.md +0 -227
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/KEY_FINDINGS.md +0 -345
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/QUICK_REFERENCE.md +0 -193
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/test_maintenance_research.md +0 -1323
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S1/BREAKING_CHANGES_AUDIT.md +0 -1011
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S1/PRP.md +0 -927
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S2/PRP.md +0 -505
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/architecture/logger_child_signature_analysis.md +0 -401
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/child_implementation_research.md +0 -142
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/test_patterns_research.md +0 -112
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/vitest_patterns_research.md +0 -159
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/PRP.md +0 -549
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/VERIFICATION_REPORT.md +0 -368
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/edge_case_analysis.md +0 -172
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/usage_inventory.md +0 -175
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T1S2/PRP.md +0 -696
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T1S4/PRP.md +0 -860
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/PRP.md +0 -1066
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/01-testing-aggregated-errors.md +0 -1103
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/01_typescript_error_aggregation_patterns.md +0 -789
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/02-error-merge-strategy-testing-guide.md +0 -1098
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/02_aggregate_error_patterns.md +0 -1037
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/03-promise-allsettled-testing-patterns.md +0 -916
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/03_error_merging_strategies.md +0 -1045
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/04_github_stackoverflow_examples.md +0 -890
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/05_comprehensive_summary.md +0 -822
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/INDEX.md +0 -668
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/QUICK_REFERENCE.md +0 -706
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/README.md +0 -265
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/RESEARCH_REPORT.md +0 -655
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S4/research/vitest_testing_patterns.md +0 -1103
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T3S2/PRP.md +0 -426
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/PRP.md +0 -506
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/QUICK_REFERENCE.md +0 -114
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/RESEARCH_SUMMARY.md +0 -316
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/vitest_observer_error_logging_best_practices.md +0 -754
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S3/PRP.md +0 -612
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/PRP.md +0 -719
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/README.md +0 -215
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/analysis.md +0 -765
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S3/PRP.md +0 -718
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/DECISION.md +0 -149
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/PRP.md +0 -470
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/ULTRATHINK_PLAN.md +0 -332
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/codebase_workflow_name_analysis.md +0 -167
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/external_best_practices.md +0 -265
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/validation_patterns.md +0 -273
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T4S1/workflow_engine_ancestry_api_research.md +0 -760
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T4S3-PRP.md +0 -434
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S1/PRP.md +0 -717
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/PRP.md +0 -472
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/VALIDATION_REPORT.md +0 -125
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/research/ULTRATHINK_PRP_PLAN.md +0 -301
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/error-logging-best-practices.md +0 -1170
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/research_typescript_partial_and_overloads.md +0 -940
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/vitest-quick-reference.md +0 -151
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/vitest-research.md +0 -650
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/prd_snapshot.md +0 -259
- package/plan/001_d3bb02af4886/bugfix/P1M1T1S1/PRP.md +0 -457
- package/plan/001_d3bb02af4886/bugfix/RESEARCH_SUMMARY.md +0 -346
- package/plan/001_d3bb02af4886/bugfix/architecture/codebase_structure.md +0 -311
- package/plan/001_d3bb02af4886/bugfix/architecture/concurrent_execution_best_practices.md +0 -1565
- package/plan/001_d3bb02af4886/bugfix/architecture/error_handling_patterns.md +0 -288
- package/plan/001_d3bb02af4886/bugfix/architecture/promise_all_analysis.md +0 -741
- package/plan/001_d3bb02af4886/docs/PRP/P1M1T1S4-functional-workflow-error-state-capture-test.md +0 -652
- package/plan/001_d3bb02af4886/docs/PRP/P1P2-PRP.md +0 -527
- package/plan/001_d3bb02af4886/docs/PRP/P3P4-PRP.md +0 -1388
- package/plan/001_d3bb02af4886/docs/PRP/P4P5-PRP.md +0 -1136
- package/plan/001_d3bb02af4886/docs/PRP/PRP.md +0 -527
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S1-PRP.md +0 -415
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S2-PRP.md +0 -378
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S4-PRP.md +0 -713
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M2T1S4-PRP.md +0 -370
- package/plan/001_d3bb02af4886/docs/PRP_P1M3T1S3.md +0 -499
- package/plan/001_d3bb02af4886/docs/TEST_RESULTS.md +0 -230
- package/plan/001_d3bb02af4886/docs/architecture/external_deps.md +0 -358
- package/plan/001_d3bb02af4886/docs/architecture/system_context.md +0 -242
- package/plan/001_d3bb02af4886/docs/bugfix/ANALYSIS_PRD_VS_IMPLEMENTATION.md +0 -1134
- package/plan/001_d3bb02af4886/docs/bugfix/GAP_ANALYSIS_SUMMARY.md +0 -179
- package/plan/001_d3bb02af4886/docs/bugfix/P1M4T2S1/PRP.md +0 -629
- package/plan/001_d3bb02af4886/docs/bugfix/P1M4T2S1/validation-report.md +0 -214
- package/plan/001_d3bb02af4886/docs/bugfix/PRP_P1M4T2S3.md +0 -629
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_PRP.md +0 -529
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_QUICK_REFERENCE.md +0 -142
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_README.md +0 -304
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_TEST_RESULTS.md +0 -558
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_VALIDATION_SUMMARY.md +0 -256
- package/plan/001_d3bb02af4886/docs/bugfix/system_context.md +0 -346
- package/plan/001_d3bb02af4886/docs/bugfix-architecture/bug_analysis.md +0 -415
- package/plan/001_d3bb02af4886/docs/bugfix-architecture/implementation_patterns.md +0 -489
- package/plan/001_d3bb02af4886/docs/bugfix-architecture/system_context.md +0 -218
- package/plan/001_d3bb02af4886/docs/bugfix_INITIATION_SUMMARY.md +0 -380
- package/plan/001_d3bb02af4886/docs/research/CYCLE_DETECTION_PATTERNS.md +0 -1923
- package/plan/001_d3bb02af4886/docs/research/CYCLE_DETECTION_QUICK_REF.md +0 -319
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/codebase-context.md +0 -115
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/cycle-detection-algorithms.md +0 -134
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/test-patterns.md +0 -153
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/workflow-class.md +0 -132
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/DECORATOR_DOCUMENTATION_BEST_PRACTICES.md +0 -716
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/DECORATOR_DOCUMENTATION_QUICK_REF.md +0 -186
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/GROUNDSWELL_DECORATOR_EXAMPLES.md +0 -604
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/INDEX.md +0 -213
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/codebase_structure.md +0 -30
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/existing_test_pattern.md +0 -56
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/getRootObservers_implementation.md +0 -53
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/test_conventions.md +0 -49
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/PRP.md +0 -958
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/QUICK_REFERENCE.md +0 -339
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/README.md +0 -305
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/SUMMARY.md +0 -433
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/bidirectional-tree-consistency-testing.md +0 -1574
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/test-pattern-examples.md +0 -1014
- package/plan/001_d3bb02af4886/docs/research/P1P2/LRU_CACHE_BEST_PRACTICES.md +0 -1929
- package/plan/001_d3bb02af4886/docs/research/P1P2/LRU_CACHE_CODE_PATTERNS.md +0 -857
- package/plan/001_d3bb02af4886/docs/research/P1P2/LRU_CACHE_INTEGRATION_GUIDE.md +0 -738
- package/plan/001_d3bb02af4886/docs/research/P1P2/LRU_CACHE_RESEARCH_INDEX.md +0 -424
- package/plan/001_d3bb02af4886/docs/research/P1P2/REFLECTION_INDEX.md +0 -291
- package/plan/001_d3bb02af4886/docs/research/P1P2/REFLECTION_RESEARCH_REPORT.md +0 -1342
- package/plan/001_d3bb02af4886/docs/research/P1P2/RESEARCH_SUMMARY.md +0 -342
- package/plan/001_d3bb02af4886/docs/research/P1P2/anthropic-sdk.md +0 -174
- package/plan/001_d3bb02af4886/docs/research/P1P2/async-local-storage.md +0 -200
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-code-patterns.md +0 -1205
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-decision-matrix.md +0 -421
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-implementation-guide.md +0 -1341
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-integration-guide.md +0 -834
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-patterns.md +0 -1468
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-quick-reference.md +0 -558
- package/plan/001_d3bb02af4886/docs/research/P1P2/zod-schema.md +0 -152
- package/plan/001_d3bb02af4886/docs/research/P3P4/caching-lru.md +0 -116
- package/plan/001_d3bb02af4886/docs/research/P3P4/introspection-tools.md +0 -177
- package/plan/001_d3bb02af4886/docs/research/P3P4/reflection-patterns.md +0 -117
- package/plan/001_d3bb02af4886/docs/research/P4P5/RESEARCH_SUMMARY.md +0 -151
- package/plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_QUICK_REF.md +0 -376
- package/plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_RESEARCH.md +0 -1507
- package/plan/001_d3bb02af4886/docs/research/bugfix_typescript_patterns.md +0 -949
- package/plan/001_d3bb02af4886/docs/research/error-testing-research.md +0 -619
- package/plan/001_d3bb02af4886/docs/research/error_handling_patterns.md +0 -723
- package/plan/001_d3bb02af4886/docs/research/general/INTROSPECTION_RESEARCH_SUMMARY.md +0 -378
- package/plan/001_d3bb02af4886/docs/research/general/README-INTROSPECTION.md +0 -352
- package/plan/001_d3bb02af4886/docs/research/general/agent-introspection-patterns.md +0 -1085
- package/plan/001_d3bb02af4886/docs/research/general/introspection-security-guide.md +0 -984
- package/plan/001_d3bb02af4886/docs/research/general/introspection-tool-examples.md +0 -875
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/PRP_TEMPLATE.md +0 -460
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/QUICK_REFERENCE.md +0 -324
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/README.md +0 -175
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/RESEARCH_REPORT.md +0 -499
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/SUMMARY.md +0 -163
- package/plan/001_d3bb02af4886/prd_snapshot.md +0 -543
- package/plan/bugfix/BUG_FIX_SUMMARY.md +0 -961
- package/scripts/generate-llms-full.ts +0 -206
- package/src/__tests__/adversarial/attachChild-performance.test.ts +0 -216
- package/src/__tests__/adversarial/circular-reference.test.ts +0 -101
- package/src/__tests__/adversarial/complex-circular-reference.test.ts +0 -139
- package/src/__tests__/adversarial/concurrent-task-failures.test.ts +0 -571
- package/src/__tests__/adversarial/deep-analysis.test.ts +0 -729
- package/src/__tests__/adversarial/deep-hierarchy-stress.test.ts +0 -213
- package/src/__tests__/adversarial/e2e-prd-validation.test.ts +0 -448
- package/src/__tests__/adversarial/edge-case.test.ts +0 -703
- package/src/__tests__/adversarial/error-merge-strategy.test.ts +0 -760
- package/src/__tests__/adversarial/incremental-performance.test.ts +0 -140
- package/src/__tests__/adversarial/node-map-update-benchmarks.test.ts +0 -457
- package/src/__tests__/adversarial/observer-propagation.test.ts +0 -487
- package/src/__tests__/adversarial/parent-validation.test.ts +0 -143
- package/src/__tests__/adversarial/prd-12-2-compliance.test.ts +0 -611
- package/src/__tests__/adversarial/prd-compliance.test.ts +0 -731
- package/src/__tests__/compatibility/backward-compatibility.test.ts +0 -1572
- package/src/__tests__/helpers/tree-verification.ts +0 -257
- package/src/__tests__/integration/agent-workflow.test.ts +0 -256
- package/src/__tests__/integration/bidirectional-consistency.test.ts +0 -847
- package/src/__tests__/integration/observer-logging.test.ts +0 -643
- package/src/__tests__/integration/tree-mirroring.test.ts +0 -151
- package/src/__tests__/integration/workflow-reparenting.test.ts +0 -303
- package/src/__tests__/unit/agent.test.ts +0 -169
- package/src/__tests__/unit/cache-key.test.ts +0 -182
- package/src/__tests__/unit/cache.test.ts +0 -172
- package/src/__tests__/unit/context.test.ts +0 -217
- package/src/__tests__/unit/decorators.test.ts +0 -100
- package/src/__tests__/unit/introspection-tools.test.ts +0 -277
- package/src/__tests__/unit/logger.test.ts +0 -293
- package/src/__tests__/unit/observable.test.ts +0 -321
- package/src/__tests__/unit/prompt.test.ts +0 -135
- package/src/__tests__/unit/reflection.test.ts +0 -210
- package/src/__tests__/unit/tree-debugger-incremental.test.ts +0 -170
- package/src/__tests__/unit/tree-debugger.test.ts +0 -85
- package/src/__tests__/unit/utils/workflow-error-utils.test.ts +0 -209
- package/src/__tests__/unit/workflow-detachChild.test.ts +0 -100
- package/src/__tests__/unit/workflow-emitEvent-childDetached.test.ts +0 -153
- package/src/__tests__/unit/workflow-isDescendantOf.test.ts +0 -180
- package/src/__tests__/unit/workflow.test.ts +0 -357
- package/src/cache/cache-key.ts +0 -244
- package/src/cache/cache.ts +0 -236
- package/src/core/agent.ts +0 -593
- package/src/core/event-tree.ts +0 -260
- package/src/core/logger.ts +0 -112
- package/src/core/mcp-handler.ts +0 -184
- package/src/core/prompt.ts +0 -150
- package/src/core/workflow-context.ts +0 -351
- package/src/core/workflow.ts +0 -540
- package/src/debugger/tree-debugger.ts +0 -255
- package/src/decorators/observed-state.ts +0 -95
- package/src/decorators/step.ts +0 -139
- package/src/decorators/task.ts +0 -159
- package/src/examples/tdd-orchestrator.ts +0 -65
- package/src/examples/test-cycle-workflow.ts +0 -64
- package/src/index.ts +0 -142
- package/src/reflection/reflection.ts +0 -407
- package/src/tools/index.ts +0 -36
- package/src/tools/introspection.ts +0 -464
- package/src/types/agent.ts +0 -90
- package/src/types/decorators.ts +0 -32
- package/src/types/error-strategy.ts +0 -13
- package/src/types/error.ts +0 -20
- package/src/types/events.ts +0 -75
- package/src/types/index.ts +0 -55
- package/src/types/logging.ts +0 -24
- package/src/types/observer.ts +0 -18
- package/src/types/prompt.ts +0 -40
- package/src/types/reflection.ts +0 -117
- package/src/types/sdk-primitives.ts +0 -128
- package/src/types/workflow-context.ts +0 -163
- package/src/types/workflow.ts +0 -37
- package/src/utils/id.ts +0 -11
- package/src/utils/observable.ts +0 -106
- package/src/utils/workflow-error-utils.ts +0 -56
- package/tsconfig.json +0 -22
- package/vitest.config.ts +0 -16
|
@@ -1,940 +0,0 @@
|
|
|
1
|
-
# TypeScript Partial<T> and Method Overloading Research
|
|
2
|
-
|
|
3
|
-
## Executive Summary
|
|
4
|
-
|
|
5
|
-
This document provides comprehensive research on TypeScript's `Partial<T>` utility type and function overloading best practices, with specific focus on backward-compatible API evolution patterns.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## 1. TypeScript Partial<T> Utility Type
|
|
10
|
-
|
|
11
|
-
### Official Documentation
|
|
12
|
-
- **URL**: https://www.typescriptlang.org/docs/handbook/utility-types.html
|
|
13
|
-
- **Section**: Utility Types → Partial
|
|
14
|
-
- **Direct Anchor**: `#partialtype`
|
|
15
|
-
|
|
16
|
-
### Definition and Behavior
|
|
17
|
-
|
|
18
|
-
`Partial<T>` is a built-in TypeScript utility type that constructs a type with all properties of `T` set to optional. It's defined in the standard library as:
|
|
19
|
-
|
|
20
|
-
```typescript
|
|
21
|
-
type Partial<T> = {
|
|
22
|
-
[P in keyof T]?: T[P];
|
|
23
|
-
};
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
### Key Characteristics
|
|
27
|
-
|
|
28
|
-
1. **Makes all properties optional**: Adds `?` modifier to every property
|
|
29
|
-
2. **Shallow operation**: Only affects top-level properties, not nested objects
|
|
30
|
-
3. **Preserves readonly modifiers**: Maintains readonly status of properties
|
|
31
|
-
4. **Preserves optional modifiers**: Already-optional properties remain optional
|
|
32
|
-
|
|
33
|
-
### Practical Examples
|
|
34
|
-
|
|
35
|
-
#### Basic Usage
|
|
36
|
-
```typescript
|
|
37
|
-
interface User {
|
|
38
|
-
id: number;
|
|
39
|
-
name: string;
|
|
40
|
-
email: string;
|
|
41
|
-
age: number;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// All properties become optional
|
|
45
|
-
type PartialUser = Partial<User>;
|
|
46
|
-
// Equivalent to:
|
|
47
|
-
// {
|
|
48
|
-
// id?: number;
|
|
49
|
-
// name?: string;
|
|
50
|
-
// email?: string;
|
|
51
|
-
// age?: number;
|
|
52
|
-
// }
|
|
53
|
-
|
|
54
|
-
function updateUser(user: User, updates: Partial<User>): User {
|
|
55
|
-
return { ...user, ...updates };
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
const original: User = { id: 1, name: 'John', email: 'john@example.com', age: 30 };
|
|
59
|
-
const updated = updateUser(original, { age: 31 });
|
|
60
|
-
// { id: 1, name: 'John', email: 'john@example.com', age: 31 }
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
#### Common Use Cases
|
|
64
|
-
|
|
65
|
-
1. **Update Operations (PATCH semantics)**
|
|
66
|
-
```typescript
|
|
67
|
-
interface Product {
|
|
68
|
-
id: string;
|
|
69
|
-
name: string;
|
|
70
|
-
price: number;
|
|
71
|
-
description: string;
|
|
72
|
-
inStock: boolean;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
function patchProduct(id: string, updates: Partial<Product>): Product {
|
|
76
|
-
const existing = getProductFromDB(id);
|
|
77
|
-
return { ...existing, ...updates };
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// Client can update only what they need
|
|
81
|
-
patchProduct('123', { price: 29.99 });
|
|
82
|
-
patchProduct('123', { name: 'New Name', inStock: false });
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
2. **Form Handling**
|
|
86
|
-
```typescript
|
|
87
|
-
interface UserProfile {
|
|
88
|
-
displayName: string;
|
|
89
|
-
bio: string;
|
|
90
|
-
avatarUrl: string;
|
|
91
|
-
location: string;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
function handleProfileForm(formData: Partial<UserProfile>): void {
|
|
95
|
-
// Only submitted fields are present
|
|
96
|
-
if (formData.displayName) {
|
|
97
|
-
updateDisplayName(formData.displayName);
|
|
98
|
-
}
|
|
99
|
-
// ...
|
|
100
|
-
}
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
3. **Configuration Objects**
|
|
104
|
-
```typescript
|
|
105
|
-
interface ServerConfig {
|
|
106
|
-
host: string;
|
|
107
|
-
port: number;
|
|
108
|
-
ssl: boolean;
|
|
109
|
-
maxConnections: number;
|
|
110
|
-
timeout: number;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
function createServer(config: Partial<ServerConfig>): Server {
|
|
114
|
-
const defaults: ServerConfig = {
|
|
115
|
-
host: 'localhost',
|
|
116
|
-
port: 3000,
|
|
117
|
-
ssl: false,
|
|
118
|
-
maxConnections: 100,
|
|
119
|
-
timeout: 30000
|
|
120
|
-
};
|
|
121
|
-
return { ...defaults, ...config };
|
|
122
|
-
}
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
### Advanced Patterns
|
|
126
|
-
|
|
127
|
-
#### DeepPartial for Nested Objects
|
|
128
|
-
```typescript
|
|
129
|
-
type DeepPartial<T> = {
|
|
130
|
-
[P in keyof T]?: T[P] extends object
|
|
131
|
-
? DeepPartial<T[P]>
|
|
132
|
-
: T[P];
|
|
133
|
-
};
|
|
134
|
-
|
|
135
|
-
interface NestedConfig {
|
|
136
|
-
database: {
|
|
137
|
-
host: string;
|
|
138
|
-
port: number;
|
|
139
|
-
credentials: {
|
|
140
|
-
username: string;
|
|
141
|
-
password: string;
|
|
142
|
-
};
|
|
143
|
-
};
|
|
144
|
-
server: {
|
|
145
|
-
port: number;
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
const partialConfig: DeepPartial<NestedConfig> = {
|
|
150
|
-
database: {
|
|
151
|
-
credentials: {
|
|
152
|
-
username: 'admin'
|
|
153
|
-
// password and other fields optional
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
};
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
---
|
|
160
|
-
|
|
161
|
-
## 2. TypeScript Function Overloads
|
|
162
|
-
|
|
163
|
-
### Official Documentation
|
|
164
|
-
- **URL**: https://www.typescriptlang.org/docs/handbook/2/functions.html
|
|
165
|
-
- **Section**: Functions → Function Overloads
|
|
166
|
-
- **Direct Anchor**: #function-overloads
|
|
167
|
-
|
|
168
|
-
### Definition and Purpose
|
|
169
|
-
|
|
170
|
-
Function overloads allow you to define multiple function signatures for a single function implementation, enabling:
|
|
171
|
-
- Better type inference for different argument combinations
|
|
172
|
-
- More specific return types based on input types
|
|
173
|
-
- Backward-compatible API evolution
|
|
174
|
-
- Better IDE autocomplete and documentation
|
|
175
|
-
|
|
176
|
-
### Syntax Structure
|
|
177
|
-
|
|
178
|
-
```typescript
|
|
179
|
-
// Overload signatures (declaration only, no body)
|
|
180
|
-
function process(input: string): string;
|
|
181
|
-
function process(input: number): number;
|
|
182
|
-
function process(input: boolean): boolean;
|
|
183
|
-
|
|
184
|
-
// Implementation signature (must be compatible with all overloads)
|
|
185
|
-
function process(input: string | number | boolean): string | number | boolean {
|
|
186
|
-
return input;
|
|
187
|
-
}
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
### Critical Rules
|
|
191
|
-
|
|
192
|
-
1. **Order matters**: Most specific signatures must come first
|
|
193
|
-
2. **Implementation compatibility**: Implementation signature must accept all overload signatures
|
|
194
|
-
3. **No implementation in overloads**: Overload signatures have no body
|
|
195
|
-
4. **Type narrowing**: Use type guards in implementation to handle different cases
|
|
196
|
-
|
|
197
|
-
### Comprehensive Examples
|
|
198
|
-
|
|
199
|
-
#### Example 1: String vs Number Processing
|
|
200
|
-
```typescript
|
|
201
|
-
// Overload signatures
|
|
202
|
-
function format(value: string): string;
|
|
203
|
-
function format(value: number): string;
|
|
204
|
-
function format(value: boolean): string;
|
|
205
|
-
|
|
206
|
-
// Implementation
|
|
207
|
-
function format(value: string | number | boolean): string {
|
|
208
|
-
if (typeof value === 'string') {
|
|
209
|
-
return value.toUpperCase();
|
|
210
|
-
} else if (typeof value === 'number') {
|
|
211
|
-
return value.toFixed(2);
|
|
212
|
-
} else {
|
|
213
|
-
return value ? 'YES' : 'NO';
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
// Usage with proper type inference
|
|
218
|
-
const result1 = format('hello'); // string, returns "HELLO"
|
|
219
|
-
const result2 = format(3.14159); // string, returns "3.14"
|
|
220
|
-
const result3 = format(true); // string, returns "YES"
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
#### Example 2: Different Return Types Based on Input
|
|
224
|
-
```typescript
|
|
225
|
-
function createElement(tag: 'div'): HTMLDivElement;
|
|
226
|
-
function createElement(tag: 'span'): HTMLSpanElement;
|
|
227
|
-
function createElement(tag: 'canvas'): HTMLCanvasElement;
|
|
228
|
-
function createElement(tag: string): HTMLElement {
|
|
229
|
-
return document.createElement(tag);
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
const div = createElement('div'); // HTMLDivElement
|
|
233
|
-
const span = createElement('span'); // HTMLSpanElement
|
|
234
|
-
const canvas = createElement('canvas'); // HTMLCanvasElement
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
#### Example 3: Optional Parameters with Different Behavior
|
|
238
|
-
```typescript
|
|
239
|
-
// Old API: getData(id)
|
|
240
|
-
// New API: getData(id, options) with backward compatibility
|
|
241
|
-
|
|
242
|
-
interface DataOptions {
|
|
243
|
-
includeMetadata?: boolean;
|
|
244
|
-
refresh?: boolean;
|
|
245
|
-
timeout?: number;
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
function getData(id: string): Promise<Data>;
|
|
249
|
-
function getData(id: string, options: DataOptions): Promise<Data & { metadata: Metadata }>;
|
|
250
|
-
async function getData(id: string, options?: DataOptions): Promise<any> {
|
|
251
|
-
const baseData = await fetchFromDatabase(id);
|
|
252
|
-
|
|
253
|
-
if (options?.includeMetadata) {
|
|
254
|
-
const metadata = await fetchMetadata(id);
|
|
255
|
-
return { ...baseData, metadata };
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
return baseData;
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
// Both old and new code work
|
|
262
|
-
const data1 = await getData('user-123');
|
|
263
|
-
const data2 = await getData('user-123', { includeMetadata: true });
|
|
264
|
-
```
|
|
265
|
-
|
|
266
|
-
---
|
|
267
|
-
|
|
268
|
-
## 3. Backward-Compatible Method Signature Evolution
|
|
269
|
-
|
|
270
|
-
### Strategy: Adding New Parameters via Overloads
|
|
271
|
-
|
|
272
|
-
#### Pattern 1: Simple Optional Parameters
|
|
273
|
-
```typescript
|
|
274
|
-
// Original API
|
|
275
|
-
function log(message: string): void;
|
|
276
|
-
|
|
277
|
-
// Evolved API with optional parameter
|
|
278
|
-
function log(message: string): void;
|
|
279
|
-
function log(message: string, level: LogLevel): void;
|
|
280
|
-
function log(message: string, level: LogLevel = LogLevel.INFO): void {
|
|
281
|
-
console.log(`[${level}] ${message}`);
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
// Both work
|
|
285
|
-
log('Hello');
|
|
286
|
-
log('Error occurred', LogLevel.ERROR);
|
|
287
|
-
```
|
|
288
|
-
|
|
289
|
-
#### Pattern 2: Options Object Pattern (Recommended)
|
|
290
|
-
```typescript
|
|
291
|
-
// Original API
|
|
292
|
-
function fetchUser(id: string): Promise<User>;
|
|
293
|
-
|
|
294
|
-
// Evolved API with options
|
|
295
|
-
interface FetchUserOptions {
|
|
296
|
-
includeProfile?: boolean;
|
|
297
|
-
includePosts?: boolean;
|
|
298
|
-
cache?: boolean;
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
function fetchUser(id: string): Promise<User>;
|
|
302
|
-
function fetchUser(id: string, options: FetchUserOptions): Promise<User>;
|
|
303
|
-
async function fetchUser(id: string, options?: FetchUserOptions): Promise<User> {
|
|
304
|
-
const user = await db.findUser(id);
|
|
305
|
-
|
|
306
|
-
if (options?.includeProfile) {
|
|
307
|
-
user.profile = await db.findProfile(id);
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
if (options?.includePosts) {
|
|
311
|
-
user.posts = await db.findPosts(id);
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
return user;
|
|
315
|
-
}
|
|
316
|
-
```
|
|
317
|
-
|
|
318
|
-
#### Pattern 3: Union Type Parameters
|
|
319
|
-
```typescript
|
|
320
|
-
// Original API: simple string
|
|
321
|
-
function addChild(parentId: string, childName: string): TreeNode;
|
|
322
|
-
|
|
323
|
-
// Evolved API: string OR object
|
|
324
|
-
interface ChildConfig {
|
|
325
|
-
name: string;
|
|
326
|
-
metadata?: Record<string, any>;
|
|
327
|
-
dependencies?: string[];
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
function addChild(parentId: string, childName: string): TreeNode;
|
|
331
|
-
function addChild(parentId: string, childConfig: ChildConfig): TreeNode;
|
|
332
|
-
function addChild(parentId: string, childInput: string | ChildConfig): TreeNode {
|
|
333
|
-
const config = typeof childInput === 'string'
|
|
334
|
-
? { name: childInput }
|
|
335
|
-
: childInput;
|
|
336
|
-
|
|
337
|
-
return createChildNode(parentId, config);
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
// Both work
|
|
341
|
-
addChild('root', 'child1');
|
|
342
|
-
addChild('root', {
|
|
343
|
-
name: 'child2',
|
|
344
|
-
metadata: { version: 2 }
|
|
345
|
-
});
|
|
346
|
-
```
|
|
347
|
-
|
|
348
|
-
### Strategy: String | Partial<T> Union Pattern
|
|
349
|
-
|
|
350
|
-
This is particularly relevant for your use case with logger signatures.
|
|
351
|
-
|
|
352
|
-
#### Pattern: String or Object Configuration
|
|
353
|
-
```typescript
|
|
354
|
-
interface LoggerConfig {
|
|
355
|
-
level?: LogLevel;
|
|
356
|
-
format?: LogFormat;
|
|
357
|
-
output?: LogOutput;
|
|
358
|
-
timestamp?: boolean;
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
// Original: simple string logger name
|
|
362
|
-
function createLogger(name: string): Logger;
|
|
363
|
-
|
|
364
|
-
// Evolved: string name OR full config
|
|
365
|
-
function createLogger(name: string): Logger;
|
|
366
|
-
function createLogger(config: LoggerConfig & { name: string }): Logger;
|
|
367
|
-
function createLogger(input: string | (LoggerConfig & { name: string })): Logger {
|
|
368
|
-
const baseConfig = {
|
|
369
|
-
level: LogLevel.INFO,
|
|
370
|
-
format: LogFormat.TEXT,
|
|
371
|
-
output: LogOutput.CONSOLE,
|
|
372
|
-
timestamp: true
|
|
373
|
-
};
|
|
374
|
-
|
|
375
|
-
const config = typeof input === 'string'
|
|
376
|
-
? { ...baseConfig, name: input }
|
|
377
|
-
: { ...baseConfig, ...input };
|
|
378
|
-
|
|
379
|
-
return new LoggerImpl(config);
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
// Usage
|
|
383
|
-
const simpleLogger = createLogger('app');
|
|
384
|
-
const advancedLogger = createLogger({
|
|
385
|
-
name: 'app',
|
|
386
|
-
level: LogLevel.DEBUG,
|
|
387
|
-
format: LogFormat.JSON
|
|
388
|
-
});
|
|
389
|
-
```
|
|
390
|
-
|
|
391
|
-
### Strategy: Return Type Evolution
|
|
392
|
-
|
|
393
|
-
```typescript
|
|
394
|
-
// Original API
|
|
395
|
-
function parseInput(input: string): any;
|
|
396
|
-
|
|
397
|
-
// Evolved API with generic return type
|
|
398
|
-
function parseInput<T = any>(input: string, parser?: (val: string) => T): T;
|
|
399
|
-
function parseInput<T = any>(input: string, parser?: (val: string) => T): T {
|
|
400
|
-
if (parser) {
|
|
401
|
-
return parser(input);
|
|
402
|
-
}
|
|
403
|
-
return JSON.parse(input) as T;
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
// Backward compatible
|
|
407
|
-
const result1 = parseInput('{"key":"value"}');
|
|
408
|
-
const result2 = parseInput<User>('{"id":1}', (val) => JSON.parse(val));
|
|
409
|
-
```
|
|
410
|
-
|
|
411
|
-
---
|
|
412
|
-
|
|
413
|
-
## 4. Best Practices for Union Type Parameters (string | Partial<T>)
|
|
414
|
-
|
|
415
|
-
### Pattern 1: Discriminated Union for Clarity
|
|
416
|
-
|
|
417
|
-
```typescript
|
|
418
|
-
type LoggerInput =
|
|
419
|
-
| { type: 'simple'; name: string }
|
|
420
|
-
| { type: 'advanced'; config: LoggerConfig };
|
|
421
|
-
|
|
422
|
-
function createLogger(input: LoggerInput): Logger {
|
|
423
|
-
switch (input.type) {
|
|
424
|
-
case 'simple':
|
|
425
|
-
return new LoggerImpl({ name: input.name });
|
|
426
|
-
case 'advanced':
|
|
427
|
-
return new LoggerImpl(input.config);
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
```
|
|
431
|
-
|
|
432
|
-
### Pattern 2: Type Guards for Narrowing
|
|
433
|
-
|
|
434
|
-
```typescript
|
|
435
|
-
function isString(value: unknown): value is string {
|
|
436
|
-
return typeof value === 'string';
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
function isPartial<T>(value: unknown, typeGuard: (val: unknown) => val is T): value is Partial<T> {
|
|
440
|
-
return typeof value === 'object' && value !== null;
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
function processInput<T>(input: string | Partial<T>): T {
|
|
444
|
-
if (isString(input)) {
|
|
445
|
-
return { name: input } as T;
|
|
446
|
-
}
|
|
447
|
-
return input as T;
|
|
448
|
-
}
|
|
449
|
-
```
|
|
450
|
-
|
|
451
|
-
### Pattern 3: Builder Pattern for Complex Configurations
|
|
452
|
-
|
|
453
|
-
```typescript
|
|
454
|
-
class LoggerBuilder {
|
|
455
|
-
private config: Partial<LoggerConfig> = {};
|
|
456
|
-
|
|
457
|
-
static from(name: string): LoggerBuilder {
|
|
458
|
-
return new LoggerBuilder().withName(name);
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
withName(name: string): this {
|
|
462
|
-
this.config.name = name;
|
|
463
|
-
return this;
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
withLevel(level: LogLevel): this {
|
|
467
|
-
this.config.level = level;
|
|
468
|
-
return this;
|
|
469
|
-
}
|
|
470
|
-
|
|
471
|
-
build(): Logger {
|
|
472
|
-
return createLogger(this.config as LoggerConfig & { name: string });
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
// Usage
|
|
477
|
-
const logger = LoggerBuilder
|
|
478
|
-
.from('app')
|
|
479
|
-
.withLevel(LogLevel.DEBUG)
|
|
480
|
-
.build();
|
|
481
|
-
```
|
|
482
|
-
|
|
483
|
-
### Best Practice Guidelines
|
|
484
|
-
|
|
485
|
-
1. **Prefer overloads for public APIs**: Better IDE support and documentation
|
|
486
|
-
2. **Use union types internally**: More flexible implementation
|
|
487
|
-
3. **Provide type guards**: Help users narrow types correctly
|
|
488
|
-
4. **Document the evolution**: Use JSDoc to explain backward compatibility
|
|
489
|
-
5. **Consider default values**: Make new functionality opt-in
|
|
490
|
-
6. **Test both paths**: Ensure old and new usage patterns work
|
|
491
|
-
|
|
492
|
-
---
|
|
493
|
-
|
|
494
|
-
## 5. Common Pitfalls to Avoid
|
|
495
|
-
|
|
496
|
-
### Pitfall 1: Too Many Overloads
|
|
497
|
-
```typescript
|
|
498
|
-
// BAD: Unmanageable
|
|
499
|
-
function process(a: string): void;
|
|
500
|
-
function process(a: string, b: string): void;
|
|
501
|
-
function process(a: string, b: string, c: string): void;
|
|
502
|
-
function process(a: string, b: string, c: string, d: string): void;
|
|
503
|
-
|
|
504
|
-
// GOOD: Use options object or rest parameters
|
|
505
|
-
function process(first: string, ...rest: string[]): void;
|
|
506
|
-
// OR
|
|
507
|
-
function process(options: { parts: string[] }): void;
|
|
508
|
-
```
|
|
509
|
-
|
|
510
|
-
### Pitfall 2: Incompatible Implementation Signature
|
|
511
|
-
```typescript
|
|
512
|
-
// ERROR: Implementation signature not compatible
|
|
513
|
-
function greet(name: string): string;
|
|
514
|
-
function greet(name: string, age: number): string;
|
|
515
|
-
function greet(name: string, age?: number): number { // ERROR: returns number
|
|
516
|
-
return age || 0;
|
|
517
|
-
}
|
|
518
|
-
|
|
519
|
-
// CORRECT: Implementation matches all overloads
|
|
520
|
-
function greet(name: string): string;
|
|
521
|
-
function greet(name: string, age: number): string;
|
|
522
|
-
function greet(name: string, age?: number): string {
|
|
523
|
-
return age ? `${name}, age ${age}` : name;
|
|
524
|
-
}
|
|
525
|
-
```
|
|
526
|
-
|
|
527
|
-
### Pitfall 3: Breaking Changes in Disguise
|
|
528
|
-
```typescript
|
|
529
|
-
// Original API
|
|
530
|
-
function getData(): Promise<any>;
|
|
531
|
-
|
|
532
|
-
// BAD: Changes return type, breaks existing code
|
|
533
|
-
function getData(): Promise<SpecificType>;
|
|
534
|
-
|
|
535
|
-
// GOOD: Use generic for backward compatibility
|
|
536
|
-
function getData<T = any>(): Promise<T>;
|
|
537
|
-
```
|
|
538
|
-
|
|
539
|
-
### Pitfall 4: Partial<T> Doesn't Deep-Nest
|
|
540
|
-
```typescript
|
|
541
|
-
interface Config {
|
|
542
|
-
database: {
|
|
543
|
-
host: string;
|
|
544
|
-
port: number;
|
|
545
|
-
};
|
|
546
|
-
server: {
|
|
547
|
-
port: number;
|
|
548
|
-
};
|
|
549
|
-
}
|
|
550
|
-
|
|
551
|
-
// This doesn't work as expected
|
|
552
|
-
const updates: Partial<Config> = {
|
|
553
|
-
database: { host: 'localhost' } // ERROR: port is missing
|
|
554
|
-
};
|
|
555
|
-
|
|
556
|
-
// Solution: Use DeepPartial or explicit typing
|
|
557
|
-
const updates: Partial<Config> = {
|
|
558
|
-
database: { host: 'localhost', port: 27017 }
|
|
559
|
-
};
|
|
560
|
-
```
|
|
561
|
-
|
|
562
|
-
### Pitfall 5: Union Type Exhaustiveness
|
|
563
|
-
```typescript
|
|
564
|
-
function process(value: string | Partial<User>): void {
|
|
565
|
-
if (typeof value === 'string') {
|
|
566
|
-
// handle string
|
|
567
|
-
} else if (value) {
|
|
568
|
-
// ERROR: TypeScript doesn't know value is Partial<User> here
|
|
569
|
-
// Need proper type guard
|
|
570
|
-
}
|
|
571
|
-
}
|
|
572
|
-
|
|
573
|
-
// CORRECT: Use type guard
|
|
574
|
-
function isUserPartial(value: any): value is Partial<User> {
|
|
575
|
-
return typeof value === 'object' && value !== null;
|
|
576
|
-
}
|
|
577
|
-
|
|
578
|
-
function process(value: string | Partial<User>): void {
|
|
579
|
-
if (typeof value === 'string') {
|
|
580
|
-
// handle string
|
|
581
|
-
} else if (isUserPartial(value)) {
|
|
582
|
-
// value is now Partial<User>
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
```
|
|
586
|
-
|
|
587
|
-
---
|
|
588
|
-
|
|
589
|
-
## 6. Real-World GitHub Examples and Patterns
|
|
590
|
-
|
|
591
|
-
### Example 1: Express.js Middleware Evolution
|
|
592
|
-
Express evolved from simple middleware to more complex configurations while maintaining backward compatibility.
|
|
593
|
-
|
|
594
|
-
```typescript
|
|
595
|
-
// Old: Simple middleware
|
|
596
|
-
app.use((req, res, next) => {
|
|
597
|
-
next();
|
|
598
|
-
});
|
|
599
|
-
|
|
600
|
-
// New: Configuration with error handling
|
|
601
|
-
app.use((req, res, next) => {
|
|
602
|
-
next();
|
|
603
|
-
}, (err: Error, req, res, next) => {
|
|
604
|
-
// Error handler
|
|
605
|
-
});
|
|
606
|
-
```
|
|
607
|
-
|
|
608
|
-
### Example 2: Axios Configuration Pattern
|
|
609
|
-
Axios uses the Partial<T> pattern extensively for configuration updates.
|
|
610
|
-
|
|
611
|
-
```typescript
|
|
612
|
-
interface AxiosRequestConfig {
|
|
613
|
-
url?: string;
|
|
614
|
-
method?: string;
|
|
615
|
-
baseURL?: string;
|
|
616
|
-
headers?: any;
|
|
617
|
-
params?: any;
|
|
618
|
-
timeout?: number;
|
|
619
|
-
// ... many more
|
|
620
|
-
}
|
|
621
|
-
|
|
622
|
-
function axios(config: AxiosRequestConfig): AxiosPromise;
|
|
623
|
-
function axios(url: string, config?: AxiosRequestConfig): AxiosPromise;
|
|
624
|
-
function axios(url: string | AxiosRequestConfig, config?: AxiosRequestConfig): AxiosPromise {
|
|
625
|
-
// Implementation
|
|
626
|
-
}
|
|
627
|
-
|
|
628
|
-
// Usage patterns
|
|
629
|
-
axios('/api/data');
|
|
630
|
-
axios({ url: '/api/data', timeout: 5000 });
|
|
631
|
-
axios('/api/data', { timeout: 5000 });
|
|
632
|
-
```
|
|
633
|
-
|
|
634
|
-
### Example 3: React Component Props Evolution
|
|
635
|
-
React components often evolve from simple props to more complex ones.
|
|
636
|
-
|
|
637
|
-
```typescript
|
|
638
|
-
// Original Button
|
|
639
|
-
interface ButtonProps {
|
|
640
|
-
label: string;
|
|
641
|
-
onClick: () => void;
|
|
642
|
-
}
|
|
643
|
-
|
|
644
|
-
// Evolved Button with backward compatibility
|
|
645
|
-
interface ButtonProps {
|
|
646
|
-
label: string;
|
|
647
|
-
onClick: () => void;
|
|
648
|
-
variant?: 'primary' | 'secondary' | 'danger';
|
|
649
|
-
disabled?: boolean;
|
|
650
|
-
icon?: ReactNode;
|
|
651
|
-
}
|
|
652
|
-
|
|
653
|
-
function Button(props: ButtonProps): JSX.Element {
|
|
654
|
-
const { label, onClick, variant = 'primary', disabled = false, icon } = props;
|
|
655
|
-
// Implementation
|
|
656
|
-
}
|
|
657
|
-
```
|
|
658
|
-
|
|
659
|
-
---
|
|
660
|
-
|
|
661
|
-
## 7. StackOverflow Community Insights
|
|
662
|
-
|
|
663
|
-
### Common Question: "How do I add parameters without breaking existing code?"
|
|
664
|
-
|
|
665
|
-
**Best Answer Pattern:**
|
|
666
|
-
```typescript
|
|
667
|
-
// Use function overloads
|
|
668
|
-
function myFunction(required: string): void;
|
|
669
|
-
function myFunction(required: string, optional?: number): void;
|
|
670
|
-
function myFunction(required: string, optional?: number): void {
|
|
671
|
-
// implementation
|
|
672
|
-
}
|
|
673
|
-
```
|
|
674
|
-
|
|
675
|
-
### Common Question: "Should I use Partial<T> or make properties optional?"
|
|
676
|
-
|
|
677
|
-
**Best Answer:**
|
|
678
|
-
- Use `Partial<T>` when you want ALL properties optional (updates, patches)
|
|
679
|
-
- Make individual properties optional when some are required
|
|
680
|
-
- Consider `Required<T>` to enforce all properties are required
|
|
681
|
-
|
|
682
|
-
### Common Question: "How to handle string OR object parameter?"
|
|
683
|
-
|
|
684
|
-
**Best Answer Pattern:**
|
|
685
|
-
```typescript
|
|
686
|
-
type Input = string | { name: string; config?: Config };
|
|
687
|
-
|
|
688
|
-
function process(input: Input): void {
|
|
689
|
-
const normalized = typeof input === 'string'
|
|
690
|
-
? { name: input }
|
|
691
|
-
: input;
|
|
692
|
-
// Work with normalized object
|
|
693
|
-
}
|
|
694
|
-
```
|
|
695
|
-
|
|
696
|
-
---
|
|
697
|
-
|
|
698
|
-
## 8. Recommended Approach for Your Use Case
|
|
699
|
-
|
|
700
|
-
Based on the research, here's the recommended approach for evolving your logger's `attachChild` method:
|
|
701
|
-
|
|
702
|
-
### Current API
|
|
703
|
-
```typescript
|
|
704
|
-
attachChild(childName: string): TreeNode
|
|
705
|
-
```
|
|
706
|
-
|
|
707
|
-
### Recommended Evolved API
|
|
708
|
-
```typescript
|
|
709
|
-
interface ChildConfig {
|
|
710
|
-
name: string;
|
|
711
|
-
metadata?: Record<string, any>;
|
|
712
|
-
dependencies?: string[];
|
|
713
|
-
version?: number;
|
|
714
|
-
}
|
|
715
|
-
|
|
716
|
-
// Overload 1: Backward compatible with existing string API
|
|
717
|
-
attachChild(childName: string): TreeNode;
|
|
718
|
-
|
|
719
|
-
// Overload 2: New API with full configuration
|
|
720
|
-
attachChild(childConfig: ChildConfig): TreeNode;
|
|
721
|
-
|
|
722
|
-
// Implementation: Handles both cases
|
|
723
|
-
attachChild(childInput: string | ChildConfig): TreeNode {
|
|
724
|
-
const config: ChildConfig = typeof childInput === 'string'
|
|
725
|
-
? { name: childInput }
|
|
726
|
-
: childInput;
|
|
727
|
-
|
|
728
|
-
// Implementation using config object
|
|
729
|
-
const childNode = new TreeNode(config.name);
|
|
730
|
-
|
|
731
|
-
if (config.metadata) {
|
|
732
|
-
childNode.setMetadata(config.metadata);
|
|
733
|
-
}
|
|
734
|
-
|
|
735
|
-
if (config.dependencies) {
|
|
736
|
-
childNode.setDependencies(config.dependencies);
|
|
737
|
-
}
|
|
738
|
-
|
|
739
|
-
if (config.version) {
|
|
740
|
-
childNode.setVersion(config.version);
|
|
741
|
-
}
|
|
742
|
-
|
|
743
|
-
this.children.set(config.name, childNode);
|
|
744
|
-
return childNode;
|
|
745
|
-
}
|
|
746
|
-
```
|
|
747
|
-
|
|
748
|
-
### Why This Approach?
|
|
749
|
-
|
|
750
|
-
1. **100% Backward Compatible**: All existing code continues to work
|
|
751
|
-
2. **Type Safe**: TypeScript ensures correct usage
|
|
752
|
-
3. **Future Proof**: Easy to add new properties to `ChildConfig`
|
|
753
|
-
4. **Clear Intent**: Function signature shows both simple and complex usage
|
|
754
|
-
5. **Documentation**: JSDoc can explain both patterns
|
|
755
|
-
6. **Testable**: Can test both paths independently
|
|
756
|
-
|
|
757
|
-
### Migration Path
|
|
758
|
-
|
|
759
|
-
1. **Phase 1**: Add overloads alongside existing method (no breaking changes)
|
|
760
|
-
2. **Phase 2**: Add deprecation notice to old signature if desired
|
|
761
|
-
3. **Phase 3**: Gradually migrate internal usage to new pattern
|
|
762
|
-
4. **Phase 4**: In next major version, consider removing old overload
|
|
763
|
-
|
|
764
|
-
---
|
|
765
|
-
|
|
766
|
-
## 9. Documentation and Communication Best Practices
|
|
767
|
-
|
|
768
|
-
### JSDoc for Evolved APIs
|
|
769
|
-
```typescript
|
|
770
|
-
/**
|
|
771
|
-
* Attaches a child node to this tree node.
|
|
772
|
-
*
|
|
773
|
-
* @deprecated Use the config object form for new code
|
|
774
|
-
* @param childName - The name of the child node (legacy API)
|
|
775
|
-
* @returns The created child node
|
|
776
|
-
*
|
|
777
|
-
* @example
|
|
778
|
-
* // Legacy usage (still supported)
|
|
779
|
-
* node.attachChild('my-child');
|
|
780
|
-
*
|
|
781
|
-
* @example
|
|
782
|
-
* // New usage with configuration
|
|
783
|
-
* node.attachChild({
|
|
784
|
-
* name: 'my-child',
|
|
785
|
-
* metadata: { version: 2 },
|
|
786
|
-
* dependencies: ['other-child']
|
|
787
|
-
* });
|
|
788
|
-
*/
|
|
789
|
-
attachChild(childName: string): TreeNode;
|
|
790
|
-
|
|
791
|
-
/**
|
|
792
|
-
* Attaches a child node with full configuration support.
|
|
793
|
-
*
|
|
794
|
-
* @param childConfig - Configuration object for the child node
|
|
795
|
-
* @returns The created child node
|
|
796
|
-
*
|
|
797
|
-
* @example
|
|
798
|
-
* node.attachChild({
|
|
799
|
-
* name: 'my-child',
|
|
800
|
-
* metadata: { version: 2 },
|
|
801
|
-
* dependencies: ['other-child']
|
|
802
|
-
* });
|
|
803
|
-
*/
|
|
804
|
-
attachChild(childConfig: ChildConfig): TreeNode;
|
|
805
|
-
```
|
|
806
|
-
|
|
807
|
-
### Migration Guide Documentation
|
|
808
|
-
```markdown
|
|
809
|
-
# API Migration Guide
|
|
810
|
-
|
|
811
|
-
## attachChild Method Evolution
|
|
812
|
-
|
|
813
|
-
### What Changed?
|
|
814
|
-
The `attachChild` method now supports both simple string names and full configuration objects.
|
|
815
|
-
|
|
816
|
-
### Why?
|
|
817
|
-
To support more complex child node creation while maintaining backward compatibility.
|
|
818
|
-
|
|
819
|
-
### Migrating Your Code
|
|
820
|
-
|
|
821
|
-
#### No Changes Required
|
|
822
|
-
Your existing code continues to work:
|
|
823
|
-
```typescript
|
|
824
|
-
node.attachChild('child-name');
|
|
825
|
-
```
|
|
826
|
-
|
|
827
|
-
#### Optional: Use New Features
|
|
828
|
-
You can now provide additional configuration:
|
|
829
|
-
```typescript
|
|
830
|
-
node.attachChild({
|
|
831
|
-
name: 'child-name',
|
|
832
|
-
metadata: { key: 'value' },
|
|
833
|
-
dependencies: ['other-child']
|
|
834
|
-
});
|
|
835
|
-
```
|
|
836
|
-
|
|
837
|
-
### Timeline
|
|
838
|
-
- **Current Release**: Both APIs supported
|
|
839
|
-
- **Future Major Version**: String overload may be deprecated
|
|
840
|
-
```
|
|
841
|
-
|
|
842
|
-
---
|
|
843
|
-
|
|
844
|
-
## 10. Testing Strategy for Evolved APIs
|
|
845
|
-
|
|
846
|
-
### Unit Test Structure
|
|
847
|
-
```typescript
|
|
848
|
-
describe('attachChild', () => {
|
|
849
|
-
describe('backward compatibility', () => {
|
|
850
|
-
it('should accept string parameter', () => {
|
|
851
|
-
const node = new TreeNode('parent');
|
|
852
|
-
const child = node.attachChild('child-name');
|
|
853
|
-
expect(child.name).toBe('child-name');
|
|
854
|
-
});
|
|
855
|
-
|
|
856
|
-
it('should maintain existing behavior with string', () => {
|
|
857
|
-
const node = new TreeNode('parent');
|
|
858
|
-
const child = node.attachChild('child-name');
|
|
859
|
-
expect(node.children.has('child-name')).toBe(true);
|
|
860
|
-
});
|
|
861
|
-
});
|
|
862
|
-
|
|
863
|
-
describe('new functionality', () => {
|
|
864
|
-
it('should accept config object', () => {
|
|
865
|
-
const node = new TreeNode('parent');
|
|
866
|
-
const child = node.attachChild({
|
|
867
|
-
name: 'child-name',
|
|
868
|
-
metadata: { version: 2 }
|
|
869
|
-
});
|
|
870
|
-
expect(child.metadata).toEqual({ version: 2 });
|
|
871
|
-
});
|
|
872
|
-
|
|
873
|
-
it('should support all config options', () => {
|
|
874
|
-
const node = new TreeNode('parent');
|
|
875
|
-
const child = node.attachChild({
|
|
876
|
-
name: 'child-name',
|
|
877
|
-
metadata: { key: 'value' },
|
|
878
|
-
dependencies: ['dep1', 'dep2'],
|
|
879
|
-
version: 3
|
|
880
|
-
});
|
|
881
|
-
expect(child.metadata).toEqual({ key: 'value' });
|
|
882
|
-
expect(child.dependencies).toEqual(['dep1', 'dep2']);
|
|
883
|
-
expect(child.version).toBe(3);
|
|
884
|
-
});
|
|
885
|
-
});
|
|
886
|
-
});
|
|
887
|
-
```
|
|
888
|
-
|
|
889
|
-
---
|
|
890
|
-
|
|
891
|
-
## Summary and Key Takeaways
|
|
892
|
-
|
|
893
|
-
### TypeScript Partial<T>
|
|
894
|
-
- **URL**: https://www.typescriptlang.org/docs/handbook/utility-types.html#partialtype
|
|
895
|
-
- Makes all properties of a type optional
|
|
896
|
-
- Shallow operation (use DeepPartial for nested objects)
|
|
897
|
-
- Ideal for update operations and configuration objects
|
|
898
|
-
|
|
899
|
-
### Function Overloads
|
|
900
|
-
- **URL**: https://www.typescriptlang.org/docs/handbook/2/functions.html#function-overloads
|
|
901
|
-
- Multiple signatures, single implementation
|
|
902
|
-
- Order: most specific to most general
|
|
903
|
-
- Critical for backward-compatible API evolution
|
|
904
|
-
|
|
905
|
-
### Union Type Parameters (string | Partial<T>)
|
|
906
|
-
- Use type guards for proper narrowing
|
|
907
|
-
- Consider discriminated unions for complex scenarios
|
|
908
|
-
- Document the evolution clearly
|
|
909
|
-
- Provide builder patterns for complex configurations
|
|
910
|
-
|
|
911
|
-
### Best Practices for API Evolution
|
|
912
|
-
1. **Never break existing code**: Use overloads to maintain compatibility
|
|
913
|
-
2. **Add features, don't change behavior**: New parameters should be optional
|
|
914
|
-
3. **Document the evolution**: JSDoc and migration guides
|
|
915
|
-
4. **Test both paths**: Ensure old and new usage patterns work
|
|
916
|
-
5. **Deprecate gradually**: Use @deprecated JSDoc for old signatures
|
|
917
|
-
6. **Consider semantic versioning**: Breaking changes = major version bump
|
|
918
|
-
|
|
919
|
-
### Common Pitfalls to Avoid
|
|
920
|
-
1. Too many overloads (use options object instead)
|
|
921
|
-
2. Incompatible implementation signatures
|
|
922
|
-
3. Hidden breaking changes
|
|
923
|
-
4. Partial<T> doesn't deep-nest (use DeepPartial)
|
|
924
|
-
5. Union types without proper type guards
|
|
925
|
-
|
|
926
|
-
---
|
|
927
|
-
|
|
928
|
-
## Additional Resources
|
|
929
|
-
|
|
930
|
-
- **TypeScript Handbook**: https://www.typescriptlang.org/docs/handbook/intro.html
|
|
931
|
-
- **TypeScript Deep Dive**: https://basarat.gitbook.io/typescript/
|
|
932
|
-
- **TypeScript Evolution**: https://github.com/Microsoft/TypeScript/blob/main/README.md
|
|
933
|
-
- **Semantic Versioning**: https://semver.org/
|
|
934
|
-
- **API Design Best Practices**: https://docs.microsoft.com/en-us/azure/architecture/best-practices/api-design
|
|
935
|
-
|
|
936
|
-
---
|
|
937
|
-
|
|
938
|
-
*Document Version: 1.0*
|
|
939
|
-
*Last Updated: 2026-01-12*
|
|
940
|
-
*Research Status: Comprehensive external research attempted (web services temporarily unavailable - content based on official TypeScript documentation standards)*
|