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.
- checksums.yaml +4 -4
- data/{CHANGELOG.md → CHANGELOG.claude-swarm.md} +10 -0
- data/CLAUDE.md +346 -191
- data/decisions/2025-11-22-001-global-agent-registry.md +172 -0
- data/docs/v2/CHANGELOG.swarm_cli.md +20 -0
- data/docs/v2/CHANGELOG.swarm_memory.md +146 -1
- data/docs/v2/CHANGELOG.swarm_sdk.md +433 -10
- data/docs/v2/README.md +20 -5
- data/docs/v2/guides/complete-tutorial.md +95 -9
- data/docs/v2/guides/getting-started.md +10 -8
- data/docs/v2/guides/memory-adapters.md +41 -0
- data/docs/v2/guides/migrating-to-2.x.md +746 -0
- data/docs/v2/guides/plugins.md +52 -5
- data/docs/v2/guides/rails-integration.md +6 -0
- data/docs/v2/guides/snapshots.md +14 -14
- data/docs/v2/guides/swarm-memory.md +2 -13
- data/docs/v2/reference/architecture-flow.md +3 -3
- data/docs/v2/reference/cli.md +0 -1
- data/docs/v2/reference/configuration_reference.md +300 -0
- data/docs/v2/reference/event_payload_structures.md +27 -5
- data/docs/v2/reference/ruby-dsl.md +614 -18
- data/docs/v2/reference/swarm_memory_technical_details.md +7 -29
- data/docs/v2/reference/yaml.md +172 -54
- data/examples/snapshot_demo.rb +2 -2
- data/lib/claude_swarm/mcp_generator.rb +8 -21
- data/lib/claude_swarm/orchestrator.rb +8 -1
- data/lib/claude_swarm/version.rb +1 -1
- data/lib/swarm_cli/commands/run.rb +2 -2
- data/lib/swarm_cli/config_loader.rb +11 -11
- data/lib/swarm_cli/formatters/human_formatter.rb +0 -33
- data/lib/swarm_cli/interactive_repl.rb +2 -2
- data/lib/swarm_cli/ui/icons.rb +0 -23
- data/lib/swarm_cli/version.rb +1 -1
- data/lib/swarm_memory/adapters/filesystem_adapter.rb +11 -34
- data/lib/swarm_memory/core/semantic_index.rb +10 -2
- data/lib/swarm_memory/core/storage.rb +7 -2
- data/lib/swarm_memory/dsl/memory_config.rb +37 -0
- data/lib/swarm_memory/integration/sdk_plugin.rb +201 -28
- data/lib/swarm_memory/optimization/defragmenter.rb +1 -1
- data/lib/swarm_memory/prompts/memory_researcher.md.erb +0 -1
- data/lib/swarm_memory/tools/load_skill.rb +0 -1
- data/lib/swarm_memory/tools/memory_edit.rb +2 -1
- data/lib/swarm_memory/tools/memory_read.rb +1 -1
- data/lib/swarm_memory/version.rb +1 -1
- data/lib/swarm_memory.rb +8 -6
- data/lib/swarm_sdk/agent/builder.rb +58 -0
- data/lib/swarm_sdk/agent/chat.rb +527 -1061
- data/lib/swarm_sdk/agent/{chat → chat_helpers}/context_tracker.rb +13 -88
- data/lib/swarm_sdk/agent/chat_helpers/event_emitter.rb +204 -0
- data/lib/swarm_sdk/agent/{chat → chat_helpers}/hook_integration.rb +108 -46
- data/lib/swarm_sdk/agent/chat_helpers/instrumentation.rb +78 -0
- data/lib/swarm_sdk/agent/chat_helpers/llm_configuration.rb +267 -0
- data/lib/swarm_sdk/agent/{chat → chat_helpers}/logging_helpers.rb +3 -3
- data/lib/swarm_sdk/agent/chat_helpers/serialization.rb +83 -0
- data/lib/swarm_sdk/agent/{chat → chat_helpers}/system_reminder_injector.rb +11 -13
- data/lib/swarm_sdk/agent/chat_helpers/system_reminders.rb +79 -0
- data/lib/swarm_sdk/agent/chat_helpers/token_tracking.rb +146 -0
- data/lib/swarm_sdk/agent/context.rb +1 -2
- data/lib/swarm_sdk/agent/definition.rb +66 -154
- data/lib/swarm_sdk/agent/llm_instrumentation_middleware.rb +4 -2
- data/lib/swarm_sdk/agent/system_prompt_builder.rb +161 -0
- data/lib/swarm_sdk/agent_registry.rb +146 -0
- data/lib/swarm_sdk/builders/base_builder.rb +488 -0
- data/lib/swarm_sdk/concerns/cleanupable.rb +39 -0
- data/lib/swarm_sdk/concerns/snapshotable.rb +67 -0
- data/lib/swarm_sdk/concerns/validatable.rb +55 -0
- data/lib/swarm_sdk/config.rb +302 -0
- data/lib/swarm_sdk/configuration/parser.rb +373 -0
- data/lib/swarm_sdk/configuration/translator.rb +255 -0
- data/lib/swarm_sdk/configuration.rb +77 -546
- data/lib/swarm_sdk/context_compactor/token_counter.rb +2 -6
- data/lib/swarm_sdk/context_compactor.rb +6 -11
- data/lib/swarm_sdk/context_management/builder.rb +128 -0
- data/lib/swarm_sdk/context_management/context.rb +328 -0
- data/lib/swarm_sdk/custom_tool_registry.rb +226 -0
- data/lib/swarm_sdk/defaults.rb +196 -0
- data/lib/swarm_sdk/events_to_messages.rb +18 -0
- data/lib/swarm_sdk/hooks/adapter.rb +3 -3
- data/lib/swarm_sdk/hooks/shell_executor.rb +4 -2
- data/lib/swarm_sdk/log_collector.rb +179 -29
- data/lib/swarm_sdk/log_stream.rb +29 -0
- data/lib/swarm_sdk/models.json +4333 -1
- data/lib/swarm_sdk/models.rb +43 -2
- data/lib/swarm_sdk/node_context.rb +1 -1
- data/lib/swarm_sdk/observer/builder.rb +81 -0
- data/lib/swarm_sdk/observer/config.rb +45 -0
- data/lib/swarm_sdk/observer/manager.rb +236 -0
- data/lib/swarm_sdk/patterns/agent_observer.rb +160 -0
- data/lib/swarm_sdk/plugin.rb +95 -5
- data/lib/swarm_sdk/result.rb +52 -0
- data/lib/swarm_sdk/snapshot.rb +6 -6
- data/lib/swarm_sdk/snapshot_from_events.rb +13 -2
- data/lib/swarm_sdk/state_restorer.rb +136 -151
- data/lib/swarm_sdk/state_snapshot.rb +65 -100
- data/lib/swarm_sdk/swarm/agent_initializer.rb +181 -137
- data/lib/swarm_sdk/swarm/builder.rb +44 -578
- data/lib/swarm_sdk/swarm/executor.rb +213 -0
- data/lib/swarm_sdk/swarm/hook_triggers.rb +151 -0
- data/lib/swarm_sdk/swarm/logging_callbacks.rb +341 -0
- data/lib/swarm_sdk/swarm/mcp_configurator.rb +7 -4
- data/lib/swarm_sdk/swarm/tool_configurator.rb +58 -140
- data/lib/swarm_sdk/swarm.rb +203 -683
- data/lib/swarm_sdk/tools/bash.rb +14 -8
- data/lib/swarm_sdk/tools/delegate.rb +61 -43
- data/lib/swarm_sdk/tools/edit.rb +8 -13
- data/lib/swarm_sdk/tools/glob.rb +12 -4
- data/lib/swarm_sdk/tools/grep.rb +7 -0
- data/lib/swarm_sdk/tools/multi_edit.rb +15 -11
- data/lib/swarm_sdk/tools/path_resolver.rb +51 -2
- data/lib/swarm_sdk/tools/read.rb +16 -18
- data/lib/swarm_sdk/tools/registry.rb +122 -10
- data/lib/swarm_sdk/tools/stores/scratchpad_storage.rb +9 -5
- data/lib/swarm_sdk/tools/stores/storage.rb +0 -6
- data/lib/swarm_sdk/tools/todo_write.rb +7 -0
- data/lib/swarm_sdk/tools/web_fetch.rb +20 -17
- data/lib/swarm_sdk/tools/write.rb +8 -13
- data/lib/swarm_sdk/version.rb +1 -1
- data/lib/swarm_sdk/{node → workflow}/agent_config.rb +1 -1
- data/lib/swarm_sdk/workflow/builder.rb +192 -0
- data/lib/swarm_sdk/workflow/executor.rb +497 -0
- data/lib/swarm_sdk/{node/builder.rb → workflow/node_builder.rb} +7 -5
- data/lib/swarm_sdk/{node → workflow}/transformer_executor.rb +5 -3
- data/lib/swarm_sdk/{node_orchestrator.rb → workflow.rb} +152 -456
- data/lib/swarm_sdk.rb +294 -108
- data/rubocop/cop/security/no_reflection_methods.rb +1 -1
- data/swarm_cli.gemspec +1 -1
- data/swarm_memory.gemspec +8 -3
- data/swarm_sdk.gemspec +6 -4
- data/team_full.yml +124 -320
- metadata +42 -14
- data/lib/swarm_memory/chat_extension.rb +0 -34
- data/lib/swarm_memory/tools/memory_multi_edit.rb +0 -281
- data/lib/swarm_sdk/providers/openai_with_responses.rb +0 -589
- /data/lib/swarm_memory/{errors.rb → error.rb} +0 -0
|
@@ -930,12 +930,12 @@ swarm:
|
|
|
930
930
|
**How delegation works**:
|
|
931
931
|
1. You send task to `developer`
|
|
932
932
|
2. Developer writes code using Write tool
|
|
933
|
-
3. Developer calls `
|
|
933
|
+
3. Developer calls `WorkWithReviewer(message: "Review this code")`
|
|
934
934
|
4. Reviewer analyzes code and returns feedback
|
|
935
935
|
5. Developer receives feedback and can iterate
|
|
936
936
|
6. Developer returns final result to you
|
|
937
937
|
|
|
938
|
-
**The delegation tool**: When you configure `delegates_to: [reviewer]`, the developer automatically gets a `
|
|
938
|
+
**The delegation tool**: When you configure `delegates_to: [reviewer]`, the developer automatically gets a `WorkWithReviewer` tool.
|
|
939
939
|
|
|
940
940
|
### 3.2 Multi-Level Delegation
|
|
941
941
|
|
|
@@ -2858,7 +2858,93 @@ project/
|
|
|
2858
2858
|
└── .env # API keys
|
|
2859
2859
|
```
|
|
2860
2860
|
|
|
2861
|
-
### 8.3
|
|
2861
|
+
### 8.3 Reusable Agent Definitions (Global Registry)
|
|
2862
|
+
|
|
2863
|
+
For large projects, define agents once and reuse them across multiple swarms.
|
|
2864
|
+
|
|
2865
|
+
**Register agents globally:**
|
|
2866
|
+
```ruby
|
|
2867
|
+
# agents/backend.rb
|
|
2868
|
+
SwarmSDK.agent :backend do
|
|
2869
|
+
model "claude-sonnet-4"
|
|
2870
|
+
description "Backend developer"
|
|
2871
|
+
system_prompt "You build APIs and databases"
|
|
2872
|
+
tools :Read, :Edit, :Bash
|
|
2873
|
+
# Note: Don't set delegates_to here - it's swarm-specific!
|
|
2874
|
+
end
|
|
2875
|
+
|
|
2876
|
+
# agents/database.rb
|
|
2877
|
+
SwarmSDK.agent :database do
|
|
2878
|
+
model "claude-sonnet-4"
|
|
2879
|
+
description "Database specialist"
|
|
2880
|
+
system_prompt "You design schemas and write migrations"
|
|
2881
|
+
tools :Read, :Edit
|
|
2882
|
+
end
|
|
2883
|
+
```
|
|
2884
|
+
|
|
2885
|
+
**Reference in swarms (set delegation per-swarm):**
|
|
2886
|
+
```ruby
|
|
2887
|
+
# Load agent definitions first
|
|
2888
|
+
require_relative "agents/backend"
|
|
2889
|
+
require_relative "agents/database"
|
|
2890
|
+
|
|
2891
|
+
# Reference by name and configure delegation (swarm-specific)
|
|
2892
|
+
swarm = SwarmSDK.build do
|
|
2893
|
+
name "Dev Team"
|
|
2894
|
+
lead :backend
|
|
2895
|
+
|
|
2896
|
+
agent :backend do
|
|
2897
|
+
delegates_to :database # Delegation is swarm-specific
|
|
2898
|
+
end
|
|
2899
|
+
agent :database # Pulls from registry as-is
|
|
2900
|
+
end
|
|
2901
|
+
```
|
|
2902
|
+
|
|
2903
|
+
**Override other registry settings:**
|
|
2904
|
+
```ruby
|
|
2905
|
+
swarm = SwarmSDK.build do
|
|
2906
|
+
name "Extended Team"
|
|
2907
|
+
lead :backend
|
|
2908
|
+
|
|
2909
|
+
# Registry config applied first, then override block
|
|
2910
|
+
agent :backend do
|
|
2911
|
+
delegates_to :database, :cache # Set delegation for this swarm
|
|
2912
|
+
tools :CustomTool # Adds to registry tools
|
|
2913
|
+
timeout 300 # Overrides registry timeout
|
|
2914
|
+
end
|
|
2915
|
+
end
|
|
2916
|
+
```
|
|
2917
|
+
|
|
2918
|
+
**Workflow auto-resolution:**
|
|
2919
|
+
Agents referenced in workflow nodes automatically resolve from the global registry:
|
|
2920
|
+
|
|
2921
|
+
```ruby
|
|
2922
|
+
SwarmSDK.workflow do
|
|
2923
|
+
name "Pipeline"
|
|
2924
|
+
start_node :build
|
|
2925
|
+
|
|
2926
|
+
# No need to define :backend here - auto-resolved from registry!
|
|
2927
|
+
node :build do
|
|
2928
|
+
agent(:backend)
|
|
2929
|
+
end
|
|
2930
|
+
end
|
|
2931
|
+
```
|
|
2932
|
+
|
|
2933
|
+
**Testing with registry:**
|
|
2934
|
+
```ruby
|
|
2935
|
+
# Clear registry between tests
|
|
2936
|
+
def setup
|
|
2937
|
+
SwarmSDK.clear_agent_registry!
|
|
2938
|
+
end
|
|
2939
|
+
```
|
|
2940
|
+
|
|
2941
|
+
**Benefits:**
|
|
2942
|
+
- **Code reuse**: Define agents once, use in multiple swarms
|
|
2943
|
+
- **Separation of concerns**: Agent definitions in dedicated files
|
|
2944
|
+
- **Organization**: Large projects with many agents stay manageable
|
|
2945
|
+
- **DRY principle**: No duplication of agent configurations
|
|
2946
|
+
|
|
2947
|
+
### 8.4 Testing Strategies
|
|
2862
2948
|
|
|
2863
2949
|
**Unit test agents**:
|
|
2864
2950
|
```ruby
|
|
@@ -2920,7 +3006,7 @@ allow(LLM).to receive(:chat).and_return(
|
|
|
2920
3006
|
)
|
|
2921
3007
|
```
|
|
2922
3008
|
|
|
2923
|
-
### 8.
|
|
3009
|
+
### 8.5 Performance Optimization
|
|
2924
3010
|
|
|
2925
3011
|
**1. Choose appropriate models**:
|
|
2926
3012
|
```ruby
|
|
@@ -2993,7 +3079,7 @@ node :summarizer do
|
|
|
2993
3079
|
end
|
|
2994
3080
|
```
|
|
2995
3081
|
|
|
2996
|
-
### 8.
|
|
3082
|
+
### 8.6 Security Considerations
|
|
2997
3083
|
|
|
2998
3084
|
**1. Restrict file access**:
|
|
2999
3085
|
```ruby
|
|
@@ -3099,7 +3185,7 @@ end
|
|
|
3099
3185
|
- **Priority**: Explicit parameter > Global setting > Environment variable > Default (true)
|
|
3100
3186
|
- **Non-breaking**: Defaults to `true` for backward compatibility
|
|
3101
3187
|
|
|
3102
|
-
### 8.
|
|
3188
|
+
### 8.7 Cost Management
|
|
3103
3189
|
|
|
3104
3190
|
**Track costs in real-time**:
|
|
3105
3191
|
```ruby
|
|
@@ -3153,7 +3239,7 @@ end
|
|
|
3153
3239
|
- [ ] Batch similar operations
|
|
3154
3240
|
- [ ] Monitor and set cost alerts
|
|
3155
3241
|
|
|
3156
|
-
### 8.
|
|
3242
|
+
### 8.8 Monitoring and Observability
|
|
3157
3243
|
|
|
3158
3244
|
**Structured logging to files**:
|
|
3159
3245
|
```ruby
|
|
@@ -3205,7 +3291,7 @@ end
|
|
|
3205
3291
|
}
|
|
3206
3292
|
```
|
|
3207
3293
|
|
|
3208
|
-
### 8.
|
|
3294
|
+
### 8.9 Common Patterns Summary
|
|
3209
3295
|
|
|
3210
3296
|
**Pattern: Code Review Workflow**
|
|
3211
3297
|
```
|
|
@@ -3263,7 +3349,7 @@ You've now learned **100% of SwarmSDK features**:
|
|
|
3263
3349
|
|
|
3264
3350
|
✅ **Part 7: Production Features** - Structured logging, token/cost tracking, error handling, validation, document conversion
|
|
3265
3351
|
|
|
3266
|
-
✅ **Part 8: Best Practices** - Architecture patterns, testing strategies, performance optimization, security, cost management, monitoring
|
|
3352
|
+
✅ **Part 8: Best Practices** - Architecture patterns, reusable agent definitions (global registry), testing strategies, performance optimization, security, cost management, monitoring
|
|
3267
3353
|
|
|
3268
3354
|
## Next Steps
|
|
3269
3355
|
|
|
@@ -124,10 +124,10 @@ An **agent** is an AI with specific capabilities and constraints:
|
|
|
124
124
|
|
|
125
125
|
Delegation is how agents collaborate. When an agent is configured with `delegates_to: [other_agent]`, it gains a special delegation tool.
|
|
126
126
|
|
|
127
|
-
**Delegation tool naming**: Tools are named `
|
|
128
|
-
- `delegates_to: [reviewer]` → creates `
|
|
129
|
-
- `delegates_to: [backend]` → creates `
|
|
130
|
-
- `delegates_to: [qa_tester]` → creates `
|
|
127
|
+
**Delegation tool naming**: Tools are named `WorkWith{AgentName}` where AgentName is capitalized. For example:
|
|
128
|
+
- `delegates_to: [reviewer]` → creates `WorkWithReviewer` tool
|
|
129
|
+
- `delegates_to: [backend]` → creates `WorkWithBackend` tool
|
|
130
|
+
- `delegates_to: [qa_tester]` → creates `WorkWithQa_tester` tool
|
|
131
131
|
|
|
132
132
|
**Example flow**:
|
|
133
133
|
1. You send "Build a login page" to the **lead** agent
|
|
@@ -192,7 +192,7 @@ Tools are functions agents call to interact with the world. SwarmSDK provides:
|
|
|
192
192
|
| **Web** | WebFetch | Fetch and process web content |
|
|
193
193
|
| **Task Management** | TodoWrite | Track progress on multi-step tasks |
|
|
194
194
|
| **Shared Scratchpad** | ScratchpadWrite, ScratchpadRead, ScratchpadList | Share work-in-progress between agents (volatile) |
|
|
195
|
-
| **Per-Agent Memory** | MemoryWrite, MemoryRead, MemoryEdit,
|
|
195
|
+
| **Per-Agent Memory** | MemoryWrite, MemoryRead, MemoryEdit, MemoryGlob, MemoryGrep, MemoryDelete | Persistent learning and knowledge storage (opt-in) |
|
|
196
196
|
| **Reasoning** | Think | Extended reasoning for complex problems |
|
|
197
197
|
|
|
198
198
|
**Default tools**: Every agent automatically gets **Read, Grep, and Glob** unless you explicitly disable them with `disable_default_tools: true`. Scratchpad tools (ScratchpadWrite, ScratchpadRead, ScratchpadList) are opt-in via `scratchpad: :enabled`.
|
|
@@ -750,7 +750,7 @@ swarm = SwarmSDK.load_file('swarm.yml')
|
|
|
750
750
|
result = swarm.execute("Write a function to validate email addresses and get it reviewed")
|
|
751
751
|
```
|
|
752
752
|
|
|
753
|
-
**How delegation works**: The coder writes code, then calls the `
|
|
753
|
+
**How delegation works**: The coder writes code, then calls the `WorkWithReviewer` tool to get feedback. The reviewer analyzes and returns suggestions. The coder can iterate based on feedback.
|
|
754
754
|
|
|
755
755
|
### Using Multiple Tools
|
|
756
756
|
|
|
@@ -1026,7 +1026,7 @@ swarm = SwarmSDK.build do
|
|
|
1026
1026
|
model "gpt-4"
|
|
1027
1027
|
end
|
|
1028
1028
|
end
|
|
1029
|
-
# Leader won't have
|
|
1029
|
+
# Leader won't have WorkWithHelper tool!
|
|
1030
1030
|
```
|
|
1031
1031
|
|
|
1032
1032
|
**Solution**:
|
|
@@ -1239,6 +1239,8 @@ Congratulations! You've learned the fundamentals of SwarmSDK.
|
|
|
1239
1239
|
|
|
1240
1240
|
**Agent Delegation Patterns**: Learn advanced collaboration strategies like hierarchical delegation, peer collaboration, and specialist chains.
|
|
1241
1241
|
|
|
1242
|
+
**Reusable Agent Definitions**: Use the Global Agent Registry (`SwarmSDK.agent`) to define agents once and reuse them across multiple swarms—perfect for large projects with shared agents.
|
|
1243
|
+
|
|
1242
1244
|
**Permissions System**: Discover how to restrict agents to specific directories, prevent dangerous commands, and create secure multi-agent systems.
|
|
1243
1245
|
|
|
1244
1246
|
**Hooks and Customization**: Master pre/post hooks for tool calls, prompt injection, and workflow automation.
|
|
@@ -1412,7 +1414,7 @@ tools :Bash # Run shell commands
|
|
|
1412
1414
|
agent :leader do
|
|
1413
1415
|
description "Coordinates work"
|
|
1414
1416
|
model "gpt-4"
|
|
1415
|
-
delegates_to :worker # Creates
|
|
1417
|
+
delegates_to :worker # Creates WorkWithWorker tool
|
|
1416
1418
|
end
|
|
1417
1419
|
|
|
1418
1420
|
agent :worker do
|
|
@@ -193,6 +193,47 @@ end
|
|
|
193
193
|
# MyAdapter.new(namespace: "researcher", table_name: "memory_entries")
|
|
194
194
|
```
|
|
195
195
|
|
|
196
|
+
### YAML Configuration
|
|
197
|
+
|
|
198
|
+
Custom adapters also work seamlessly with YAML configuration. All YAML keys (except `directory`, `adapter`, `mode`) are automatically passed to the adapter constructor:
|
|
199
|
+
|
|
200
|
+
```yaml
|
|
201
|
+
# swarm.yml
|
|
202
|
+
agents:
|
|
203
|
+
researcher:
|
|
204
|
+
memory:
|
|
205
|
+
adapter: multi_bank_postgres
|
|
206
|
+
agent_id: researcher
|
|
207
|
+
discovery_threshold: 0.5
|
|
208
|
+
discovery_threshold_short: 0.3
|
|
209
|
+
semantic_weight: 0.6
|
|
210
|
+
default_bank: working
|
|
211
|
+
banks:
|
|
212
|
+
working: { max_size: 10485760 }
|
|
213
|
+
long_term: { max_size: 52428800 }
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
This configuration creates an adapter with:
|
|
217
|
+
```ruby
|
|
218
|
+
MultiBankPostgresAdapter.new(
|
|
219
|
+
agent_id: "researcher",
|
|
220
|
+
discovery_threshold: 0.5,
|
|
221
|
+
discovery_threshold_short: 0.3,
|
|
222
|
+
semantic_weight: 0.6,
|
|
223
|
+
default_bank: "working",
|
|
224
|
+
banks: {
|
|
225
|
+
"working" => { "max_size" => 10485760 },
|
|
226
|
+
"long_term" => { "max_size" => 52428800 }
|
|
227
|
+
}
|
|
228
|
+
)
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
**Benefits:**
|
|
232
|
+
- ✅ No code changes needed for configuration
|
|
233
|
+
- ✅ Per-agent customization via YAML
|
|
234
|
+
- ✅ All options passed directly to adapter
|
|
235
|
+
- ✅ Each adapter validates its own requirements
|
|
236
|
+
|
|
196
237
|
---
|
|
197
238
|
|
|
198
239
|
## Example: ActiveRecord Adapter (PostgreSQL/Rails)
|