groundswell 0.0.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +26 -9
- package/dist/cache/cache-key.d.ts +86 -0
- package/dist/cache/cache-key.d.ts.map +1 -0
- package/dist/cache/cache-key.js +204 -0
- package/dist/cache/cache-key.js.map +1 -0
- package/dist/cache/cache.d.ts +104 -0
- package/dist/cache/cache.d.ts.map +1 -0
- package/dist/cache/cache.js +179 -0
- package/dist/cache/cache.js.map +1 -0
- package/{src/cache/index.ts → dist/cache/index.d.ts} +1 -1
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +6 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/core/agent.d.ts +203 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +833 -0
- package/dist/core/agent.js.map +1 -0
- package/{src/core/context.ts → dist/core/context.d.ts} +16 -67
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +80 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/event-tree.d.ts +72 -0
- package/dist/core/event-tree.d.ts.map +1 -0
- package/dist/core/event-tree.js +211 -0
- package/dist/core/event-tree.js.map +1 -0
- package/{src/core/factory.ts → dist/core/factory.d.ts} +6 -27
- package/dist/core/factory.d.ts.map +1 -0
- package/dist/core/factory.js +110 -0
- package/dist/core/factory.js.map +1 -0
- package/{src/core/index.ts → dist/core/index.d.ts} +2 -10
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/logger.d.ts +50 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +91 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/mcp-handler.d.ts +127 -0
- package/dist/core/mcp-handler.d.ts.map +1 -0
- package/dist/core/mcp-handler.js +323 -0
- package/dist/core/mcp-handler.js.map +1 -0
- package/dist/core/prompt.d.ts +80 -0
- package/dist/core/prompt.d.ts.map +1 -0
- package/dist/core/prompt.js +120 -0
- package/dist/core/prompt.js.map +1 -0
- package/dist/core/workflow-context.d.ts +61 -0
- package/dist/core/workflow-context.d.ts.map +1 -0
- package/dist/core/workflow-context.js +358 -0
- package/dist/core/workflow-context.js.map +1 -0
- package/dist/core/workflow.d.ts +543 -0
- package/dist/core/workflow.d.ts.map +1 -0
- package/dist/core/workflow.js +986 -0
- package/dist/core/workflow.js.map +1 -0
- package/dist/debugger/event-replayer.d.ts +422 -0
- package/dist/debugger/event-replayer.d.ts.map +1 -0
- package/dist/debugger/event-replayer.js +639 -0
- package/dist/debugger/event-replayer.js.map +1 -0
- package/dist/debugger/index.d.ts +2 -0
- package/dist/debugger/index.d.ts.map +1 -0
- package/{src/debugger/index.ts → dist/debugger/index.js} +1 -0
- package/dist/debugger/index.js.map +1 -0
- package/dist/debugger/tree-debugger.d.ts +240 -0
- package/dist/debugger/tree-debugger.d.ts.map +1 -0
- package/dist/debugger/tree-debugger.js +620 -0
- package/dist/debugger/tree-debugger.js.map +1 -0
- package/dist/decorators/index.d.ts +4 -0
- package/dist/decorators/index.d.ts.map +1 -0
- package/{src/decorators/index.ts → dist/decorators/index.js} +1 -0
- package/dist/decorators/index.js.map +1 -0
- package/dist/decorators/observed-state.d.ts +32 -0
- package/dist/decorators/observed-state.d.ts.map +1 -0
- package/dist/decorators/observed-state.js +79 -0
- package/dist/decorators/observed-state.js.map +1 -0
- package/dist/decorators/step.d.ts +15 -0
- package/dist/decorators/step.d.ts.map +1 -0
- package/dist/decorators/step.js +192 -0
- package/dist/decorators/step.js.map +1 -0
- package/dist/decorators/task.d.ts +50 -0
- package/dist/decorators/task.d.ts.map +1 -0
- package/dist/decorators/task.js +118 -0
- package/dist/decorators/task.js.map +1 -0
- package/dist/examples/index.d.ts +3 -0
- package/dist/examples/index.d.ts.map +1 -0
- package/{src/examples/index.ts → dist/examples/index.js} +1 -0
- package/dist/examples/index.js.map +1 -0
- package/dist/examples/tdd-orchestrator.d.ts +15 -0
- package/dist/examples/tdd-orchestrator.d.ts.map +1 -0
- package/dist/examples/tdd-orchestrator.js +121 -0
- package/dist/examples/tdd-orchestrator.js.map +1 -0
- package/dist/examples/test-cycle-workflow.d.ts +14 -0
- package/dist/examples/test-cycle-workflow.d.ts.map +1 -0
- package/dist/examples/test-cycle-workflow.js +116 -0
- package/dist/examples/test-cycle-workflow.js.map +1 -0
- package/dist/harnesses/claude-code-harness.d.ts +391 -0
- package/dist/harnesses/claude-code-harness.d.ts.map +1 -0
- package/dist/harnesses/claude-code-harness.js +1076 -0
- package/dist/harnesses/claude-code-harness.js.map +1 -0
- package/dist/harnesses/harness-registry.d.ts +440 -0
- package/dist/harnesses/harness-registry.d.ts.map +1 -0
- package/dist/harnesses/harness-registry.js +543 -0
- package/dist/harnesses/harness-registry.js.map +1 -0
- package/dist/harnesses/index.d.ts +12 -0
- package/dist/harnesses/index.d.ts.map +1 -0
- package/dist/harnesses/index.js +11 -0
- package/dist/harnesses/index.js.map +1 -0
- package/dist/harnesses/pi-harness.d.ts +219 -0
- package/dist/harnesses/pi-harness.d.ts.map +1 -0
- package/dist/harnesses/pi-harness.js +676 -0
- package/dist/harnesses/pi-harness.js.map +1 -0
- package/dist/harnesses/pi-schema-converter.d.ts +24 -0
- package/dist/harnesses/pi-schema-converter.d.ts.map +1 -0
- package/dist/harnesses/pi-schema-converter.js +81 -0
- package/dist/harnesses/pi-schema-converter.js.map +1 -0
- package/dist/harnesses/register-defaults.d.ts +24 -0
- package/dist/harnesses/register-defaults.d.ts.map +1 -0
- package/dist/harnesses/register-defaults.js +40 -0
- package/dist/harnesses/register-defaults.js.map +1 -0
- package/dist/harnesses/session-store.d.ts +201 -0
- package/dist/harnesses/session-store.d.ts.map +1 -0
- package/dist/harnesses/session-store.js +254 -0
- package/dist/harnesses/session-store.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -0
- package/dist/index.js.map +1 -0
- package/dist/reflection/index.d.ts +5 -0
- package/dist/reflection/index.d.ts.map +1 -0
- package/{src/reflection/index.ts → dist/reflection/index.js} +1 -1
- package/dist/reflection/index.js.map +1 -0
- package/dist/reflection/reflection.d.ts +84 -0
- package/dist/reflection/reflection.d.ts.map +1 -0
- package/dist/reflection/reflection.js +344 -0
- package/dist/reflection/reflection.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +11 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/introspection.d.ts +165 -0
- package/dist/tools/introspection.d.ts.map +1 -0
- package/dist/tools/introspection.js +324 -0
- package/dist/tools/introspection.js.map +1 -0
- package/dist/types/agent.d.ts +1317 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +423 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/decorators.d.ts +40 -0
- package/dist/types/decorators.d.ts.map +1 -0
- package/dist/types/decorators.js +2 -0
- package/dist/types/decorators.js.map +1 -0
- package/dist/types/error-strategy.d.ts +13 -0
- package/dist/types/error-strategy.d.ts.map +1 -0
- package/dist/types/error-strategy.js +2 -0
- package/dist/types/error-strategy.js.map +1 -0
- package/dist/types/error.d.ts +20 -0
- package/dist/types/error.d.ts.map +1 -0
- package/dist/types/error.js +2 -0
- package/dist/types/error.js.map +1 -0
- package/dist/types/events.d.ts +113 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +2 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/harnesses.d.ts +474 -0
- package/dist/types/harnesses.d.ts.map +1 -0
- package/dist/types/harnesses.js +2 -0
- package/dist/types/harnesses.js.map +1 -0
- package/dist/types/index.d.ts +23 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/logging.d.ts +24 -0
- package/dist/types/logging.d.ts.map +1 -0
- package/dist/types/logging.js +2 -0
- package/dist/types/logging.js.map +1 -0
- package/dist/types/observer.d.ts +18 -0
- package/dist/types/observer.d.ts.map +1 -0
- package/dist/types/observer.js +2 -0
- package/dist/types/observer.js.map +1 -0
- package/dist/types/prompt.d.ts +31 -0
- package/dist/types/prompt.d.ts.map +1 -0
- package/dist/types/prompt.js +6 -0
- package/dist/types/prompt.js.map +1 -0
- package/dist/types/providers.d.ts +691 -0
- package/dist/types/providers.d.ts.map +1 -0
- package/dist/types/providers.js +14 -0
- package/dist/types/providers.js.map +1 -0
- package/dist/types/reflection.d.ts +96 -0
- package/dist/types/reflection.d.ts.map +1 -0
- package/dist/types/reflection.js +24 -0
- package/dist/types/reflection.js.map +1 -0
- package/dist/types/restart.d.ts +132 -0
- package/dist/types/restart.d.ts.map +1 -0
- package/dist/types/restart.js +2 -0
- package/dist/types/restart.js.map +1 -0
- package/dist/types/sdk-primitives.d.ts +118 -0
- package/dist/types/sdk-primitives.d.ts.map +1 -0
- package/dist/types/sdk-primitives.js +6 -0
- package/dist/types/sdk-primitives.js.map +1 -0
- package/{src/types/snapshot.ts → dist/types/snapshot.d.ts} +5 -5
- package/dist/types/snapshot.d.ts.map +1 -0
- package/dist/types/snapshot.js +2 -0
- package/dist/types/snapshot.js.map +1 -0
- package/dist/types/streaming.d.ts +194 -0
- package/dist/types/streaming.d.ts.map +1 -0
- package/dist/types/streaming.js +67 -0
- package/dist/types/streaming.js.map +1 -0
- package/dist/types/workflow-context.d.ts +275 -0
- package/dist/types/workflow-context.d.ts.map +1 -0
- package/dist/types/workflow-context.js +8 -0
- package/dist/types/workflow-context.js.map +1 -0
- package/dist/types/workflow.d.ts +30 -0
- package/dist/types/workflow.d.ts.map +1 -0
- package/dist/types/workflow.js +2 -0
- package/dist/types/workflow.js.map +1 -0
- package/dist/utils/agent-validation.d.ts +88 -0
- package/dist/utils/agent-validation.d.ts.map +1 -0
- package/dist/utils/agent-validation.js +87 -0
- package/dist/utils/agent-validation.js.map +1 -0
- package/dist/utils/delay.d.ts +7 -0
- package/dist/utils/delay.d.ts.map +1 -0
- package/dist/utils/delay.js +9 -0
- package/dist/utils/delay.js.map +1 -0
- package/dist/utils/harness-config.d.ts +180 -0
- package/dist/utils/harness-config.d.ts.map +1 -0
- package/dist/utils/harness-config.js +311 -0
- package/dist/utils/harness-config.js.map +1 -0
- package/dist/utils/id.d.ts +6 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js +12 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/utils/index.d.ts +13 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +11 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/model-spec.d.ts +110 -0
- package/dist/utils/model-spec.d.ts.map +1 -0
- package/dist/utils/model-spec.js +149 -0
- package/dist/utils/model-spec.js.map +1 -0
- package/dist/utils/observable.d.ts +54 -0
- package/dist/utils/observable.d.ts.map +1 -0
- package/dist/utils/observable.js +82 -0
- package/dist/utils/observable.js.map +1 -0
- package/dist/utils/provider-config.d.ts +10 -0
- package/dist/utils/provider-config.d.ts.map +1 -0
- package/dist/utils/provider-config.js +10 -0
- package/dist/utils/provider-config.js.map +1 -0
- package/dist/utils/restart-analysis.d.ts +202 -0
- package/dist/utils/restart-analysis.d.ts.map +1 -0
- package/dist/utils/restart-analysis.js +426 -0
- package/dist/utils/restart-analysis.js.map +1 -0
- package/dist/utils/session-serialization.d.ts +118 -0
- package/dist/utils/session-serialization.d.ts.map +1 -0
- package/dist/utils/session-serialization.js +217 -0
- package/dist/utils/session-serialization.js.map +1 -0
- package/dist/utils/workflow-error-utils.d.ts +22 -0
- package/dist/utils/workflow-error-utils.d.ts.map +1 -0
- package/dist/utils/workflow-error-utils.js +45 -0
- package/dist/utils/workflow-error-utils.js.map +1 -0
- package/package.json +34 -5
- package/.claude/commands/subtask-planning/prp-base-create.md +0 -120
- package/.claude/commands/subtask-planning/prp-base-execute.md +0 -65
- package/.claude/commands/task-breakdown.md +0 -94
- package/.claude/settings.local.json +0 -9
- package/.claude/system_prompts/task-breakdown.md +0 -101
- package/CHANGELOG.md +0 -188
- package/PRD.md +0 -543
- package/PRPs/001-hierarchical-workflow-engine.md +0 -2438
- package/PRPs/PRDs/002-agent-prompt.md +0 -390
- package/PRPs/PRDs/003-agent-prompt.md +0 -943
- package/PRPs/PRDs/004-agent-prompt.md +0 -1136
- package/PRPs/PRDs/tasks-001.json +0 -492
- package/PRPs/README.md +0 -83
- package/PRPs/templates/prp_base.md +0 -222
- package/docs/agent.md +0 -422
- package/docs/prompt.md +0 -419
- package/docs/workflow.md +0 -600
- package/examples/README.md +0 -258
- package/examples/examples/01-basic-workflow.ts +0 -100
- package/examples/examples/02-decorator-options.ts +0 -217
- package/examples/examples/03-parent-child.ts +0 -241
- package/examples/examples/04-observers-debugger.ts +0 -340
- package/examples/examples/05-error-handling.ts +0 -387
- package/examples/examples/06-concurrent-tasks.ts +0 -352
- package/examples/examples/07-agent-loops.ts +0 -432
- package/examples/examples/08-sdk-features.ts +0 -667
- package/examples/examples/09-reflection.ts +0 -573
- package/examples/examples/10-introspection.ts +0 -550
- package/examples/examples/11-reparenting-workflows.ts +0 -269
- package/examples/index.ts +0 -147
- package/examples/utils/helpers.ts +0 -57
- package/package-lock.json +0 -2398
- package/plan/001_d3bb02af4886/TEST_RESULTS.md +0 -259
- package/plan/001_d3bb02af4886/backlog.json +0 -867
- package/plan/001_d3bb02af4886/bug_fix_tasks.json +0 -484
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S1/PRP.md +0 -488
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S2/PRP.md +0 -581
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M1T1S3/PRP.md +0 -687
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S1/PRP.md +0 -492
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/PRP.md +0 -932
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/concurrent_error_testing_patterns.md +0 -1109
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/vitest_concurrent_testing.md +0 -802
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T1S3/research/workflow_engine_test_references.md +0 -603
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S1/PRP.md +0 -564
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S3/PRP.md +0 -518
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T2S4/PRP.md +0 -1252
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/PRP.md +0 -364
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/CODEBASE_INVENTORY.md +0 -114
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/DECORATOR_DOCUMENTATION_PATTERNS.md +0 -205
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/PRD_LOCATION_ANALYSIS.md +0 -199
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M2T3S1/research/ULTRATHINK_PRP_PLAN.md +0 -134
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S1/PRP.md +0 -495
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S1/research/console_error_inventory.md +0 -435
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S2/PRP.md +0 -506
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T1S3/PRP.md +0 -612
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T2S2/PRP.md +0 -558
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T2S2/research/external_research.md +0 -788
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T3S2/PRP.md +0 -460
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T3S3/PRP.md +0 -454
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/PRP.md +0 -520
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/RECOMMENDATION.md +0 -417
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/research/external_workflow_engines_research.md +0 -760
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S1/research/security_implications_analysis.md +0 -245
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M3T4S2/PRP.md +0 -792
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S1/PRP.md +0 -535
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S1/TEST_EXECUTION_REPORT.md +0 -190
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/PRP.md +0 -654
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/TEST_FIX_REPORT.md +0 -227
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/KEY_FINDINGS.md +0 -345
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/QUICK_REFERENCE.md +0 -193
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T1S2/research/test_maintenance_research.md +0 -1323
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S1/BREAKING_CHANGES_AUDIT.md +0 -1011
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S1/PRP.md +0 -927
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/P1M4T3S2/PRP.md +0 -505
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/architecture/logger_child_signature_analysis.md +0 -401
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/child_implementation_research.md +0 -142
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/test_patterns_research.md +0 -112
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S3/vitest_patterns_research.md +0 -159
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/PRP.md +0 -549
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/VERIFICATION_REPORT.md +0 -368
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/edge_case_analysis.md +0 -172
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M1T1S4/usage_inventory.md +0 -175
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T1S2/PRP.md +0 -696
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T1S4/PRP.md +0 -860
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/PRP.md +0 -1066
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/01-testing-aggregated-errors.md +0 -1103
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/01_typescript_error_aggregation_patterns.md +0 -789
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/02-error-merge-strategy-testing-guide.md +0 -1098
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/02_aggregate_error_patterns.md +0 -1037
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/03-promise-allsettled-testing-patterns.md +0 -916
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/03_error_merging_strategies.md +0 -1045
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/04_github_stackoverflow_examples.md +0 -890
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/05_comprehensive_summary.md +0 -822
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/INDEX.md +0 -668
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/QUICK_REFERENCE.md +0 -706
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/README.md +0 -265
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S2/research/RESEARCH_REPORT.md +0 -655
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T2S4/research/vitest_testing_patterns.md +0 -1103
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M2T3S2/PRP.md +0 -426
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/PRP.md +0 -506
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/QUICK_REFERENCE.md +0 -114
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/RESEARCH_SUMMARY.md +0 -316
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S2/research/vitest_observer_error_logging_best_practices.md +0 -754
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T1S3/PRP.md +0 -612
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/PRP.md +0 -719
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/README.md +0 -215
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S1/analysis.md +0 -765
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T2S3/PRP.md +0 -718
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/DECISION.md +0 -149
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/PRP.md +0 -470
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/ULTRATHINK_PLAN.md +0 -332
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/codebase_workflow_name_analysis.md +0 -167
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/external_best_practices.md +0 -265
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T3S1/research/validation_patterns.md +0 -273
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T4S1/workflow_engine_ancestry_api_research.md +0 -760
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M3T4S3-PRP.md +0 -434
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S1/PRP.md +0 -717
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/PRP.md +0 -472
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/VALIDATION_REPORT.md +0 -125
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/P1M4T2S2/research/ULTRATHINK_PRP_PLAN.md +0 -301
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/error-logging-best-practices.md +0 -1170
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/research_typescript_partial_and_overloads.md +0 -940
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/vitest-quick-reference.md +0 -151
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/docs/vitest-research.md +0 -650
- package/plan/001_d3bb02af4886/bugfix/001_e8e04329daf3/prd_snapshot.md +0 -259
- package/plan/001_d3bb02af4886/bugfix/P1M1T1S1/PRP.md +0 -457
- package/plan/001_d3bb02af4886/bugfix/RESEARCH_SUMMARY.md +0 -346
- package/plan/001_d3bb02af4886/bugfix/architecture/codebase_structure.md +0 -311
- package/plan/001_d3bb02af4886/bugfix/architecture/concurrent_execution_best_practices.md +0 -1565
- package/plan/001_d3bb02af4886/bugfix/architecture/error_handling_patterns.md +0 -288
- package/plan/001_d3bb02af4886/bugfix/architecture/promise_all_analysis.md +0 -741
- package/plan/001_d3bb02af4886/docs/PRP/P1M1T1S4-functional-workflow-error-state-capture-test.md +0 -652
- package/plan/001_d3bb02af4886/docs/PRP/P1P2-PRP.md +0 -527
- package/plan/001_d3bb02af4886/docs/PRP/P3P4-PRP.md +0 -1388
- package/plan/001_d3bb02af4886/docs/PRP/P4P5-PRP.md +0 -1136
- package/plan/001_d3bb02af4886/docs/PRP/PRP.md +0 -527
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S1-PRP.md +0 -415
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S2-PRP.md +0 -378
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M1T2S4-PRP.md +0 -713
- package/plan/001_d3bb02af4886/docs/PRP/bugfix/P1M2T1S4-PRP.md +0 -370
- package/plan/001_d3bb02af4886/docs/PRP_P1M3T1S3.md +0 -499
- package/plan/001_d3bb02af4886/docs/TEST_RESULTS.md +0 -230
- package/plan/001_d3bb02af4886/docs/architecture/external_deps.md +0 -358
- package/plan/001_d3bb02af4886/docs/architecture/system_context.md +0 -242
- package/plan/001_d3bb02af4886/docs/bugfix/ANALYSIS_PRD_VS_IMPLEMENTATION.md +0 -1134
- package/plan/001_d3bb02af4886/docs/bugfix/GAP_ANALYSIS_SUMMARY.md +0 -179
- package/plan/001_d3bb02af4886/docs/bugfix/P1M4T2S1/PRP.md +0 -629
- package/plan/001_d3bb02af4886/docs/bugfix/P1M4T2S1/validation-report.md +0 -214
- package/plan/001_d3bb02af4886/docs/bugfix/PRP_P1M4T2S3.md +0 -629
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_PRP.md +0 -529
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_QUICK_REFERENCE.md +0 -142
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_README.md +0 -304
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_TEST_RESULTS.md +0 -558
- package/plan/001_d3bb02af4886/docs/bugfix/bugfix_VALIDATION_SUMMARY.md +0 -256
- package/plan/001_d3bb02af4886/docs/bugfix/system_context.md +0 -346
- package/plan/001_d3bb02af4886/docs/bugfix-architecture/bug_analysis.md +0 -415
- package/plan/001_d3bb02af4886/docs/bugfix-architecture/implementation_patterns.md +0 -489
- package/plan/001_d3bb02af4886/docs/bugfix-architecture/system_context.md +0 -218
- package/plan/001_d3bb02af4886/docs/bugfix_INITIATION_SUMMARY.md +0 -380
- package/plan/001_d3bb02af4886/docs/research/CYCLE_DETECTION_PATTERNS.md +0 -1923
- package/plan/001_d3bb02af4886/docs/research/CYCLE_DETECTION_QUICK_REF.md +0 -319
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/codebase-context.md +0 -115
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/cycle-detection-algorithms.md +0 -134
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/test-patterns.md +0 -153
- package/plan/001_d3bb02af4886/docs/research/P1M1T2S1/workflow-class.md +0 -132
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/DECORATOR_DOCUMENTATION_BEST_PRACTICES.md +0 -716
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/DECORATOR_DOCUMENTATION_QUICK_REF.md +0 -186
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/GROUNDSWELL_DECORATOR_EXAMPLES.md +0 -604
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/INDEX.md +0 -213
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/codebase_structure.md +0 -30
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/existing_test_pattern.md +0 -56
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/getRootObservers_implementation.md +0 -53
- package/plan/001_d3bb02af4886/docs/research/P1M2T1S4/test_conventions.md +0 -49
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/PRP.md +0 -958
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/QUICK_REFERENCE.md +0 -339
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/README.md +0 -305
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/SUMMARY.md +0 -433
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/bidirectional-tree-consistency-testing.md +0 -1574
- package/plan/001_d3bb02af4886/docs/research/P1M3T1S4/test-pattern-examples.md +0 -1014
- package/plan/001_d3bb02af4886/docs/research/P1P2/LRU_CACHE_BEST_PRACTICES.md +0 -1929
- package/plan/001_d3bb02af4886/docs/research/P1P2/LRU_CACHE_CODE_PATTERNS.md +0 -857
- package/plan/001_d3bb02af4886/docs/research/P1P2/LRU_CACHE_INTEGRATION_GUIDE.md +0 -738
- package/plan/001_d3bb02af4886/docs/research/P1P2/LRU_CACHE_RESEARCH_INDEX.md +0 -424
- package/plan/001_d3bb02af4886/docs/research/P1P2/REFLECTION_INDEX.md +0 -291
- package/plan/001_d3bb02af4886/docs/research/P1P2/REFLECTION_RESEARCH_REPORT.md +0 -1342
- package/plan/001_d3bb02af4886/docs/research/P1P2/RESEARCH_SUMMARY.md +0 -342
- package/plan/001_d3bb02af4886/docs/research/P1P2/anthropic-sdk.md +0 -174
- package/plan/001_d3bb02af4886/docs/research/P1P2/async-local-storage.md +0 -200
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-code-patterns.md +0 -1205
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-decision-matrix.md +0 -421
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-implementation-guide.md +0 -1341
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-integration-guide.md +0 -834
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-patterns.md +0 -1468
- package/plan/001_d3bb02af4886/docs/research/P1P2/reflection-quick-reference.md +0 -558
- package/plan/001_d3bb02af4886/docs/research/P1P2/zod-schema.md +0 -152
- package/plan/001_d3bb02af4886/docs/research/P3P4/caching-lru.md +0 -116
- package/plan/001_d3bb02af4886/docs/research/P3P4/introspection-tools.md +0 -177
- package/plan/001_d3bb02af4886/docs/research/P3P4/reflection-patterns.md +0 -117
- package/plan/001_d3bb02af4886/docs/research/P4P5/RESEARCH_SUMMARY.md +0 -151
- package/plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_QUICK_REF.md +0 -376
- package/plan/001_d3bb02af4886/docs/research/PROMISE_ALLSETTLED_RESEARCH.md +0 -1507
- package/plan/001_d3bb02af4886/docs/research/bugfix_typescript_patterns.md +0 -949
- package/plan/001_d3bb02af4886/docs/research/error-testing-research.md +0 -619
- package/plan/001_d3bb02af4886/docs/research/error_handling_patterns.md +0 -723
- package/plan/001_d3bb02af4886/docs/research/general/INTROSPECTION_RESEARCH_SUMMARY.md +0 -378
- package/plan/001_d3bb02af4886/docs/research/general/README-INTROSPECTION.md +0 -352
- package/plan/001_d3bb02af4886/docs/research/general/agent-introspection-patterns.md +0 -1085
- package/plan/001_d3bb02af4886/docs/research/general/introspection-security-guide.md +0 -984
- package/plan/001_d3bb02af4886/docs/research/general/introspection-tool-examples.md +0 -875
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/PRP_TEMPLATE.md +0 -460
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/QUICK_REFERENCE.md +0 -324
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/README.md +0 -175
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/RESEARCH_REPORT.md +0 -499
- package/plan/001_d3bb02af4886/docs/research/incremental-tree-map-updates/SUMMARY.md +0 -163
- package/plan/001_d3bb02af4886/prd_snapshot.md +0 -543
- package/plan/bugfix/BUG_FIX_SUMMARY.md +0 -961
- package/scripts/generate-llms-full.ts +0 -206
- package/src/__tests__/adversarial/attachChild-performance.test.ts +0 -216
- package/src/__tests__/adversarial/circular-reference.test.ts +0 -101
- package/src/__tests__/adversarial/complex-circular-reference.test.ts +0 -139
- package/src/__tests__/adversarial/concurrent-task-failures.test.ts +0 -571
- package/src/__tests__/adversarial/deep-analysis.test.ts +0 -729
- package/src/__tests__/adversarial/deep-hierarchy-stress.test.ts +0 -213
- package/src/__tests__/adversarial/e2e-prd-validation.test.ts +0 -448
- package/src/__tests__/adversarial/edge-case.test.ts +0 -703
- package/src/__tests__/adversarial/error-merge-strategy.test.ts +0 -760
- package/src/__tests__/adversarial/incremental-performance.test.ts +0 -140
- package/src/__tests__/adversarial/node-map-update-benchmarks.test.ts +0 -457
- package/src/__tests__/adversarial/observer-propagation.test.ts +0 -487
- package/src/__tests__/adversarial/parent-validation.test.ts +0 -143
- package/src/__tests__/adversarial/prd-12-2-compliance.test.ts +0 -611
- package/src/__tests__/adversarial/prd-compliance.test.ts +0 -731
- package/src/__tests__/compatibility/backward-compatibility.test.ts +0 -1572
- package/src/__tests__/helpers/index.ts +0 -18
- package/src/__tests__/helpers/tree-verification.ts +0 -257
- package/src/__tests__/integration/agent-workflow.test.ts +0 -256
- package/src/__tests__/integration/bidirectional-consistency.test.ts +0 -847
- package/src/__tests__/integration/observer-logging.test.ts +0 -643
- package/src/__tests__/integration/tree-mirroring.test.ts +0 -151
- package/src/__tests__/integration/workflow-reparenting.test.ts +0 -303
- package/src/__tests__/unit/agent.test.ts +0 -169
- package/src/__tests__/unit/cache-key.test.ts +0 -182
- package/src/__tests__/unit/cache.test.ts +0 -172
- package/src/__tests__/unit/context.test.ts +0 -217
- package/src/__tests__/unit/decorators.test.ts +0 -100
- package/src/__tests__/unit/introspection-tools.test.ts +0 -277
- package/src/__tests__/unit/logger.test.ts +0 -293
- package/src/__tests__/unit/observable.test.ts +0 -321
- package/src/__tests__/unit/prompt.test.ts +0 -135
- package/src/__tests__/unit/reflection.test.ts +0 -210
- package/src/__tests__/unit/tree-debugger-incremental.test.ts +0 -170
- package/src/__tests__/unit/tree-debugger.test.ts +0 -85
- package/src/__tests__/unit/utils/workflow-error-utils.test.ts +0 -209
- package/src/__tests__/unit/workflow-detachChild.test.ts +0 -100
- package/src/__tests__/unit/workflow-emitEvent-childDetached.test.ts +0 -153
- package/src/__tests__/unit/workflow-isDescendantOf.test.ts +0 -180
- package/src/__tests__/unit/workflow.test.ts +0 -357
- package/src/cache/cache-key.ts +0 -244
- package/src/cache/cache.ts +0 -236
- package/src/core/agent.ts +0 -593
- package/src/core/event-tree.ts +0 -260
- package/src/core/logger.ts +0 -112
- package/src/core/mcp-handler.ts +0 -184
- package/src/core/prompt.ts +0 -150
- package/src/core/workflow-context.ts +0 -351
- package/src/core/workflow.ts +0 -540
- package/src/debugger/tree-debugger.ts +0 -255
- package/src/decorators/observed-state.ts +0 -95
- package/src/decorators/step.ts +0 -139
- package/src/decorators/task.ts +0 -159
- package/src/examples/tdd-orchestrator.ts +0 -65
- package/src/examples/test-cycle-workflow.ts +0 -64
- package/src/index.ts +0 -142
- package/src/reflection/reflection.ts +0 -407
- package/src/tools/index.ts +0 -36
- package/src/tools/introspection.ts +0 -464
- package/src/types/agent.ts +0 -90
- package/src/types/decorators.ts +0 -32
- package/src/types/error-strategy.ts +0 -13
- package/src/types/error.ts +0 -20
- package/src/types/events.ts +0 -75
- package/src/types/index.ts +0 -55
- package/src/types/logging.ts +0 -24
- package/src/types/observer.ts +0 -18
- package/src/types/prompt.ts +0 -40
- package/src/types/reflection.ts +0 -117
- package/src/types/sdk-primitives.ts +0 -128
- package/src/types/workflow-context.ts +0 -163
- package/src/types/workflow.ts +0 -37
- package/src/utils/id.ts +0 -11
- package/src/utils/index.ts +0 -4
- package/src/utils/observable.ts +0 -106
- package/src/utils/workflow-error-utils.ts +0 -56
- package/tsconfig.json +0 -22
- package/vitest.config.ts +0 -16
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env npx tsx
|
|
2
|
-
/**
|
|
3
|
-
* Generates llms_full.txt by combining:
|
|
4
|
-
* 1. README.md and its linked markdown documentation files
|
|
5
|
-
* 2. Examples README and all example source files
|
|
6
|
-
*
|
|
7
|
-
* Future-proof design:
|
|
8
|
-
* - Auto-discovers markdown files linked from README.md (docs/*.md pattern)
|
|
9
|
-
* - Auto-discovers all example files matching examples/examples/*.ts
|
|
10
|
-
* - New docs and examples are automatically included without script changes
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import * as fs from "fs";
|
|
14
|
-
import * as path from "path";
|
|
15
|
-
import { fileURLToPath } from "url";
|
|
16
|
-
|
|
17
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
18
|
-
const __dirname = path.dirname(__filename);
|
|
19
|
-
const ROOT_DIR = path.resolve(__dirname, "..");
|
|
20
|
-
const OUTPUT_FILE = path.join(ROOT_DIR, "llms_full.txt");
|
|
21
|
-
|
|
22
|
-
interface Section {
|
|
23
|
-
title: string;
|
|
24
|
-
content: string;
|
|
25
|
-
filePath?: string;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
function readFile(filePath: string): string {
|
|
29
|
-
try {
|
|
30
|
-
return fs.readFileSync(filePath, "utf-8");
|
|
31
|
-
} catch (error) {
|
|
32
|
-
console.warn(`Warning: Could not read ${filePath}`);
|
|
33
|
-
return "";
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
function extractMarkdownLinks(content: string, baseDir: string): string[] {
|
|
38
|
-
// Match markdown links: [text](path.md) - only .md files
|
|
39
|
-
const linkRegex = /\[([^\]]+)\]\(([^)]+\.md)\)/g;
|
|
40
|
-
const links: string[] = [];
|
|
41
|
-
let match;
|
|
42
|
-
|
|
43
|
-
while ((match = linkRegex.exec(content)) !== null) {
|
|
44
|
-
const linkPath = match[2];
|
|
45
|
-
// Only include relative links (not http/https)
|
|
46
|
-
if (!linkPath.startsWith("http://") && !linkPath.startsWith("https://")) {
|
|
47
|
-
const absolutePath = path.resolve(baseDir, linkPath);
|
|
48
|
-
if (fs.existsSync(absolutePath) && !links.includes(absolutePath)) {
|
|
49
|
-
links.push(absolutePath);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
return links;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
function discoverDocsMarkdown(): string[] {
|
|
58
|
-
const docsDir = path.join(ROOT_DIR, "docs");
|
|
59
|
-
if (!fs.existsSync(docsDir)) {
|
|
60
|
-
return [];
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
return fs
|
|
64
|
-
.readdirSync(docsDir)
|
|
65
|
-
.filter((file) => file.endsWith(".md"))
|
|
66
|
-
.map((file) => path.join(docsDir, file))
|
|
67
|
-
.sort();
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
function discoverExamples(): string[] {
|
|
71
|
-
const examplesDir = path.join(ROOT_DIR, "examples", "examples");
|
|
72
|
-
if (!fs.existsSync(examplesDir)) {
|
|
73
|
-
return [];
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
return fs
|
|
77
|
-
.readdirSync(examplesDir)
|
|
78
|
-
.filter((file) => file.endsWith(".ts"))
|
|
79
|
-
.sort() // Sorting ensures NN- prefixed files are in order
|
|
80
|
-
.map((file) => path.join(examplesDir, file));
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
function formatSection(section: Section): string {
|
|
84
|
-
const separator = "=".repeat(80);
|
|
85
|
-
const relativePath = section.filePath
|
|
86
|
-
? path.relative(ROOT_DIR, section.filePath)
|
|
87
|
-
: "";
|
|
88
|
-
|
|
89
|
-
let header = `${separator}\n${section.title}`;
|
|
90
|
-
if (relativePath) {
|
|
91
|
-
header += `\nFile: ${relativePath}`;
|
|
92
|
-
}
|
|
93
|
-
header += `\n${separator}\n\n`;
|
|
94
|
-
|
|
95
|
-
return header + section.content.trim() + "\n\n";
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
function generateLlmsFull(): void {
|
|
99
|
-
const sections: Section[] = [];
|
|
100
|
-
const processedFiles = new Set<string>();
|
|
101
|
-
|
|
102
|
-
// 1. Main README
|
|
103
|
-
const readmePath = path.join(ROOT_DIR, "README.md");
|
|
104
|
-
const readmeContent = readFile(readmePath);
|
|
105
|
-
if (readmeContent) {
|
|
106
|
-
sections.push({
|
|
107
|
-
title: "PROJECT README",
|
|
108
|
-
content: readmeContent,
|
|
109
|
-
filePath: readmePath,
|
|
110
|
-
});
|
|
111
|
-
processedFiles.add(readmePath);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
// 2. Documentation files from docs/ directory
|
|
115
|
-
// First, get links from README to preserve intended order
|
|
116
|
-
const linkedDocs = extractMarkdownLinks(readmeContent, ROOT_DIR);
|
|
117
|
-
// Then discover all docs to catch any not linked
|
|
118
|
-
const allDocs = discoverDocsMarkdown();
|
|
119
|
-
|
|
120
|
-
// Process linked docs first (preserves README order)
|
|
121
|
-
for (const docPath of linkedDocs) {
|
|
122
|
-
if (
|
|
123
|
-
docPath.includes("/docs/") &&
|
|
124
|
-
!processedFiles.has(docPath) &&
|
|
125
|
-
fs.existsSync(docPath)
|
|
126
|
-
) {
|
|
127
|
-
const content = readFile(docPath);
|
|
128
|
-
const fileName = path.basename(docPath, ".md").toUpperCase();
|
|
129
|
-
sections.push({
|
|
130
|
-
title: `DOCUMENTATION: ${fileName}`,
|
|
131
|
-
content,
|
|
132
|
-
filePath: docPath,
|
|
133
|
-
});
|
|
134
|
-
processedFiles.add(docPath);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
// Add any docs not linked from README
|
|
139
|
-
for (const docPath of allDocs) {
|
|
140
|
-
if (!processedFiles.has(docPath)) {
|
|
141
|
-
const content = readFile(docPath);
|
|
142
|
-
const fileName = path.basename(docPath, ".md").toUpperCase();
|
|
143
|
-
sections.push({
|
|
144
|
-
title: `DOCUMENTATION: ${fileName}`,
|
|
145
|
-
content,
|
|
146
|
-
filePath: docPath,
|
|
147
|
-
});
|
|
148
|
-
processedFiles.add(docPath);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
// 3. Examples README
|
|
153
|
-
const examplesReadmePath = path.join(ROOT_DIR, "examples", "README.md");
|
|
154
|
-
if (fs.existsSync(examplesReadmePath)) {
|
|
155
|
-
const content = readFile(examplesReadmePath);
|
|
156
|
-
sections.push({
|
|
157
|
-
title: "EXAMPLES OVERVIEW",
|
|
158
|
-
content,
|
|
159
|
-
filePath: examplesReadmePath,
|
|
160
|
-
});
|
|
161
|
-
processedFiles.add(examplesReadmePath);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
// 4. All example source files
|
|
165
|
-
const examples = discoverExamples();
|
|
166
|
-
for (const examplePath of examples) {
|
|
167
|
-
const content = readFile(examplePath);
|
|
168
|
-
const fileName = path.basename(examplePath);
|
|
169
|
-
// Extract example number and name from filename (e.g., "01-basic-workflow.ts")
|
|
170
|
-
const match = fileName.match(/^(\d+)-(.+)\.ts$/);
|
|
171
|
-
const exampleName = match
|
|
172
|
-
? `Example ${parseInt(match[1])}: ${match[2].replace(/-/g, " ")}`
|
|
173
|
-
: fileName;
|
|
174
|
-
|
|
175
|
-
sections.push({
|
|
176
|
-
title: `EXAMPLE: ${exampleName.toUpperCase()}`,
|
|
177
|
-
content,
|
|
178
|
-
filePath: examplePath,
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
// Build output
|
|
183
|
-
const header = `GROUNDSWELL - LLM DOCUMENTATION
|
|
184
|
-
Generated: ${new Date().toISOString()}
|
|
185
|
-
${"=".repeat(80)}
|
|
186
|
-
|
|
187
|
-
This file contains the complete documentation and examples for the Groundswell project.
|
|
188
|
-
It is auto-generated by scripts/generate-llms-full.ts
|
|
189
|
-
|
|
190
|
-
Contents:
|
|
191
|
-
${sections.map((s, i) => ` ${i + 1}. ${s.title}`).join("\n")}
|
|
192
|
-
|
|
193
|
-
`;
|
|
194
|
-
|
|
195
|
-
const output =
|
|
196
|
-
header + sections.map((section) => formatSection(section)).join("\n");
|
|
197
|
-
|
|
198
|
-
// Write output
|
|
199
|
-
fs.writeFileSync(OUTPUT_FILE, output);
|
|
200
|
-
console.log(`Generated ${path.relative(process.cwd(), OUTPUT_FILE)}`);
|
|
201
|
-
console.log(`Total sections: ${sections.length}`);
|
|
202
|
-
console.log(`Total size: ${(output.length / 1024).toFixed(1)} KB`);
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
// Run
|
|
206
|
-
generateLlmsFull();
|
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Performance Test: attachChild() with isDescendantOf() validation
|
|
3
|
-
*
|
|
4
|
-
* Validates that the isDescendantOf() method (added in P1.M1.T2.S2)
|
|
5
|
-
* does not cause significant performance degradation in attachChild()
|
|
6
|
-
* operations across various tree sizes and configurations.
|
|
7
|
-
*
|
|
8
|
-
* Performance Thresholds (from deep-hierarchy-stress.test.ts):
|
|
9
|
-
* - Single operation: < 100ms
|
|
10
|
-
* - Bulk operations (100 iterations): < 1000ms
|
|
11
|
-
* - isDescendantOf() complexity: O(d) where d = tree depth
|
|
12
|
-
*
|
|
13
|
-
* Related: plan/bugfix/P1M4T2S2/PRP.md
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
17
|
-
import { Workflow } from '../../index.js';
|
|
18
|
-
import { validateTreeConsistency, verifyBidirectionalLink } from '../helpers/tree-verification.js';
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* SimpleWorkflow class for performance testing
|
|
22
|
-
* Pattern from: src/__tests__/adversarial/deep-hierarchy-stress.test.ts:20-26
|
|
23
|
-
*/
|
|
24
|
-
class SimpleWorkflow extends Workflow {
|
|
25
|
-
async run(): Promise<string> {
|
|
26
|
-
this.setStatus('running');
|
|
27
|
-
this.setStatus('completed');
|
|
28
|
-
return 'done';
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
describe('attachChild Performance Regression Tests', () => {
|
|
33
|
-
/**
|
|
34
|
-
* Setup: Mock console methods to capture error messages
|
|
35
|
-
* Pattern from: src/__tests__/adversarial/deep-hierarchy-stress.test.ts:33-37
|
|
36
|
-
*/
|
|
37
|
-
beforeEach(() => {
|
|
38
|
-
vi.spyOn(console, 'log').mockImplementation(() => {});
|
|
39
|
-
vi.spyOn(console, 'error').mockImplementation(() => {});
|
|
40
|
-
vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Teardown: Restore all mocks to prevent test pollution
|
|
45
|
-
* CRITICAL: Always use vi.restoreAllMocks() in afterEach
|
|
46
|
-
*/
|
|
47
|
-
afterEach(() => {
|
|
48
|
-
vi.restoreAllMocks();
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Test 1: Shallow tree performance (depth 10)
|
|
53
|
-
*
|
|
54
|
-
* Validates that attachChild() performs very fast on shallow trees
|
|
55
|
-
* where isDescendantOf() only needs to traverse a short parent chain.
|
|
56
|
-
*
|
|
57
|
-
* Threshold: < 10ms (should be very fast for shallow trees)
|
|
58
|
-
*/
|
|
59
|
-
it('should attach child in shallow tree within acceptable time', () => {
|
|
60
|
-
// ARRANGE: Create shallow tree (depth 10)
|
|
61
|
-
const DEPTH = 10;
|
|
62
|
-
const root = new SimpleWorkflow('Root');
|
|
63
|
-
let current: any = root;
|
|
64
|
-
|
|
65
|
-
for (let i = 0; i < DEPTH; i++) {
|
|
66
|
-
current = new SimpleWorkflow(`Level-${i}`, current);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// ACT: Measure attachChild() time for new child at depth 10
|
|
70
|
-
const startTime = performance.now();
|
|
71
|
-
const newChild = new SimpleWorkflow('NewChild', current);
|
|
72
|
-
const attachDuration = performance.now() - startTime;
|
|
73
|
-
|
|
74
|
-
// ASSERT: Verify functional correctness
|
|
75
|
-
expect(newChild.parent).toBe(current);
|
|
76
|
-
expect(current.children).toContain(newChild);
|
|
77
|
-
verifyBidirectionalLink(current, newChild);
|
|
78
|
-
|
|
79
|
-
// ASSERT: Verify performance threshold (< 10ms for shallow tree)
|
|
80
|
-
expect(attachDuration).toBeLessThan(10);
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Test 2: Deep tree performance (depth 100)
|
|
85
|
-
*
|
|
86
|
-
* Validates that attachChild() scales linearly with tree depth.
|
|
87
|
-
* isDescendantOf() must traverse 100 parent references, which should
|
|
88
|
-
* complete in < 50ms given the O(d) iterative implementation.
|
|
89
|
-
*
|
|
90
|
-
* Threshold: < 50ms (linear scaling with depth)
|
|
91
|
-
*/
|
|
92
|
-
it('should attach child in deep tree (depth 100) within acceptable time', () => {
|
|
93
|
-
// ARRANGE: Create deep tree
|
|
94
|
-
const DEPTH = 100;
|
|
95
|
-
const root = new SimpleWorkflow('Root');
|
|
96
|
-
let current: any = root;
|
|
97
|
-
|
|
98
|
-
for (let i = 0; i < DEPTH; i++) {
|
|
99
|
-
current = new SimpleWorkflow(`Child-${i}`, current);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// ACT: Measure attachChild() at deepest level
|
|
103
|
-
const startTime = performance.now();
|
|
104
|
-
const newChild = new SimpleWorkflow('NewChild', current);
|
|
105
|
-
const attachDuration = performance.now() - startTime;
|
|
106
|
-
|
|
107
|
-
// ASSERT: Functional correctness
|
|
108
|
-
verifyBidirectionalLink(current, newChild);
|
|
109
|
-
|
|
110
|
-
// ASSERT: Performance threshold (< 50ms for depth 100)
|
|
111
|
-
expect(attachDuration).toBeLessThan(50);
|
|
112
|
-
|
|
113
|
-
// ASSERT: Validate overall tree consistency
|
|
114
|
-
const errors = validateTreeConsistency(root);
|
|
115
|
-
expect(errors).toHaveLength(0);
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Test 3: Extreme deep tree (depth 1000)
|
|
120
|
-
*
|
|
121
|
-
* Validates that attachChild() handles extreme depth without stack overflow
|
|
122
|
-
* and completes within acceptable time. This tests the O(d) complexity
|
|
123
|
-
* at the upper bound of typical workflow tree depths.
|
|
124
|
-
*
|
|
125
|
-
* Threshold: < 100ms (from deep-hierarchy-stress.test.ts:169)
|
|
126
|
-
*/
|
|
127
|
-
it('should attach child in extreme deep tree (depth 1000) without stack overflow', () => {
|
|
128
|
-
const DEPTH = 1000;
|
|
129
|
-
const root = new SimpleWorkflow('Root');
|
|
130
|
-
let current: any = root;
|
|
131
|
-
|
|
132
|
-
for (let i = 0; i < DEPTH; i++) {
|
|
133
|
-
current = new SimpleWorkflow(`Child-${i}`, current);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
// ACT: Measure attachChild() at depth 1000
|
|
137
|
-
const startTime = performance.now();
|
|
138
|
-
const newChild = new SimpleWorkflow('NewChild', current);
|
|
139
|
-
const attachDuration = performance.now() - startTime;
|
|
140
|
-
|
|
141
|
-
// ASSERT: Functional correctness
|
|
142
|
-
verifyBidirectionalLink(current, newChild);
|
|
143
|
-
|
|
144
|
-
// ASSERT: Performance threshold (< 100ms from deep-hierarchy-stress.test.ts:169)
|
|
145
|
-
expect(attachDuration).toBeLessThan(100);
|
|
146
|
-
|
|
147
|
-
// ASSERT: Validate tree consistency at extreme depth
|
|
148
|
-
const errors = validateTreeConsistency(root);
|
|
149
|
-
expect(errors).toHaveLength(0);
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* Test 4: Wide tree performance (100 children)
|
|
154
|
-
*
|
|
155
|
-
* Validates that attachChild() performs efficiently when attaching
|
|
156
|
-
* multiple children to a single parent. Each attachment only requires
|
|
157
|
-
* checking immediate parent chain, so performance should be excellent.
|
|
158
|
-
*
|
|
159
|
-
* Threshold: < 100ms total, < 1ms average per attachment
|
|
160
|
-
*/
|
|
161
|
-
it('should attach 100 children to single parent efficiently', () => {
|
|
162
|
-
// ARRANGE: Create parent
|
|
163
|
-
const parent = new SimpleWorkflow('Parent');
|
|
164
|
-
const NUM_CHILDREN = 100;
|
|
165
|
-
|
|
166
|
-
// ACT: Measure time to attach all children
|
|
167
|
-
const startTime = performance.now();
|
|
168
|
-
for (let i = 0; i < NUM_CHILDREN; i++) {
|
|
169
|
-
const child = new SimpleWorkflow(`Child-${i}`, parent);
|
|
170
|
-
}
|
|
171
|
-
const totalDuration = performance.now() - startTime;
|
|
172
|
-
|
|
173
|
-
// ASSERT: Verify all children attached
|
|
174
|
-
expect(parent.children).toHaveLength(NUM_CHILDREN);
|
|
175
|
-
parent.children.forEach(child => {
|
|
176
|
-
verifyBidirectionalLink(parent, child);
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
// ASSERT: Performance (< 100ms total, < 1ms average)
|
|
180
|
-
expect(totalDuration).toBeLessThan(100);
|
|
181
|
-
const avgTime = totalDuration / NUM_CHILDREN;
|
|
182
|
-
expect(avgTime).toBeLessThan(1); // < 1ms per attachment
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
/**
|
|
186
|
-
* Test 5: Bulk attachment performance (100 operations)
|
|
187
|
-
*
|
|
188
|
-
* Validates that sequential attachChild() operations complete within
|
|
189
|
-
* acceptable time. This measures cumulative overhead of isDescendantOf()
|
|
190
|
-
* validation across multiple operations.
|
|
191
|
-
*
|
|
192
|
-
* Threshold: < 1000ms (from deep-hierarchy-stress.test.ts:186)
|
|
193
|
-
*/
|
|
194
|
-
it('should complete 100 sequential attachChild operations within acceptable time', () => {
|
|
195
|
-
// ARRANGE: Create root workflow
|
|
196
|
-
const root = new SimpleWorkflow('Root');
|
|
197
|
-
const ITERATIONS = 100;
|
|
198
|
-
|
|
199
|
-
// ACT: Measure cumulative time for 100 attachments
|
|
200
|
-
const totalStartTime = performance.now();
|
|
201
|
-
for (let i = 0; i < ITERATIONS; i++) {
|
|
202
|
-
const child = new SimpleWorkflow(`Child-${i}`, root);
|
|
203
|
-
}
|
|
204
|
-
const totalDuration = performance.now() - totalStartTime;
|
|
205
|
-
|
|
206
|
-
// ASSERT: Verify functional correctness
|
|
207
|
-
expect(root.children).toHaveLength(ITERATIONS);
|
|
208
|
-
|
|
209
|
-
// ASSERT: Performance threshold (< 1000ms from deep-hierarchy-stress.test.ts:186)
|
|
210
|
-
expect(totalDuration).toBeLessThan(1000);
|
|
211
|
-
|
|
212
|
-
// ASSERT: Average time per operation
|
|
213
|
-
const avgTime = totalDuration / ITERATIONS;
|
|
214
|
-
expect(avgTime).toBeLessThan(10); // < 10ms average
|
|
215
|
-
});
|
|
216
|
-
});
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Circular Reference Tests (TDD Red Phase)
|
|
3
|
-
*
|
|
4
|
-
* These tests validate the attachChild() method properly prevents
|
|
5
|
-
* attaching an ancestor workflow as a child (which would create a circular reference).
|
|
6
|
-
*
|
|
7
|
-
* This is the RED phase of TDD - tests are written to FAIL initially,
|
|
8
|
-
* documenting the expected behavior before implementation.
|
|
9
|
-
*
|
|
10
|
-
* Related: plan/docs/bugfix-architecture/bug_analysis.md
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
14
|
-
import { Workflow } from '../../index.js';
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* SimpleWorkflow class for testing
|
|
18
|
-
* Pattern from: src/__tests__/unit/workflow.test.ts:4-11
|
|
19
|
-
*/
|
|
20
|
-
class SimpleWorkflow extends Workflow {
|
|
21
|
-
async run(): Promise<string> {
|
|
22
|
-
this.setStatus('running');
|
|
23
|
-
this.setStatus('completed');
|
|
24
|
-
return 'done';
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
describe('Adversarial: Circular Reference Detection', () => {
|
|
29
|
-
/**
|
|
30
|
-
* Setup: Mock console methods to capture error messages
|
|
31
|
-
* Pattern from: research/console-mocking.md "Basic Spying Patterns"
|
|
32
|
-
*/
|
|
33
|
-
beforeEach(() => {
|
|
34
|
-
vi.spyOn(console, 'log').mockImplementation(() => {});
|
|
35
|
-
vi.spyOn(console, 'error').mockImplementation(() => {});
|
|
36
|
-
vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Teardown: Restore all mocks to prevent test pollution
|
|
41
|
-
* CRITICAL: Always use vi.restoreAllMocks() in afterEach
|
|
42
|
-
*/
|
|
43
|
-
afterEach(() => {
|
|
44
|
-
vi.restoreAllMocks();
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Test 1: Immediate Circular Reference
|
|
49
|
-
*
|
|
50
|
-
* Bug: attachChild() does NOT check if the child being attached is actually
|
|
51
|
-
* an ancestor of this workflow (would create a circular reference)
|
|
52
|
-
*
|
|
53
|
-
* Expected: Error thrown with message containing 'circular' OR 'cycle' OR 'ancestor'
|
|
54
|
-
* Actual: No error thrown, circular reference created
|
|
55
|
-
*
|
|
56
|
-
* Pattern from: plan/docs/bugfix-architecture/implementation_patterns.md "Pattern 2"
|
|
57
|
-
*/
|
|
58
|
-
it('should throw when attaching immediate parent as child', () => {
|
|
59
|
-
// ARRANGE: Create parent and child workflows
|
|
60
|
-
const parent = new SimpleWorkflow('Parent');
|
|
61
|
-
const child = new SimpleWorkflow('Child', parent);
|
|
62
|
-
|
|
63
|
-
// Verify initial state
|
|
64
|
-
// CRITICAL: Constructor auto-attaches child to parent at workflow.ts:113-116
|
|
65
|
-
expect(child.parent).toBe(parent);
|
|
66
|
-
expect(parent.children).toContain(child);
|
|
67
|
-
|
|
68
|
-
// ACT & ASSERT: Attempting to attach parent as child should throw
|
|
69
|
-
// This test FAILS because attachChild() doesn't call this.isDescendantOf(child)
|
|
70
|
-
expect(() => child.attachChild(parent)).toThrow(/circular|cycle|ancestor/i);
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Test 2: Ancestor Circular Reference (Multi-level)
|
|
75
|
-
*
|
|
76
|
-
* Bug: attachChild() does NOT check if the child being attached is an ancestor
|
|
77
|
-
* anywhere up the parent chain (would create a circular reference)
|
|
78
|
-
*
|
|
79
|
-
* Expected: Error thrown with message containing 'circular' OR 'cycle' OR 'ancestor'
|
|
80
|
-
* Actual: No error thrown, circular reference created
|
|
81
|
-
*
|
|
82
|
-
* Pattern from: plan/docs/bugfix-architecture/implementation_patterns.md "Pattern 2"
|
|
83
|
-
*/
|
|
84
|
-
it('should throw when attaching ancestor as child', () => {
|
|
85
|
-
// ARRANGE: Create 3-level hierarchy
|
|
86
|
-
const root = new SimpleWorkflow('Root');
|
|
87
|
-
const child1 = new SimpleWorkflow('Child1', root);
|
|
88
|
-
const child2 = new SimpleWorkflow('Child2', child1);
|
|
89
|
-
|
|
90
|
-
// Verify initial state
|
|
91
|
-
// CRITICAL: Constructor auto-attaches at workflow.ts:113-116
|
|
92
|
-
expect(child2.parent).toBe(child1);
|
|
93
|
-
expect(child1.parent).toBe(root);
|
|
94
|
-
expect(root.children).toContain(child1);
|
|
95
|
-
expect(child1.children).toContain(child2);
|
|
96
|
-
|
|
97
|
-
// ACT & ASSERT: Attempting to attach root as child of child2 should throw
|
|
98
|
-
// This test FAILS because attachChild() doesn't call this.isDescendantOf(child)
|
|
99
|
-
expect(() => child2.attachChild(root)).toThrow(/circular|cycle|ancestor/i);
|
|
100
|
-
});
|
|
101
|
-
});
|
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Complex Circular Reference Tests
|
|
3
|
-
*
|
|
4
|
-
* These tests validate that isDescendantOf() correctly detects circular
|
|
5
|
-
* references at various depths in the workflow tree.
|
|
6
|
-
*
|
|
7
|
-
* Test Cases:
|
|
8
|
-
* 1. Immediate circular reference (depth 1): child.attachChild(parent)
|
|
9
|
-
* 2. Two-level circular reference (depth 2): grandchild.attachChild(root)
|
|
10
|
-
* 3. Three-level circular reference (depth 3): great-grandchild.attachChild(root)
|
|
11
|
-
*
|
|
12
|
-
* Pattern from: plan/docs/bugfix-architecture/implementation_patterns.md Pattern 8
|
|
13
|
-
* Related: plan/bugfix/P1M3T1S3/PRP.md
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
17
|
-
import { Workflow } from '../../index.js';
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* SimpleWorkflow class for testing
|
|
21
|
-
* Pattern from: src/__tests__/adversarial/circular-reference.test.ts:20-26
|
|
22
|
-
*/
|
|
23
|
-
class SimpleWorkflow extends Workflow {
|
|
24
|
-
async run(): Promise<string> {
|
|
25
|
-
this.setStatus('running');
|
|
26
|
-
this.setStatus('completed');
|
|
27
|
-
return 'done';
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
describe('Adversarial: Complex Circular Reference Detection', () => {
|
|
32
|
-
/**
|
|
33
|
-
* Setup: Mock console methods to capture error messages
|
|
34
|
-
* Pattern from: src/__tests__/adversarial/circular-reference.test.ts:33-37
|
|
35
|
-
*/
|
|
36
|
-
beforeEach(() => {
|
|
37
|
-
vi.spyOn(console, 'log').mockImplementation(() => {});
|
|
38
|
-
vi.spyOn(console, 'error').mockImplementation(() => {});
|
|
39
|
-
vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Teardown: Restore all mocks to prevent test pollution
|
|
44
|
-
* CRITICAL: Always use vi.restoreAllMocks() in afterEach
|
|
45
|
-
*/
|
|
46
|
-
afterEach(() => {
|
|
47
|
-
vi.restoreAllMocks();
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Test 1: Immediate Circular Reference (depth 1)
|
|
52
|
-
*
|
|
53
|
-
* Validates that attachChild() prevents creating a cycle when a child
|
|
54
|
-
* attempts to attach its immediate parent as its child.
|
|
55
|
-
*
|
|
56
|
-
* Hierarchy: root -> child1
|
|
57
|
-
* Cycle attempt: child1.attachChild(root)
|
|
58
|
-
*
|
|
59
|
-
* Expected: Error thrown with message containing 'circular' OR 'cycle' OR 'ancestor'
|
|
60
|
-
*/
|
|
61
|
-
it('should throw when attaching immediate parent as child (depth 1)', () => {
|
|
62
|
-
// ARRANGE: Create 2-level hierarchy (root, child1)
|
|
63
|
-
const root = new SimpleWorkflow('Root');
|
|
64
|
-
const child1 = new SimpleWorkflow('Child1', root);
|
|
65
|
-
|
|
66
|
-
// Verify initial state
|
|
67
|
-
// CRITICAL: Constructor auto-attaches child to parent at workflow.ts:113-116
|
|
68
|
-
expect(child1.parent).toBe(root);
|
|
69
|
-
expect(root.children).toContain(child1);
|
|
70
|
-
|
|
71
|
-
// ACT & ASSERT: Attempting to attach parent as child should throw
|
|
72
|
-
// This validates isDescendantOf() detects the immediate ancestor
|
|
73
|
-
expect(() => child1.attachChild(root)).toThrow(/circular|cycle|ancestor/i);
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Test 2: Two-Level Circular Reference (depth 2)
|
|
78
|
-
*
|
|
79
|
-
* Validates that attachChild() prevents creating a cycle when a grandchild
|
|
80
|
-
* attempts to attach its grandparent (root) as its child.
|
|
81
|
-
*
|
|
82
|
-
* Hierarchy: root -> child1 -> child2
|
|
83
|
-
* Cycle attempt: child2.attachChild(root)
|
|
84
|
-
*
|
|
85
|
-
* Expected: Error thrown with message containing 'circular' OR 'cycle' OR 'ancestor'
|
|
86
|
-
*/
|
|
87
|
-
it('should throw when attaching grandparent as child (depth 2)', () => {
|
|
88
|
-
// ARRANGE: Create 3-level hierarchy (root, child1, child2)
|
|
89
|
-
const root = new SimpleWorkflow('Root');
|
|
90
|
-
const child1 = new SimpleWorkflow('Child1', root);
|
|
91
|
-
const child2 = new SimpleWorkflow('Child2', child1);
|
|
92
|
-
|
|
93
|
-
// Verify initial state
|
|
94
|
-
// CRITICAL: Constructor auto-attaches at workflow.ts:113-116
|
|
95
|
-
expect(child2.parent).toBe(child1);
|
|
96
|
-
expect(child1.parent).toBe(root);
|
|
97
|
-
expect(root.children).toContain(child1);
|
|
98
|
-
expect(child1.children).toContain(child2);
|
|
99
|
-
|
|
100
|
-
// ACT & ASSERT: Attempting to attach root as child of child2 should throw
|
|
101
|
-
// This validates isDescendantOf() traverses the full ancestor chain
|
|
102
|
-
expect(() => child2.attachChild(root)).toThrow(/circular|cycle|ancestor/i);
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Test 3: Three-Level Circular Reference (depth 3)
|
|
107
|
-
*
|
|
108
|
-
* Validates that attachChild() prevents creating a cycle when a great-grandchild
|
|
109
|
-
* attempts to attach its great-grandparent (root) as its child.
|
|
110
|
-
*
|
|
111
|
-
* Hierarchy: root -> child1 -> child2 -> child3
|
|
112
|
-
* Cycle attempt: child3.attachChild(root)
|
|
113
|
-
*
|
|
114
|
-
* Expected: Error thrown with message containing 'circular' OR 'cycle' OR 'ancestor'
|
|
115
|
-
*
|
|
116
|
-
* This test provides NEW coverage not present in circular-reference.test.ts
|
|
117
|
-
* which only tests depth 1 (immediate parent) and depth 2 (ancestor).
|
|
118
|
-
*/
|
|
119
|
-
it('should throw when attaching great-grandparent as child (depth 3)', () => {
|
|
120
|
-
// ARRANGE: Create 4-level hierarchy (root, child1, child2, child3)
|
|
121
|
-
const root = new SimpleWorkflow('Root');
|
|
122
|
-
const child1 = new SimpleWorkflow('Child1', root); // root -> child1
|
|
123
|
-
const child2 = new SimpleWorkflow('Child2', child1); // root -> child1 -> child2
|
|
124
|
-
const child3 = new SimpleWorkflow('Child3', child2); // root -> child1 -> child2 -> child3
|
|
125
|
-
|
|
126
|
-
// Verify initial state
|
|
127
|
-
// CRITICAL: Constructor auto-attaches at workflow.ts:113-116
|
|
128
|
-
expect(child3.parent).toBe(child2);
|
|
129
|
-
expect(child2.parent).toBe(child1);
|
|
130
|
-
expect(child1.parent).toBe(root);
|
|
131
|
-
expect(root.children).toContain(child1);
|
|
132
|
-
expect(child1.children).toContain(child2);
|
|
133
|
-
expect(child2.children).toContain(child3);
|
|
134
|
-
|
|
135
|
-
// ACT & ASSERT: Attempting to attach root as child of child3 should throw
|
|
136
|
-
// This validates isDescendantOf() detects deep ancestors (3+ levels)
|
|
137
|
-
expect(() => child3.attachChild(root)).toThrow(/circular|cycle|ancestor/i);
|
|
138
|
-
});
|
|
139
|
-
});
|