claude_swarm 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.claude/commands/release.md +1 -1
- data/.claude/hooks/lint-code-files.rb +65 -0
- data/.rubocop.yml +22 -2
- data/CHANGELOG.md +21 -1
- data/CLAUDE.md +1 -1
- data/CONTRIBUTING.md +69 -0
- data/README.md +27 -2
- data/Rakefile +71 -3
- data/analyze_coverage.rb +94 -0
- data/docs/v2/CHANGELOG.swarm_cli.md +43 -0
- data/docs/v2/CHANGELOG.swarm_memory.md +379 -0
- data/docs/v2/CHANGELOG.swarm_sdk.md +362 -0
- data/docs/v2/README.md +308 -0
- data/docs/v2/guides/claude-code-agents.md +262 -0
- data/docs/v2/guides/complete-tutorial.md +3088 -0
- data/docs/v2/guides/getting-started.md +1456 -0
- data/docs/v2/guides/memory-adapters.md +998 -0
- data/docs/v2/guides/plugins.md +816 -0
- data/docs/v2/guides/quick-start-cli.md +1745 -0
- data/docs/v2/guides/rails-integration.md +1902 -0
- data/docs/v2/guides/swarm-memory.md +599 -0
- data/docs/v2/reference/cli.md +729 -0
- data/docs/v2/reference/ruby-dsl.md +2154 -0
- data/docs/v2/reference/yaml.md +1835 -0
- data/docs-team-swarm.yml +2222 -0
- data/examples/learning-assistant/assistant.md +7 -0
- data/examples/learning-assistant/example-memories/concept-example.md +90 -0
- data/examples/learning-assistant/example-memories/experience-example.md +66 -0
- data/examples/learning-assistant/example-memories/fact-example.md +76 -0
- data/examples/learning-assistant/example-memories/memory-index.md +78 -0
- data/examples/learning-assistant/example-memories/skill-example.md +168 -0
- data/examples/learning-assistant/learning_assistant.rb +34 -0
- data/examples/learning-assistant/learning_assistant.yml +20 -0
- data/examples/v2/dsl/01_basic.rb +44 -0
- data/examples/v2/dsl/02_core_parameters.rb +59 -0
- data/examples/v2/dsl/03_capabilities.rb +71 -0
- data/examples/v2/dsl/04_llm_parameters.rb +56 -0
- data/examples/v2/dsl/05_advanced_flags.rb +73 -0
- data/examples/v2/dsl/06_permissions.rb +80 -0
- data/examples/v2/dsl/07_mcp_server.rb +62 -0
- data/examples/v2/dsl/08_swarm_hooks.rb +53 -0
- data/examples/v2/dsl/09_agent_hooks.rb +67 -0
- data/examples/v2/dsl/10_all_agents_hooks.rb +67 -0
- data/examples/v2/dsl/11_delegation.rb +60 -0
- data/examples/v2/dsl/12_complete_integration.rb +137 -0
- data/examples/v2/file_tools_swarm.yml +102 -0
- data/examples/v2/hooks/01_basic_hooks.rb +133 -0
- data/examples/v2/hooks/02_usage_tracking.rb +201 -0
- data/examples/v2/hooks/03_production_monitoring.rb +429 -0
- data/examples/v2/hooks/agent_stop_exit_0.yml +21 -0
- data/examples/v2/hooks/agent_stop_exit_1.yml +21 -0
- data/examples/v2/hooks/agent_stop_exit_2.yml +26 -0
- data/examples/v2/hooks/multiple_hooks_all_pass.yml +37 -0
- data/examples/v2/hooks/multiple_hooks_first_fails.yml +37 -0
- data/examples/v2/hooks/multiple_hooks_second_fails.yml +37 -0
- data/examples/v2/hooks/multiple_hooks_warnings.yml +37 -0
- data/examples/v2/hooks/post_tool_use_exit_0.yml +24 -0
- data/examples/v2/hooks/post_tool_use_exit_1.yml +24 -0
- data/examples/v2/hooks/post_tool_use_exit_2.yml +24 -0
- data/examples/v2/hooks/post_tool_use_multi_matcher_exit_0.yml +26 -0
- data/examples/v2/hooks/post_tool_use_multi_matcher_exit_1.yml +26 -0
- data/examples/v2/hooks/post_tool_use_multi_matcher_exit_2.yml +26 -0
- data/examples/v2/hooks/pre_tool_use_exit_0.yml +24 -0
- data/examples/v2/hooks/pre_tool_use_exit_1.yml +24 -0
- data/examples/v2/hooks/pre_tool_use_exit_2.yml +24 -0
- data/examples/v2/hooks/pre_tool_use_multi_matcher_exit_0.yml +26 -0
- data/examples/v2/hooks/pre_tool_use_multi_matcher_exit_1.yml +26 -0
- data/examples/v2/hooks/pre_tool_use_multi_matcher_exit_2.yml +27 -0
- data/examples/v2/hooks/swarm_summary.sh +44 -0
- data/examples/v2/hooks/user_prompt_exit_0.yml +21 -0
- data/examples/v2/hooks/user_prompt_exit_1.yml +21 -0
- data/examples/v2/hooks/user_prompt_exit_2.yml +21 -0
- data/examples/v2/hooks/validate_bash.rb +59 -0
- data/examples/v2/multi_directory_permissions.yml +221 -0
- data/examples/v2/node_context_demo.rb +127 -0
- data/examples/v2/node_workflow.rb +173 -0
- data/examples/v2/path_resolution_demo.rb +216 -0
- data/examples/v2/simple-swarm-v2.rb +90 -0
- data/examples/v2/simple-swarm-v2.yml +62 -0
- data/examples/v2/swarm.yml +71 -0
- data/examples/v2/swarm_with_hooks.yml +61 -0
- data/examples/v2/swarm_with_hooks_simple.yml +25 -0
- data/examples/v2/think_tool_demo.rb +62 -0
- data/exe/swarm +6 -0
- data/lib/claude_swarm/claude_mcp_server.rb +0 -6
- data/lib/claude_swarm/cli.rb +10 -3
- data/lib/claude_swarm/commands/ps.rb +19 -20
- data/lib/claude_swarm/commands/show.rb +1 -1
- data/lib/claude_swarm/configuration.rb +10 -12
- data/lib/claude_swarm/mcp_generator.rb +10 -1
- data/lib/claude_swarm/orchestrator.rb +73 -49
- data/lib/claude_swarm/system_utils.rb +37 -11
- data/lib/claude_swarm/version.rb +1 -1
- data/lib/claude_swarm/worktree_manager.rb +1 -0
- data/lib/claude_swarm/yaml_loader.rb +22 -0
- data/lib/claude_swarm.rb +7 -3
- data/lib/swarm_cli/cli.rb +201 -0
- data/lib/swarm_cli/command_registry.rb +61 -0
- data/lib/swarm_cli/commands/mcp_serve.rb +130 -0
- data/lib/swarm_cli/commands/mcp_tools.rb +148 -0
- data/lib/swarm_cli/commands/migrate.rb +55 -0
- data/lib/swarm_cli/commands/run.rb +173 -0
- data/lib/swarm_cli/config_loader.rb +97 -0
- data/lib/swarm_cli/formatters/human_formatter.rb +711 -0
- data/lib/swarm_cli/formatters/json_formatter.rb +51 -0
- data/lib/swarm_cli/interactive_repl.rb +918 -0
- data/lib/swarm_cli/mcp_serve_options.rb +44 -0
- data/lib/swarm_cli/mcp_tools_options.rb +59 -0
- data/lib/swarm_cli/migrate_options.rb +54 -0
- data/lib/swarm_cli/migrator.rb +132 -0
- data/lib/swarm_cli/options.rb +151 -0
- data/lib/swarm_cli/ui/components/agent_badge.rb +33 -0
- data/lib/swarm_cli/ui/components/content_block.rb +120 -0
- data/lib/swarm_cli/ui/components/divider.rb +57 -0
- data/lib/swarm_cli/ui/components/panel.rb +62 -0
- data/lib/swarm_cli/ui/components/usage_stats.rb +70 -0
- data/lib/swarm_cli/ui/formatters/cost.rb +49 -0
- data/lib/swarm_cli/ui/formatters/number.rb +58 -0
- data/lib/swarm_cli/ui/formatters/text.rb +77 -0
- data/lib/swarm_cli/ui/formatters/time.rb +73 -0
- data/lib/swarm_cli/ui/icons.rb +59 -0
- data/lib/swarm_cli/ui/renderers/event_renderer.rb +188 -0
- data/lib/swarm_cli/ui/state/agent_color_cache.rb +45 -0
- data/lib/swarm_cli/ui/state/depth_tracker.rb +40 -0
- data/lib/swarm_cli/ui/state/spinner_manager.rb +170 -0
- data/lib/swarm_cli/ui/state/usage_tracker.rb +62 -0
- data/lib/swarm_cli/version.rb +5 -0
- data/lib/swarm_cli.rb +44 -0
- data/lib/swarm_memory/adapters/base.rb +141 -0
- data/lib/swarm_memory/adapters/filesystem_adapter.rb +845 -0
- data/lib/swarm_memory/chat_extension.rb +34 -0
- data/lib/swarm_memory/cli/commands.rb +306 -0
- data/lib/swarm_memory/core/entry.rb +37 -0
- data/lib/swarm_memory/core/frontmatter_parser.rb +108 -0
- data/lib/swarm_memory/core/metadata_extractor.rb +68 -0
- data/lib/swarm_memory/core/path_normalizer.rb +75 -0
- data/lib/swarm_memory/core/semantic_index.rb +244 -0
- data/lib/swarm_memory/core/storage.rb +288 -0
- data/lib/swarm_memory/core/storage_read_tracker.rb +63 -0
- data/lib/swarm_memory/dsl/builder_extension.rb +40 -0
- data/lib/swarm_memory/dsl/memory_config.rb +113 -0
- data/lib/swarm_memory/embeddings/embedder.rb +36 -0
- data/lib/swarm_memory/embeddings/informers_embedder.rb +152 -0
- data/lib/swarm_memory/errors.rb +21 -0
- data/lib/swarm_memory/integration/cli_registration.rb +30 -0
- data/lib/swarm_memory/integration/configuration.rb +43 -0
- data/lib/swarm_memory/integration/registration.rb +31 -0
- data/lib/swarm_memory/integration/sdk_plugin.rb +531 -0
- data/lib/swarm_memory/optimization/analyzer.rb +244 -0
- data/lib/swarm_memory/optimization/defragmenter.rb +863 -0
- data/lib/swarm_memory/prompts/memory.md.erb +109 -0
- data/lib/swarm_memory/prompts/memory_assistant.md.erb +181 -0
- data/lib/swarm_memory/prompts/memory_researcher.md.erb +281 -0
- data/lib/swarm_memory/prompts/memory_retrieval.md.erb +78 -0
- data/lib/swarm_memory/search/semantic_search.rb +112 -0
- data/lib/swarm_memory/search/text_search.rb +42 -0
- data/lib/swarm_memory/search/text_similarity.rb +80 -0
- data/lib/swarm_memory/skills/meta/deep-learning.md +101 -0
- data/lib/swarm_memory/skills/meta/deep-learning.yml +14 -0
- data/lib/swarm_memory/tools/load_skill.rb +313 -0
- data/lib/swarm_memory/tools/memory_defrag.rb +382 -0
- data/lib/swarm_memory/tools/memory_delete.rb +99 -0
- data/lib/swarm_memory/tools/memory_edit.rb +185 -0
- data/lib/swarm_memory/tools/memory_glob.rb +160 -0
- data/lib/swarm_memory/tools/memory_grep.rb +247 -0
- data/lib/swarm_memory/tools/memory_multi_edit.rb +281 -0
- data/lib/swarm_memory/tools/memory_read.rb +123 -0
- data/lib/swarm_memory/tools/memory_write.rb +231 -0
- data/lib/swarm_memory/utils.rb +50 -0
- data/lib/swarm_memory/version.rb +5 -0
- data/lib/swarm_memory.rb +166 -0
- data/lib/swarm_sdk/agent/RETRY_LOGIC.md +127 -0
- data/lib/swarm_sdk/agent/builder.rb +461 -0
- data/lib/swarm_sdk/agent/chat/context_tracker.rb +314 -0
- data/lib/swarm_sdk/agent/chat/hook_integration.rb +372 -0
- data/lib/swarm_sdk/agent/chat/logging_helpers.rb +116 -0
- data/lib/swarm_sdk/agent/chat/system_reminder_injector.rb +152 -0
- data/lib/swarm_sdk/agent/chat.rb +1159 -0
- data/lib/swarm_sdk/agent/context.rb +112 -0
- data/lib/swarm_sdk/agent/context_manager.rb +309 -0
- data/lib/swarm_sdk/agent/definition.rb +556 -0
- data/lib/swarm_sdk/claude_code_agent_adapter.rb +205 -0
- data/lib/swarm_sdk/configuration.rb +296 -0
- data/lib/swarm_sdk/context_compactor/metrics.rb +147 -0
- data/lib/swarm_sdk/context_compactor/token_counter.rb +106 -0
- data/lib/swarm_sdk/context_compactor.rb +340 -0
- data/lib/swarm_sdk/hooks/adapter.rb +359 -0
- data/lib/swarm_sdk/hooks/context.rb +197 -0
- data/lib/swarm_sdk/hooks/definition.rb +80 -0
- data/lib/swarm_sdk/hooks/error.rb +29 -0
- data/lib/swarm_sdk/hooks/executor.rb +146 -0
- data/lib/swarm_sdk/hooks/registry.rb +147 -0
- data/lib/swarm_sdk/hooks/result.rb +150 -0
- data/lib/swarm_sdk/hooks/shell_executor.rb +254 -0
- data/lib/swarm_sdk/hooks/tool_call.rb +35 -0
- data/lib/swarm_sdk/hooks/tool_result.rb +62 -0
- data/lib/swarm_sdk/log_collector.rb +51 -0
- data/lib/swarm_sdk/log_stream.rb +69 -0
- data/lib/swarm_sdk/markdown_parser.rb +75 -0
- data/lib/swarm_sdk/model_aliases.json +5 -0
- data/lib/swarm_sdk/models.json +1 -0
- data/lib/swarm_sdk/models.rb +120 -0
- data/lib/swarm_sdk/node/agent_config.rb +49 -0
- data/lib/swarm_sdk/node/builder.rb +439 -0
- data/lib/swarm_sdk/node/transformer_executor.rb +248 -0
- data/lib/swarm_sdk/node_context.rb +170 -0
- data/lib/swarm_sdk/node_orchestrator.rb +384 -0
- data/lib/swarm_sdk/permissions/config.rb +239 -0
- data/lib/swarm_sdk/permissions/error_formatter.rb +121 -0
- data/lib/swarm_sdk/permissions/path_matcher.rb +35 -0
- data/lib/swarm_sdk/permissions/validator.rb +173 -0
- data/lib/swarm_sdk/permissions_builder.rb +122 -0
- data/lib/swarm_sdk/plugin.rb +147 -0
- data/lib/swarm_sdk/plugin_registry.rb +101 -0
- data/lib/swarm_sdk/prompts/base_system_prompt.md.erb +243 -0
- data/lib/swarm_sdk/providers/openai_with_responses.rb +582 -0
- data/lib/swarm_sdk/result.rb +97 -0
- data/lib/swarm_sdk/swarm/agent_initializer.rb +334 -0
- data/lib/swarm_sdk/swarm/all_agents_builder.rb +140 -0
- data/lib/swarm_sdk/swarm/builder.rb +586 -0
- data/lib/swarm_sdk/swarm/mcp_configurator.rb +151 -0
- data/lib/swarm_sdk/swarm/tool_configurator.rb +419 -0
- data/lib/swarm_sdk/swarm.rb +982 -0
- data/lib/swarm_sdk/tools/bash.rb +274 -0
- data/lib/swarm_sdk/tools/clock.rb +44 -0
- data/lib/swarm_sdk/tools/delegate.rb +164 -0
- data/lib/swarm_sdk/tools/document_converters/base_converter.rb +83 -0
- data/lib/swarm_sdk/tools/document_converters/docx_converter.rb +99 -0
- data/lib/swarm_sdk/tools/document_converters/html_converter.rb +101 -0
- data/lib/swarm_sdk/tools/document_converters/pdf_converter.rb +78 -0
- data/lib/swarm_sdk/tools/document_converters/xlsx_converter.rb +194 -0
- data/lib/swarm_sdk/tools/edit.rb +150 -0
- data/lib/swarm_sdk/tools/glob.rb +158 -0
- data/lib/swarm_sdk/tools/grep.rb +228 -0
- data/lib/swarm_sdk/tools/image_extractors/docx_image_extractor.rb +43 -0
- data/lib/swarm_sdk/tools/image_extractors/pdf_image_extractor.rb +163 -0
- data/lib/swarm_sdk/tools/image_formats/tiff_builder.rb +65 -0
- data/lib/swarm_sdk/tools/multi_edit.rb +232 -0
- data/lib/swarm_sdk/tools/path_resolver.rb +43 -0
- data/lib/swarm_sdk/tools/read.rb +251 -0
- data/lib/swarm_sdk/tools/registry.rb +93 -0
- data/lib/swarm_sdk/tools/scratchpad/scratchpad_list.rb +96 -0
- data/lib/swarm_sdk/tools/scratchpad/scratchpad_read.rb +76 -0
- data/lib/swarm_sdk/tools/scratchpad/scratchpad_write.rb +91 -0
- data/lib/swarm_sdk/tools/stores/read_tracker.rb +61 -0
- data/lib/swarm_sdk/tools/stores/scratchpad_storage.rb +224 -0
- data/lib/swarm_sdk/tools/stores/storage.rb +148 -0
- data/lib/swarm_sdk/tools/stores/todo_manager.rb +65 -0
- data/lib/swarm_sdk/tools/think.rb +95 -0
- data/lib/swarm_sdk/tools/todo_write.rb +216 -0
- data/lib/swarm_sdk/tools/web_fetch.rb +261 -0
- data/lib/swarm_sdk/tools/write.rb +117 -0
- data/lib/swarm_sdk/utils.rb +50 -0
- data/lib/swarm_sdk/version.rb +5 -0
- data/lib/swarm_sdk.rb +157 -0
- data/llm.v2.txt +13407 -0
- data/rubocop/cop/security/no_reflection_methods.rb +47 -0
- data/rubocop/cop/security/no_ruby_llm_logger.rb +32 -0
- data/swarm_cli.gemspec +57 -0
- data/swarm_memory.gemspec +28 -0
- data/swarm_sdk.gemspec +41 -0
- data/team.yml +1 -1
- data/team_full.yml +1875 -0
- data/{team_v2.yml → team_sdk.yml} +121 -52
- metadata +247 -4
- data/EXAMPLES.md +0 -164
|
@@ -0,0 +1,599 @@
|
|
|
1
|
+
# SwarmMemory Guide
|
|
2
|
+
|
|
3
|
+
Complete guide to using SwarmMemory for persistent agent knowledge storage with semantic search.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
**SwarmMemory** is a separate gem that provides persistent memory storage for SwarmSDK agents. It enables agents to:
|
|
10
|
+
|
|
11
|
+
- Store and retrieve knowledge across sessions
|
|
12
|
+
- Search memories semantically (hybrid: embeddings + keywords)
|
|
13
|
+
- Build skills that adapt agent toolsets dynamically
|
|
14
|
+
- Automatically discover relevant knowledge on every user message
|
|
15
|
+
- Build knowledge graphs with relationship discovery
|
|
16
|
+
|
|
17
|
+
**Key Features:**
|
|
18
|
+
- 🧠 Persistent storage with semantic search
|
|
19
|
+
- 🔍 Hybrid search (50% semantic + 50% keyword matching)
|
|
20
|
+
- 🎯 Automatic skill discovery (78% match accuracy)
|
|
21
|
+
- 📚 4 memory categories (concept, fact, skill, experience)
|
|
22
|
+
- 🔗 Automatic relationship discovery and linking
|
|
23
|
+
- 🚀 Fast local embeddings via Informers (ONNX)
|
|
24
|
+
- 🔌 Plugin-based integration (zero coupling with SDK)
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Installation
|
|
29
|
+
|
|
30
|
+
SwarmMemory is a **separate gem** that must be installed alongside SwarmSDK.
|
|
31
|
+
|
|
32
|
+
### Gemfile
|
|
33
|
+
|
|
34
|
+
```ruby
|
|
35
|
+
gem 'swarm_sdk'
|
|
36
|
+
gem 'swarm_memory' # Separate gem
|
|
37
|
+
gem 'informers' # Required for semantic search
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Install
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
bundle install
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Load Order
|
|
47
|
+
|
|
48
|
+
```ruby
|
|
49
|
+
require 'swarm_sdk'
|
|
50
|
+
require 'swarm_memory' # Auto-registers plugin with SwarmSDK
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**Important:** SwarmMemory must be required AFTER SwarmSDK for auto-registration to work.
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Quick Start
|
|
58
|
+
|
|
59
|
+
### Ruby DSL
|
|
60
|
+
|
|
61
|
+
```ruby
|
|
62
|
+
require 'swarm_sdk'
|
|
63
|
+
require 'swarm_memory'
|
|
64
|
+
|
|
65
|
+
swarm = SwarmSDK.build do
|
|
66
|
+
name "Learning Assistant"
|
|
67
|
+
lead :assistant
|
|
68
|
+
|
|
69
|
+
agent :assistant do
|
|
70
|
+
model "claude-sonnet-4"
|
|
71
|
+
description "Learning assistant with persistent memory"
|
|
72
|
+
|
|
73
|
+
# Enable memory storage
|
|
74
|
+
memory do
|
|
75
|
+
directory ".swarm/assistant-memory"
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Memory tools are automatically added
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
result = swarm.execute("Learn about Ruby metaprogramming and remember it")
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### YAML Configuration
|
|
86
|
+
|
|
87
|
+
```yaml
|
|
88
|
+
version: 2
|
|
89
|
+
swarm:
|
|
90
|
+
name: Learning Assistant
|
|
91
|
+
lead: assistant
|
|
92
|
+
agents:
|
|
93
|
+
assistant:
|
|
94
|
+
model: claude-sonnet-4
|
|
95
|
+
description: Learning assistant with persistent memory
|
|
96
|
+
memory:
|
|
97
|
+
directory: .swarm/assistant-memory
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## How It Works
|
|
103
|
+
|
|
104
|
+
### Plugin Architecture
|
|
105
|
+
|
|
106
|
+
SwarmMemory integrates with SwarmSDK via the **plugin system**:
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
require 'swarm_memory'
|
|
110
|
+
↓
|
|
111
|
+
Auto-registration: SwarmMemory::Integration::SDKPlugin
|
|
112
|
+
↓
|
|
113
|
+
SwarmSDK::PluginRegistry.register(plugin)
|
|
114
|
+
↓
|
|
115
|
+
Plugin provides:
|
|
116
|
+
- 8 memory tools (MemoryWrite, MemoryRead, etc.)
|
|
117
|
+
- Memory storage (FilesystemAdapter + Embeddings)
|
|
118
|
+
- System prompt contributions
|
|
119
|
+
- Automatic skill discovery on user messages
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
**Zero Coupling:** SwarmSDK has no knowledge of SwarmMemory. It works standalone.
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Memory Structure
|
|
127
|
+
|
|
128
|
+
### 4 Fixed Categories
|
|
129
|
+
|
|
130
|
+
Memory has **EXACTLY 4** top-level categories. These are **FIXED** - agents cannot create new ones:
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
memory/
|
|
134
|
+
├── concept/ # Abstract ideas and mental models
|
|
135
|
+
│ └── {domain}/{name}.md
|
|
136
|
+
├── fact/ # Concrete, verifiable information
|
|
137
|
+
│ └── {subfolder}/{name}.md
|
|
138
|
+
├── skill/ # Step-by-step procedures (how-to)
|
|
139
|
+
│ └── {domain}/{name}.md
|
|
140
|
+
└── experience/ # Lessons learned from outcomes
|
|
141
|
+
└── {name}.md
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**Examples:**
|
|
145
|
+
- ✅ `concept/ruby/classes.md` - Understanding Ruby classes
|
|
146
|
+
- ✅ `fact/people/john.md` - Information about John
|
|
147
|
+
- ✅ `skill/debugging/api-errors.md` - How to debug API errors
|
|
148
|
+
- ✅ `experience/fixed-cors-bug.md` - Lesson from fixing a bug
|
|
149
|
+
|
|
150
|
+
**Invalid:**
|
|
151
|
+
- ❌ `documentation/api.md` - No "documentation/" category exists
|
|
152
|
+
- ❌ `reference/guide.md` - No "reference/" category exists
|
|
153
|
+
- ❌ `tutorial/intro.md` - No "tutorial/" category exists
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## Memory Tools
|
|
158
|
+
|
|
159
|
+
SwarmMemory provides 9 tools automatically added to agents with memory configured:
|
|
160
|
+
|
|
161
|
+
### Storage Tools
|
|
162
|
+
|
|
163
|
+
**MemoryWrite** - Store content with structured metadata
|
|
164
|
+
```ruby
|
|
165
|
+
MemoryWrite(
|
|
166
|
+
file_path: "concept/ruby/classes.md",
|
|
167
|
+
content: "# Ruby Classes\n\nClasses are blueprints...",
|
|
168
|
+
title: "Ruby Classes",
|
|
169
|
+
type: "concept",
|
|
170
|
+
confidence: "high",
|
|
171
|
+
tags: ["ruby", "oop", "classes"],
|
|
172
|
+
related: [],
|
|
173
|
+
domain: "programming/ruby",
|
|
174
|
+
source: "documentation"
|
|
175
|
+
)
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
**MemoryRead** - Retrieve stored content
|
|
179
|
+
```ruby
|
|
180
|
+
MemoryRead(file_path: "concept/ruby/classes.md")
|
|
181
|
+
# Returns JSON: {content: "...", metadata: {...}}
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
**MemoryEdit** - Exact string replacement
|
|
185
|
+
```ruby
|
|
186
|
+
MemoryEdit(
|
|
187
|
+
file_path: "concept/ruby/classes.md",
|
|
188
|
+
old_string: "Classes are blueprints",
|
|
189
|
+
new_string: "Classes are templates"
|
|
190
|
+
)
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
**MemoryMultiEdit** - Multiple edits in one operation
|
|
194
|
+
```ruby
|
|
195
|
+
MemoryMultiEdit(
|
|
196
|
+
file_path: "concept/ruby/classes.md",
|
|
197
|
+
edits_json: '[
|
|
198
|
+
{"old_string": "foo", "new_string": "bar"},
|
|
199
|
+
{"old_string": "baz", "new_string": "qux"}
|
|
200
|
+
]'
|
|
201
|
+
)
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
**MemoryDelete** - Remove entries
|
|
205
|
+
```ruby
|
|
206
|
+
MemoryDelete(file_path: "concept/old-api/deprecated.md")
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### Search Tools
|
|
210
|
+
|
|
211
|
+
**MemoryGlob** - Search by path pattern
|
|
212
|
+
```ruby
|
|
213
|
+
MemoryGlob(pattern: "skill/**") # All skills
|
|
214
|
+
MemoryGlob(pattern: "concept/ruby/*") # Ruby concepts
|
|
215
|
+
MemoryGlob(pattern: "fact/people/*.md") # All people facts
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
**MemoryGrep** - Search by content pattern
|
|
219
|
+
```ruby
|
|
220
|
+
MemoryGrep(pattern: "authentication")
|
|
221
|
+
MemoryGrep(pattern: "api.*error", output_mode: "content")
|
|
222
|
+
MemoryGrep(pattern: "TODO", path: "concept/") # Search only concepts
|
|
223
|
+
MemoryGrep(pattern: "endpoint", path: "fact/api-design") # Search specific subdirectory
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### Optimization Tools
|
|
227
|
+
|
|
228
|
+
**MemoryDefrag** - Analyze and optimize memory
|
|
229
|
+
```ruby
|
|
230
|
+
# Analyze health
|
|
231
|
+
MemoryDefrag(action: "analyze")
|
|
232
|
+
|
|
233
|
+
# Find duplicates
|
|
234
|
+
MemoryDefrag(action: "find_duplicates", similarity_threshold: 0.85)
|
|
235
|
+
|
|
236
|
+
# Find related entries (60-85% similarity)
|
|
237
|
+
MemoryDefrag(action: "find_related")
|
|
238
|
+
|
|
239
|
+
# Create bidirectional links
|
|
240
|
+
MemoryDefrag(action: "link_related", dry_run: false)
|
|
241
|
+
|
|
242
|
+
# Merge duplicates
|
|
243
|
+
MemoryDefrag(action: "merge_duplicates", dry_run: false)
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### Skill Loading
|
|
247
|
+
|
|
248
|
+
**LoadSkill** - Load a skill and adapt tools
|
|
249
|
+
```ruby
|
|
250
|
+
LoadSkill(file_path: "skill/debugging/api-errors.md")
|
|
251
|
+
# - Swaps mutable tools to match skill requirements
|
|
252
|
+
# - Returns step-by-step instructions
|
|
253
|
+
# - Applies tool permissions from skill
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## Semantic Search & Discovery
|
|
259
|
+
|
|
260
|
+
### Automatic Skill Discovery
|
|
261
|
+
|
|
262
|
+
**On EVERY user message**, SwarmMemory:
|
|
263
|
+
|
|
264
|
+
1. Extracts keywords from user prompt
|
|
265
|
+
2. Performs hybrid search (semantic + keyword)
|
|
266
|
+
3. Finds skills with ≥65% match
|
|
267
|
+
4. Injects system reminder with LoadSkill instructions
|
|
268
|
+
|
|
269
|
+
**Example:**
|
|
270
|
+
|
|
271
|
+
User: "Create a swarm using the Ruby DSL"
|
|
272
|
+
|
|
273
|
+
Agent sees:
|
|
274
|
+
```
|
|
275
|
+
<system-reminder>
|
|
276
|
+
🎯 Found 1 skill(s) in memory that may be relevant:
|
|
277
|
+
|
|
278
|
+
**Create a Swarm with SwarmSDK DSL** (78% match)
|
|
279
|
+
Path: `skill/ruby/create-swarm-dsl.md`
|
|
280
|
+
To use: `LoadSkill(file_path: "skill/ruby/create-swarm-dsl.md")`
|
|
281
|
+
|
|
282
|
+
**If a skill matches your task:** Load it to get step-by-step instructions.
|
|
283
|
+
</system-reminder>
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### Dual Discovery
|
|
287
|
+
|
|
288
|
+
Searches **two categories in parallel**:
|
|
289
|
+
|
|
290
|
+
1. **Skills** (type="skill") - For loadable procedures
|
|
291
|
+
2. **Memories** (type="concept","fact","experience") - For context
|
|
292
|
+
|
|
293
|
+
**Result:** Both skills AND relevant background knowledge are suggested.
|
|
294
|
+
|
|
295
|
+
### Hybrid Scoring
|
|
296
|
+
|
|
297
|
+
Combines semantic similarity with keyword matching:
|
|
298
|
+
|
|
299
|
+
```
|
|
300
|
+
Query: "Create a swarm using Ruby DSL"
|
|
301
|
+
Skill Tags: ["swarmsdk", "ruby", "dsl", "swarm", "create"]
|
|
302
|
+
|
|
303
|
+
Semantic Score: 37.5% (embeddings)
|
|
304
|
+
Keyword Score: 100% (5/5 tags match)
|
|
305
|
+
Hybrid Score: (0.5 × 0.375) + (0.5 × 1.0) = 69% ✅ Above 65% threshold!
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
**Accuracy:** 78% average match for relevant skills (vs 43% with pure semantic)
|
|
309
|
+
|
|
310
|
+
---
|
|
311
|
+
|
|
312
|
+
## Storage Architecture
|
|
313
|
+
|
|
314
|
+
### Filesystem Adapter
|
|
315
|
+
|
|
316
|
+
SwarmMemory uses a **filesystem-based storage adapter** by default:
|
|
317
|
+
|
|
318
|
+
```
|
|
319
|
+
.swarm/assistant-memory/
|
|
320
|
+
├── concept/
|
|
321
|
+
│ └── ruby/
|
|
322
|
+
│ ├── classes.md # Content
|
|
323
|
+
│ ├── classes.yml # Metadata
|
|
324
|
+
│ └── classes.emb # Embedding (binary)
|
|
325
|
+
├── skill/
|
|
326
|
+
│ └── debugging/
|
|
327
|
+
│ ├── api.md
|
|
328
|
+
│ ├── api.yml
|
|
329
|
+
│ └── api.emb
|
|
330
|
+
├── fact/
|
|
331
|
+
├── experience/
|
|
332
|
+
└── .lock # Cross-process lock file
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
**Hierarchical Storage:**
|
|
336
|
+
- Logical: `concept/ruby/classes.md`
|
|
337
|
+
- On Disk: `concept/ruby/classes.md`
|
|
338
|
+
- Storage matches logical paths exactly - no flattening
|
|
339
|
+
- Native directory structure for intuitive browsing
|
|
340
|
+
- Efficient glob operations with Dir.glob
|
|
341
|
+
|
|
342
|
+
**Three Files Per Entry:**
|
|
343
|
+
- `.md` - Markdown content
|
|
344
|
+
- `.yml` - Metadata (title, tags, type, etc.)
|
|
345
|
+
- `.emb` - Embedding vector (384-dim, binary)
|
|
346
|
+
|
|
347
|
+
### Embeddings
|
|
348
|
+
|
|
349
|
+
**Model:** `sentence-transformers/all-MiniLM-L6-v2` (via Informers)
|
|
350
|
+
- Size: ~90MB (unquantized), ~22MB (quantized)
|
|
351
|
+
- Dimensions: 384
|
|
352
|
+
- Speed: ~10-50ms per embedding
|
|
353
|
+
- Local: No API calls required
|
|
354
|
+
|
|
355
|
+
**What Gets Embedded:**
|
|
356
|
+
```
|
|
357
|
+
Title: Create a Swarm with SwarmSDK DSL
|
|
358
|
+
Tags: swarmsdk, ruby, dsl, swarm, agent, create
|
|
359
|
+
Domain: programming/ruby
|
|
360
|
+
Summary: This skill teaches you how to build swarms programmatically...
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
**NOT embedded:** Full content (optimized for search vs encyclopedic)
|
|
364
|
+
|
|
365
|
+
---
|
|
366
|
+
|
|
367
|
+
## Configuration
|
|
368
|
+
|
|
369
|
+
### Memory Block
|
|
370
|
+
|
|
371
|
+
```ruby
|
|
372
|
+
agent :assistant do
|
|
373
|
+
memory do
|
|
374
|
+
directory ".swarm/assistant-memory" # Required
|
|
375
|
+
# adapter :filesystem (optional, default)
|
|
376
|
+
end
|
|
377
|
+
end
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
### What Happens
|
|
381
|
+
|
|
382
|
+
When memory is configured:
|
|
383
|
+
|
|
384
|
+
1. **Storage Created**: `FilesystemAdapter` + `InformersEmbedder`
|
|
385
|
+
2. **Tools Registered**: 8 memory tools + LoadSkill
|
|
386
|
+
3. **Prompt Injected**: Memory system guidance
|
|
387
|
+
4. **Discovery Enabled**: Semantic search on user messages
|
|
388
|
+
5. **Embeddings Generated**: For all stored content
|
|
389
|
+
|
|
390
|
+
---
|
|
391
|
+
|
|
392
|
+
## Relationship Discovery
|
|
393
|
+
|
|
394
|
+
### Find Related Entries
|
|
395
|
+
|
|
396
|
+
Discover semantically related entries:
|
|
397
|
+
|
|
398
|
+
```ruby
|
|
399
|
+
MemoryDefrag(action: "find_related")
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
**Output:**
|
|
403
|
+
```
|
|
404
|
+
# Related Entries (3 pairs)
|
|
405
|
+
|
|
406
|
+
## Pair 1: 72% similar
|
|
407
|
+
- memory://concept/ruby/classes.md (concept)
|
|
408
|
+
"Ruby Classes"
|
|
409
|
+
- memory://concept/ruby/modules.md (concept)
|
|
410
|
+
"Ruby Modules"
|
|
411
|
+
|
|
412
|
+
**Suggestion:** Add bidirectional links to cross-reference these related entries
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
### Auto-Link Related Entries
|
|
416
|
+
|
|
417
|
+
Create bidirectional cross-references:
|
|
418
|
+
|
|
419
|
+
```ruby
|
|
420
|
+
# Preview first
|
|
421
|
+
MemoryDefrag(action: "link_related", dry_run: true)
|
|
422
|
+
|
|
423
|
+
# Execute
|
|
424
|
+
MemoryDefrag(action: "link_related", dry_run: false)
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
**Result:** Updates `related` metadata arrays to cross-reference entries.
|
|
428
|
+
|
|
429
|
+
### CLI Shortcut
|
|
430
|
+
|
|
431
|
+
```bash
|
|
432
|
+
/defrag # Runs find_related then link_related automatically
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
---
|
|
436
|
+
|
|
437
|
+
## Advanced Topics
|
|
438
|
+
|
|
439
|
+
### Custom Embeddings
|
|
440
|
+
|
|
441
|
+
Future: Swap embedding models
|
|
442
|
+
|
|
443
|
+
```ruby
|
|
444
|
+
# Not yet implemented - future API
|
|
445
|
+
memory do
|
|
446
|
+
directory ".swarm/memory"
|
|
447
|
+
embedder :informers, model: "bge-small-en-v1.5"
|
|
448
|
+
end
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
### Vector Database Adapters
|
|
452
|
+
|
|
453
|
+
Future: Use vector DB instead of filesystem
|
|
454
|
+
|
|
455
|
+
```ruby
|
|
456
|
+
# Not yet implemented - future API
|
|
457
|
+
memory do
|
|
458
|
+
adapter :qdrant
|
|
459
|
+
url "http://localhost:6333"
|
|
460
|
+
collection "agent_memory"
|
|
461
|
+
end
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
**Plugin architecture makes this possible** - adapters just need to implement `Adapters::Base` interface.
|
|
465
|
+
|
|
466
|
+
---
|
|
467
|
+
|
|
468
|
+
## Best Practices
|
|
469
|
+
|
|
470
|
+
### Memory-First Protocol
|
|
471
|
+
|
|
472
|
+
**ALWAYS search memory before starting work:**
|
|
473
|
+
|
|
474
|
+
```ruby
|
|
475
|
+
# 1. Search for skills
|
|
476
|
+
MemoryGrep(pattern: "keyword1|keyword2|keyword3")
|
|
477
|
+
|
|
478
|
+
# 2. Load relevant skill if found
|
|
479
|
+
LoadSkill(file_path: "skill/domain/task.md")
|
|
480
|
+
|
|
481
|
+
# 3. THEN start working
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
### Comprehensive Tags
|
|
485
|
+
|
|
486
|
+
For skills especially, tags are your search index:
|
|
487
|
+
|
|
488
|
+
```ruby
|
|
489
|
+
# ❌ Bad: Minimal tags
|
|
490
|
+
tags: ["ruby", "debug"]
|
|
491
|
+
|
|
492
|
+
# ✅ Good: Comprehensive tags
|
|
493
|
+
tags: ["ruby", "debugging", "api", "errors", "http", "rest", "trace", "network", "troubleshooting"]
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
**Think:** "What would I search for in 6 months?"
|
|
497
|
+
|
|
498
|
+
### Knowledge Graph
|
|
499
|
+
|
|
500
|
+
Build relationships:
|
|
501
|
+
|
|
502
|
+
```ruby
|
|
503
|
+
# After creating multiple related entries
|
|
504
|
+
MemoryDefrag(action: "link_related", dry_run: false)
|
|
505
|
+
|
|
506
|
+
# Entries now cross-reference each other
|
|
507
|
+
MemoryRead(file_path: "concept/ruby/classes.md")
|
|
508
|
+
# metadata.related: ["memory://concept/ruby/modules.md", ...]
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
### Regular Maintenance
|
|
512
|
+
|
|
513
|
+
```ruby
|
|
514
|
+
# Every 15-20 entries
|
|
515
|
+
MemoryDefrag(action: "analyze")
|
|
516
|
+
|
|
517
|
+
# Every 50 entries
|
|
518
|
+
MemoryDefrag(action: "find_duplicates")
|
|
519
|
+
MemoryDefrag(action: "find_related")
|
|
520
|
+
|
|
521
|
+
# Every 100 entries
|
|
522
|
+
MemoryDefrag(action: "full", dry_run: true)
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
---
|
|
526
|
+
|
|
527
|
+
## Performance
|
|
528
|
+
|
|
529
|
+
### Semantic Search
|
|
530
|
+
|
|
531
|
+
- Query embedding: ~10-50ms
|
|
532
|
+
- Search 100 entries: ~10-100ms
|
|
533
|
+
- Total overhead: <150ms per user message
|
|
534
|
+
|
|
535
|
+
### Storage
|
|
536
|
+
|
|
537
|
+
- Write with embedding: ~50-100ms
|
|
538
|
+
- Read: <5ms (in-memory index)
|
|
539
|
+
- Glob/Grep: <50ms (filesystem scan)
|
|
540
|
+
|
|
541
|
+
### Limits
|
|
542
|
+
|
|
543
|
+
- **Max entry size:** 10MB per entry
|
|
544
|
+
- **Max total size:** 500MB per agent
|
|
545
|
+
- **Max entries:** ~5,000 entries (practical limit)
|
|
546
|
+
|
|
547
|
+
---
|
|
548
|
+
|
|
549
|
+
## Troubleshooting
|
|
550
|
+
|
|
551
|
+
### Embeddings Not Generated
|
|
552
|
+
|
|
553
|
+
**Symptom:** No `.emb` files, semantic search returns 0 results
|
|
554
|
+
|
|
555
|
+
**Cause:** Informers gem not installed or embedder not configured
|
|
556
|
+
|
|
557
|
+
**Fix:**
|
|
558
|
+
```bash
|
|
559
|
+
gem install informers
|
|
560
|
+
# Restart swarm - embeddings will be generated on next MemoryWrite
|
|
561
|
+
```
|
|
562
|
+
|
|
563
|
+
### Low Similarity Scores
|
|
564
|
+
|
|
565
|
+
**Symptom:** Skill has perfect tags but only 43% similarity
|
|
566
|
+
|
|
567
|
+
**Cause:** Using old embeddings (before improved embedding logic)
|
|
568
|
+
|
|
569
|
+
**Fix:**
|
|
570
|
+
```ruby
|
|
571
|
+
# Delete and recreate skill
|
|
572
|
+
MemoryDelete(file_path: "skill/old-skill.md")
|
|
573
|
+
# Then recreate with MemoryWrite - will use new embedding logic
|
|
574
|
+
```
|
|
575
|
+
|
|
576
|
+
### Memory Not Persisting
|
|
577
|
+
|
|
578
|
+
**Symptom:** Memory entries disappear after restart
|
|
579
|
+
|
|
580
|
+
**Cause:** Directory not configured or permissions issue
|
|
581
|
+
|
|
582
|
+
**Fix:**
|
|
583
|
+
```ruby
|
|
584
|
+
# Check directory in configuration
|
|
585
|
+
agent :name do
|
|
586
|
+
memory do
|
|
587
|
+
directory ".swarm/memory" # Must be writable
|
|
588
|
+
end
|
|
589
|
+
end
|
|
590
|
+
```
|
|
591
|
+
|
|
592
|
+
---
|
|
593
|
+
|
|
594
|
+
## See Also
|
|
595
|
+
|
|
596
|
+
- **Plugin System:** `docs/v2/guides/plugins.md` - How SwarmMemory integrates
|
|
597
|
+
- **Custom Adapters:** `docs/v2/guides/memory-adapters.md` - Build your own adapter
|
|
598
|
+
- **API Reference:** `docs/v2/reference/ruby-dsl.md#memory-configuration`
|
|
599
|
+
- **Changelog:** `docs/v2/CHANGELOG.swarm_memory.md`
|