claude_swarm 1.0.9 → 1.0.11

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.
Files changed (134) hide show
  1. checksums.yaml +4 -4
  2. data/{CHANGELOG.md → CHANGELOG.claude-swarm.md} +10 -0
  3. data/CLAUDE.md +346 -191
  4. data/decisions/2025-11-22-001-global-agent-registry.md +172 -0
  5. data/docs/v2/CHANGELOG.swarm_cli.md +20 -0
  6. data/docs/v2/CHANGELOG.swarm_memory.md +146 -1
  7. data/docs/v2/CHANGELOG.swarm_sdk.md +433 -10
  8. data/docs/v2/README.md +20 -5
  9. data/docs/v2/guides/complete-tutorial.md +95 -9
  10. data/docs/v2/guides/getting-started.md +10 -8
  11. data/docs/v2/guides/memory-adapters.md +41 -0
  12. data/docs/v2/guides/migrating-to-2.x.md +746 -0
  13. data/docs/v2/guides/plugins.md +52 -5
  14. data/docs/v2/guides/rails-integration.md +6 -0
  15. data/docs/v2/guides/snapshots.md +14 -14
  16. data/docs/v2/guides/swarm-memory.md +2 -13
  17. data/docs/v2/reference/architecture-flow.md +3 -3
  18. data/docs/v2/reference/cli.md +0 -1
  19. data/docs/v2/reference/configuration_reference.md +300 -0
  20. data/docs/v2/reference/event_payload_structures.md +27 -5
  21. data/docs/v2/reference/ruby-dsl.md +614 -18
  22. data/docs/v2/reference/swarm_memory_technical_details.md +7 -29
  23. data/docs/v2/reference/yaml.md +172 -54
  24. data/examples/snapshot_demo.rb +2 -2
  25. data/lib/claude_swarm/mcp_generator.rb +8 -21
  26. data/lib/claude_swarm/orchestrator.rb +8 -1
  27. data/lib/claude_swarm/version.rb +1 -1
  28. data/lib/swarm_cli/commands/run.rb +2 -2
  29. data/lib/swarm_cli/config_loader.rb +11 -11
  30. data/lib/swarm_cli/formatters/human_formatter.rb +0 -33
  31. data/lib/swarm_cli/interactive_repl.rb +2 -2
  32. data/lib/swarm_cli/ui/icons.rb +0 -23
  33. data/lib/swarm_cli/version.rb +1 -1
  34. data/lib/swarm_memory/adapters/filesystem_adapter.rb +11 -34
  35. data/lib/swarm_memory/core/semantic_index.rb +10 -2
  36. data/lib/swarm_memory/core/storage.rb +7 -2
  37. data/lib/swarm_memory/dsl/memory_config.rb +37 -0
  38. data/lib/swarm_memory/integration/sdk_plugin.rb +201 -28
  39. data/lib/swarm_memory/optimization/defragmenter.rb +1 -1
  40. data/lib/swarm_memory/prompts/memory_researcher.md.erb +0 -1
  41. data/lib/swarm_memory/tools/load_skill.rb +0 -1
  42. data/lib/swarm_memory/tools/memory_edit.rb +2 -1
  43. data/lib/swarm_memory/tools/memory_read.rb +1 -1
  44. data/lib/swarm_memory/version.rb +1 -1
  45. data/lib/swarm_memory.rb +8 -6
  46. data/lib/swarm_sdk/agent/builder.rb +58 -0
  47. data/lib/swarm_sdk/agent/chat.rb +527 -1061
  48. data/lib/swarm_sdk/agent/{chat → chat_helpers}/context_tracker.rb +13 -88
  49. data/lib/swarm_sdk/agent/chat_helpers/event_emitter.rb +204 -0
  50. data/lib/swarm_sdk/agent/{chat → chat_helpers}/hook_integration.rb +108 -46
  51. data/lib/swarm_sdk/agent/chat_helpers/instrumentation.rb +78 -0
  52. data/lib/swarm_sdk/agent/chat_helpers/llm_configuration.rb +267 -0
  53. data/lib/swarm_sdk/agent/{chat → chat_helpers}/logging_helpers.rb +3 -3
  54. data/lib/swarm_sdk/agent/chat_helpers/serialization.rb +83 -0
  55. data/lib/swarm_sdk/agent/{chat → chat_helpers}/system_reminder_injector.rb +11 -13
  56. data/lib/swarm_sdk/agent/chat_helpers/system_reminders.rb +79 -0
  57. data/lib/swarm_sdk/agent/chat_helpers/token_tracking.rb +146 -0
  58. data/lib/swarm_sdk/agent/context.rb +1 -2
  59. data/lib/swarm_sdk/agent/definition.rb +66 -154
  60. data/lib/swarm_sdk/agent/llm_instrumentation_middleware.rb +4 -2
  61. data/lib/swarm_sdk/agent/system_prompt_builder.rb +161 -0
  62. data/lib/swarm_sdk/agent_registry.rb +146 -0
  63. data/lib/swarm_sdk/builders/base_builder.rb +488 -0
  64. data/lib/swarm_sdk/concerns/cleanupable.rb +39 -0
  65. data/lib/swarm_sdk/concerns/snapshotable.rb +67 -0
  66. data/lib/swarm_sdk/concerns/validatable.rb +55 -0
  67. data/lib/swarm_sdk/config.rb +302 -0
  68. data/lib/swarm_sdk/configuration/parser.rb +373 -0
  69. data/lib/swarm_sdk/configuration/translator.rb +255 -0
  70. data/lib/swarm_sdk/configuration.rb +77 -546
  71. data/lib/swarm_sdk/context_compactor/token_counter.rb +2 -6
  72. data/lib/swarm_sdk/context_compactor.rb +6 -11
  73. data/lib/swarm_sdk/context_management/builder.rb +128 -0
  74. data/lib/swarm_sdk/context_management/context.rb +328 -0
  75. data/lib/swarm_sdk/custom_tool_registry.rb +226 -0
  76. data/lib/swarm_sdk/defaults.rb +196 -0
  77. data/lib/swarm_sdk/events_to_messages.rb +18 -0
  78. data/lib/swarm_sdk/hooks/adapter.rb +3 -3
  79. data/lib/swarm_sdk/hooks/shell_executor.rb +4 -2
  80. data/lib/swarm_sdk/log_collector.rb +179 -29
  81. data/lib/swarm_sdk/log_stream.rb +29 -0
  82. data/lib/swarm_sdk/models.json +4333 -1
  83. data/lib/swarm_sdk/models.rb +43 -2
  84. data/lib/swarm_sdk/node_context.rb +1 -1
  85. data/lib/swarm_sdk/observer/builder.rb +81 -0
  86. data/lib/swarm_sdk/observer/config.rb +45 -0
  87. data/lib/swarm_sdk/observer/manager.rb +236 -0
  88. data/lib/swarm_sdk/patterns/agent_observer.rb +160 -0
  89. data/lib/swarm_sdk/plugin.rb +95 -5
  90. data/lib/swarm_sdk/result.rb +52 -0
  91. data/lib/swarm_sdk/snapshot.rb +6 -6
  92. data/lib/swarm_sdk/snapshot_from_events.rb +13 -2
  93. data/lib/swarm_sdk/state_restorer.rb +136 -151
  94. data/lib/swarm_sdk/state_snapshot.rb +65 -100
  95. data/lib/swarm_sdk/swarm/agent_initializer.rb +181 -137
  96. data/lib/swarm_sdk/swarm/builder.rb +44 -578
  97. data/lib/swarm_sdk/swarm/executor.rb +213 -0
  98. data/lib/swarm_sdk/swarm/hook_triggers.rb +151 -0
  99. data/lib/swarm_sdk/swarm/logging_callbacks.rb +341 -0
  100. data/lib/swarm_sdk/swarm/mcp_configurator.rb +7 -4
  101. data/lib/swarm_sdk/swarm/tool_configurator.rb +58 -140
  102. data/lib/swarm_sdk/swarm.rb +203 -683
  103. data/lib/swarm_sdk/tools/bash.rb +14 -8
  104. data/lib/swarm_sdk/tools/delegate.rb +61 -43
  105. data/lib/swarm_sdk/tools/edit.rb +8 -13
  106. data/lib/swarm_sdk/tools/glob.rb +12 -4
  107. data/lib/swarm_sdk/tools/grep.rb +7 -0
  108. data/lib/swarm_sdk/tools/multi_edit.rb +15 -11
  109. data/lib/swarm_sdk/tools/path_resolver.rb +51 -2
  110. data/lib/swarm_sdk/tools/read.rb +16 -18
  111. data/lib/swarm_sdk/tools/registry.rb +122 -10
  112. data/lib/swarm_sdk/tools/stores/scratchpad_storage.rb +9 -5
  113. data/lib/swarm_sdk/tools/stores/storage.rb +0 -6
  114. data/lib/swarm_sdk/tools/todo_write.rb +7 -0
  115. data/lib/swarm_sdk/tools/web_fetch.rb +20 -17
  116. data/lib/swarm_sdk/tools/write.rb +8 -13
  117. data/lib/swarm_sdk/version.rb +1 -1
  118. data/lib/swarm_sdk/{node → workflow}/agent_config.rb +1 -1
  119. data/lib/swarm_sdk/workflow/builder.rb +192 -0
  120. data/lib/swarm_sdk/workflow/executor.rb +497 -0
  121. data/lib/swarm_sdk/{node/builder.rb → workflow/node_builder.rb} +7 -5
  122. data/lib/swarm_sdk/{node → workflow}/transformer_executor.rb +5 -3
  123. data/lib/swarm_sdk/{node_orchestrator.rb → workflow.rb} +152 -456
  124. data/lib/swarm_sdk.rb +294 -108
  125. data/rubocop/cop/security/no_reflection_methods.rb +1 -1
  126. data/swarm_cli.gemspec +1 -1
  127. data/swarm_memory.gemspec +8 -3
  128. data/swarm_sdk.gemspec +6 -4
  129. data/team_full.yml +124 -320
  130. metadata +42 -14
  131. data/lib/swarm_memory/chat_extension.rb +0 -34
  132. data/lib/swarm_memory/tools/memory_multi_edit.rb +0 -281
  133. data/lib/swarm_sdk/providers/openai_with_responses.rb +0 -589
  134. /data/lib/swarm_memory/{errors.rb → error.rb} +0 -0
@@ -0,0 +1,172 @@
1
+ # Decision: Global Agent Registry for SwarmSDK
2
+
3
+ **Date:** 2025-11-22
4
+ **Status:** Implemented
5
+
6
+ ## Context
7
+
8
+ Users wanted the ability to declare agents in separate files and reference them by name in swarm definitions. This promotes:
9
+ - Code reuse across multiple swarms
10
+ - Separation of concerns (agent definitions vs swarm composition)
11
+ - Cleaner organization for large projects
12
+
13
+ ## Decision
14
+
15
+ Implement a global `AgentRegistry` that stores agent configuration blocks and allows referencing them in `SwarmSDK.build` and `SwarmSDK.workflow` definitions.
16
+
17
+ ### API Design
18
+
19
+ ```ruby
20
+ # Register agent in separate file (e.g., agents/backend.rb)
21
+ SwarmSDK.agent :backend do
22
+ model "claude-sonnet-4"
23
+ description "Backend developer"
24
+ system_prompt "You build APIs"
25
+ tools :Read, :Edit, :Bash
26
+ end
27
+
28
+ # Reference in swarm definition
29
+ SwarmSDK.build do
30
+ name "Dev Team"
31
+ lead :backend
32
+
33
+ agent :backend # Lookup from registry
34
+ end
35
+
36
+ # Extend with overrides
37
+ SwarmSDK.build do
38
+ name "Extended Team"
39
+ lead :backend
40
+
41
+ agent :backend do
42
+ tools :CustomTool # Adds to registry tools
43
+ end
44
+ end
45
+ ```
46
+
47
+ ### Key Design Decisions
48
+
49
+ 1. **Proc Storage (not Lambda)**
50
+ - Procs work naturally with `instance_eval` DSL semantics
51
+ - Flexible arity handling suits DSL blocks
52
+ - Blocks passed to methods are already Procs
53
+
54
+ 2. **Class with Class Methods (not Singleton)**
55
+ - Simpler than full Singleton pattern
56
+ - Easier to test with `AgentRegistry.clear`
57
+ - Class methods feel natural for global registry
58
+
59
+ 3. **Duplicate Registration Error**
60
+ - Raises `ArgumentError` if registering same name twice
61
+ - Prevents accidental overwrites across files
62
+ - User must call `SwarmSDK.clear_agent_registry!` to reset
63
+
64
+ 4. **Registry Takes Precedence**
65
+ - When `agent :name do ... end` is called and agent is registered:
66
+ - Registry config is applied first
67
+ - Block becomes overrides (additive)
68
+ - Promotes DRY principle - registry is source of truth
69
+
70
+ 5. **No Thread Safety**
71
+ - SwarmSDK uses fiber-based concurrency (Async gem)
72
+ - Single-threaded execution means no race conditions
73
+ - Documented limitation for multi-threaded environments
74
+
75
+ 6. **Delegation is Swarm-Specific (Best Practice)**
76
+ - Don't set `delegates_to` in registry agent definitions
77
+ - Delegation targets depend on which agents exist in each swarm
78
+ - Set `delegates_to` as an override when referencing the agent in a swarm
79
+ - This makes agents truly reusable across different swarm compositions
80
+
81
+ ## Implementation
82
+
83
+ ### New Files
84
+ - `lib/swarm_sdk/agent_registry.rb` - AgentRegistry class
85
+
86
+ ### Modified Files
87
+ - `lib/swarm_sdk.rb` - Added `SwarmSDK.agent` and `SwarmSDK.clear_agent_registry!`
88
+ - `lib/swarm_sdk/builders/base_builder.rb` - Added registry lookup to `#agent` method
89
+
90
+ ### Test Coverage
91
+ - 26 tests covering:
92
+ - Registry class methods (register, get, registered?, names, clear)
93
+ - Module methods (agent, clear_agent_registry!)
94
+ - Registry lookup in Swarm and Workflow builders
95
+ - Registry + overrides behavior
96
+ - Multiple swarms sharing registry
97
+ - Error handling
98
+ - Edge cases
99
+
100
+ ## Alternatives Considered
101
+
102
+ 1. **Explicit Syntax (`agent :name, from: :registry`)**
103
+ - Rejected: Too verbose for common use case
104
+ - Current behavior is intuitive (no args = lookup)
105
+
106
+ 2. **Warning on Shadow**
107
+ - Rejected: Too noisy, users might ignore
108
+ - Error-free operation preferred
109
+
110
+ 3. **Thread-Safe Implementation**
111
+ - Rejected: Unnecessary complexity for fiber-based model
112
+ - The definitions should be eager loaded in the app that is using the SDK
113
+ - Documented limitation acceptable
114
+
115
+ ## Enhancement: Workflow Node Registry Fallback
116
+
117
+ Added automatic agent resolution in workflow nodes. When `agent(:name)` is called inside a node:
118
+
119
+ 1. First checks if agent is defined at workflow level
120
+ 2. If not found, checks the global AgentRegistry
121
+ 3. If still not found, raises ConfigurationError
122
+
123
+ This allows powerful patterns like:
124
+
125
+ ```ruby
126
+ # agents/shared.rb
127
+ SwarmSDK.agent :shared_analyzer do
128
+ model "claude-sonnet-4"
129
+ description "Shared analyzer"
130
+ end
131
+
132
+ # workflow.rb
133
+ SwarmSDK.workflow do
134
+ name "Pipeline"
135
+ start_node :analyze
136
+
137
+ # No need to define shared_analyzer here!
138
+
139
+ node :analyze do
140
+ agent(:shared_analyzer) # Auto-resolved from registry
141
+ end
142
+ end
143
+ ```
144
+
145
+ The fallback also resolves delegation targets:
146
+
147
+ ```ruby
148
+ node :process do
149
+ agent(:main_agent).delegates_to(:helper_agent)
150
+ # Both resolved from registry
151
+ end
152
+ ```
153
+
154
+ ### Implementation
155
+ - Modified `Workflow::Builder#build_workflow` to call `resolve_missing_agents_from_registry`
156
+ - Added `collect_referenced_agents` to gather all agents from nodes (including delegates_to)
157
+ - Resolution happens at build time before agent definitions are built
158
+
159
+ ## Consequences
160
+
161
+ ### Positive
162
+ - Clean separation of agent definitions from swarm composition
163
+ - Easy code reuse across swarms
164
+ - Intuitive API that matches existing DSL patterns
165
+ - Works with both Swarm and Workflow builders
166
+ - Workflow nodes automatically resolve agents from registry
167
+ - Delegation targets also auto-resolve from registry
168
+
169
+ ### Negative
170
+ - Global state (mitigated by clear method for testing)
171
+ - Not thread-safe (documented limitation)
172
+ - Must require agent files before building swarms
@@ -5,6 +5,26 @@ All notable changes to SwarmCLI will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [2.1.7]
9
+
10
+ ### Dependencies
11
+
12
+ - Updated `swarm_sdk` to `~> 2.5.1`
13
+
14
+ ## [2.1.6]
15
+ - Bump SDK and memory gem versions
16
+
17
+ ## [2.1.5]
18
+ - Bump SDK gem version
19
+
20
+ ## [2.1.4]
21
+
22
+ ### Changed
23
+
24
+ - `ConfigLoader` now accepts both `SwarmSDK::Swarm` and `SwarmSDK::Workflow` instances from Ruby DSL files
25
+ - Updated error messages to reference `Workflow` instead of `NodeOrchestrator`
26
+ - Both swarms and workflows work seamlessly with CLI commands
27
+
8
28
  ## [2.1.3]
9
29
 
10
30
  ### Fixed
@@ -5,7 +5,152 @@ All notable changes to SwarmMemory will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
- ## [Unreleased]
8
+ ## [2.2.3]
9
+
10
+ ### Fixed
11
+
12
+ - **Hybrid search weight configuration**: Fixed bug where `semantic_weight` and `keyword_weight` from config weren't being passed to SemanticIndex
13
+ - **Issue**: SDK plugin extracted weights from config but didn't pass them to Storage/SemanticIndex
14
+ - **Fix**: Storage now accepts and passes weight parameters through to SemanticIndex
15
+ - **Impact**: Per-agent weight configuration now works correctly (was only used for logging before)
16
+ - **Files**: `lib/swarm_memory/core/storage.rb:23-35`, `lib/swarm_memory/integration/sdk_plugin.rb:130-150`
17
+
18
+ - **YAML config with string keys**: Fixed bug where Hash configs with string keys would fail adapter initialization
19
+ - **Issue**: Adapters expect symbol keyword arguments, but YAML configs have string keys
20
+ - **Fix**: Symbolize adapter option keys in create_storage for Hash configs
21
+ - **Impact**: YAML configurations now work correctly with all adapters
22
+ - **Files**: `lib/swarm_memory/integration/sdk_plugin.rb:113-118`
23
+
24
+ ### Added
25
+
26
+ - **DSL methods for weights**: Added `semantic_weight()` and `keyword_weight()` methods to MemoryConfig
27
+ - **Before**: `option(:semantic_weight, 0.8)`
28
+ - **After**: `semantic_weight(0.8)` (cleaner syntax, consistent with `directory()` and `mode()`)
29
+ - **Backward compatible**: `option()` method still works
30
+ - **Files**: `lib/swarm_memory/dsl/memory_config.rb:87-122`
31
+
32
+ ### Changed
33
+
34
+ - **Automatic semantic fallback**: Hybrid search now falls back to pure semantic scoring when keyword_score is 0
35
+ - **Before**: semantic=0.92, keyword=0.0 → final=0.46 (penalized by 50/50 weights)
36
+ - **After**: semantic=0.92, keyword=0.0 → final=0.92 (no penalty when no tag matches)
37
+ - **Rationale**: Prevents excellent semantic matches from being penalized when there's no keyword/tag overlap
38
+ - **Impact**: Improved recall for queries with no tag matches
39
+ - **Files**: `lib/swarm_memory/core/semantic_index.rb:195-201`
40
+
41
+ ## [2.2.2]
42
+
43
+ ### Dependencies
44
+
45
+ - Updated `swarm_sdk` to `~> 2.5.1`
46
+
47
+ ## [2.2.1]
48
+
49
+ ### Fixed
50
+
51
+ - **MemoryEdit metadata preservation**: MemoryEdit now preserves all metadata when updating entry content
52
+ - **Issue**: MemoryEdit was only preserving title, losing tags, confidence, domain, and other metadata
53
+ - **Fix**: Pass `metadata: entry.metadata` to storage.write to preserve all existing metadata
54
+ - **Impact**: Prevents metadata loss when editing memory entries
55
+ - **Files**: `lib/swarm_memory/tools/memory_edit.rb:169`
56
+
57
+ ## [2.2.0]
58
+
59
+ ### Added
60
+
61
+ - **Per-Adapter Threshold Configuration**: Semantic search thresholds can now be configured per-adapter in YAML
62
+ - **Fallback chain**: `adapter_config → ENV var → hardcoded_default` (config wins over ENV)
63
+ - **Supported threshold keys**:
64
+ - `discovery_threshold` (default: 0.35) - Main similarity threshold for normal queries
65
+ - `discovery_threshold_short` (default: 0.25) - Threshold for queries with <10 words
66
+ - `adaptive_word_cutoff` (default: 10) - Word count to switch between thresholds
67
+ - `semantic_weight` (default: 0.5) - Hybrid search semantic weight
68
+ - `keyword_weight` (default: 0.5) - Hybrid search keyword weight
69
+ - **Use cases**: Per-agent threshold tuning, adapter-specific optimization (pgvector vs FAISS), multi-tenant customization
70
+ - **Backward compatible**: ENV vars still work as deployment-level override
71
+ - **Zero config required**: Sensible defaults work out of the box
72
+ - **Example**:
73
+ ```yaml
74
+ memory:
75
+ adapter: multi_bank_postgres
76
+ agent_id: researcher
77
+ discovery_threshold: 0.5
78
+ discovery_threshold_short: 0.3
79
+ semantic_weight: 0.6
80
+ ```
81
+ - **Files**: `lib/swarm_memory/integration/sdk_plugin.rb`
82
+ - **Tests**: 4 new tests validating threshold extraction and fallback behavior
83
+
84
+ - **Custom Adapter Support**: SwarmMemory now fully supports custom storage adapters
85
+ - **Custom adapter options pass-through**: All YAML config keys (except `directory`, `adapter`, `mode`) are now passed to adapter constructor
86
+ - **Example configuration**:
87
+ ```yaml
88
+ memory:
89
+ adapter: multi_bank_postgres
90
+ agent_id: business_consultant
91
+ default_bank: working
92
+ banks:
93
+ working: { max_size: 10485760 }
94
+ long_term: { max_size: 52428800 }
95
+ bank_access:
96
+ archive: read_only
97
+ ```
98
+ - **Enables**: PostgreSQL, MySQL, Redis, S3, and any custom storage backend
99
+ - **Files**: `lib/swarm_memory/integration/sdk_plugin.rb:290-310`
100
+ - **Tests**: 2 new tests for custom adapter option pass-through
101
+
102
+ ### Changed
103
+
104
+ - **BREAKING: `storage_enabled?` renamed to `memory_configured?`** in SDKPlugin
105
+ - **Improved logic**: Filesystem adapter requires `directory`, custom adapters can use any configuration keys
106
+ - **Better validation**: Custom adapters are recognized as valid even without `directory` key
107
+ - **Adapter validation**: Each adapter validates its own requirements during initialization
108
+ - **No backward compatibility**: `storage_enabled?` method removed entirely (breaking change)
109
+ - **Migration**: Update any code calling `plugin.storage_enabled?()` to use `plugin.memory_configured?()`
110
+ - **Files**: `lib/swarm_memory/integration/sdk_plugin.rb:202-235`
111
+ - **Tests**: 3 new tests for custom adapter recognition
112
+
113
+ ### Removed
114
+
115
+ - **MemoryMultiEdit tool**: Removed in favor of simpler MemoryEdit tool
116
+ - **Rationale**: Memory entries are small (typically < 100 lines), making batch edits unnecessary
117
+ - **Alternative**: Use multiple `MemoryEdit` calls for sequential edits
118
+ - **Simplification**: Reduces API complexity and LLM error surface (JSON parameter was error-prone)
119
+ - **Files removed**: `lib/swarm_memory/tools/memory_multi_edit.rb`
120
+ - **Tool count**: Memory tools reduced from 8 to 7 (MemoryWrite, MemoryRead, MemoryEdit, MemoryDelete, MemoryGlob, MemoryGrep, MemoryDefrag)
121
+
122
+ ### Benefits
123
+
124
+ - ✅ **Eliminates need for monkey patches** when building custom adapters
125
+ - ✅ **Makes SwarmMemory fully extensible** for any storage backend
126
+ - ✅ **Per-agent threshold tuning** for optimal semantic search accuracy
127
+ - ✅ **Multi-tenant customization** with per-adapter configuration
128
+ - ✅ **Clearer semantics** (memory vs storage terminology)
129
+ - ✅ **Better error messages** (adapters validate themselves)
130
+
131
+ ## [2.1.7]
132
+
133
+ ### Dependencies
134
+
135
+ - Updated `ruby_llm_swarm` to `~> 1.9.5`
136
+
137
+ ## [2.1.6]
138
+ - Fix files included in the gem
139
+
140
+ ## [2.1.5]
141
+
142
+ ### Fixed
143
+ - **Fixed Zeitwerk naming convention**: Renamed `lib/swarm_memory/errors.rb` to `lib/swarm_memory/error.rb` to match the `SwarmMemory::Error` constant it defines
144
+ - Fixes `Zeitwerk::Loader.eager_load_all` failures with "uninitialized constant SwarmMemory::Errors" errors
145
+ - Properly follows Zeitwerk file naming conventions where `error.rb` defines `Error` class
146
+
147
+ ## [2.1.4]
148
+
149
+ ### Changed
150
+
151
+ - Updated documentation to reference `Workflow` instead of `NodeOrchestrator`
152
+ - Memory configuration preserved when agents are cloned in `Workflow` (formerly `NodeOrchestrator`)
153
+ - No functional changes - fully compatible with SwarmSDK refactoring
9
154
 
10
155
  ## [2.1.3] - 2025-11-06
11
156