claude_swarm 1.0.1 → 1.0.4

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 (267) hide show
  1. checksums.yaml +4 -4
  2. data/.claude/commands/release.md +1 -1
  3. data/.claude/hooks/lint-code-files.rb +65 -0
  4. data/.rubocop.yml +22 -2
  5. data/CHANGELOG.md +14 -1
  6. data/CLAUDE.md +1 -1
  7. data/CONTRIBUTING.md +69 -0
  8. data/README.md +27 -2
  9. data/Rakefile +71 -3
  10. data/analyze_coverage.rb +94 -0
  11. data/docs/v2/CHANGELOG.swarm_cli.md +43 -0
  12. data/docs/v2/CHANGELOG.swarm_memory.md +379 -0
  13. data/docs/v2/CHANGELOG.swarm_sdk.md +362 -0
  14. data/docs/v2/README.md +308 -0
  15. data/docs/v2/guides/claude-code-agents.md +262 -0
  16. data/docs/v2/guides/complete-tutorial.md +3088 -0
  17. data/docs/v2/guides/getting-started.md +1456 -0
  18. data/docs/v2/guides/memory-adapters.md +998 -0
  19. data/docs/v2/guides/plugins.md +816 -0
  20. data/docs/v2/guides/quick-start-cli.md +1745 -0
  21. data/docs/v2/guides/rails-integration.md +1902 -0
  22. data/docs/v2/guides/swarm-memory.md +599 -0
  23. data/docs/v2/reference/cli.md +729 -0
  24. data/docs/v2/reference/ruby-dsl.md +2154 -0
  25. data/docs/v2/reference/yaml.md +1835 -0
  26. data/docs-team-swarm.yml +2222 -0
  27. data/examples/learning-assistant/assistant.md +7 -0
  28. data/examples/learning-assistant/example-memories/concept-example.md +90 -0
  29. data/examples/learning-assistant/example-memories/experience-example.md +66 -0
  30. data/examples/learning-assistant/example-memories/fact-example.md +76 -0
  31. data/examples/learning-assistant/example-memories/memory-index.md +78 -0
  32. data/examples/learning-assistant/example-memories/skill-example.md +168 -0
  33. data/examples/learning-assistant/learning_assistant.rb +34 -0
  34. data/examples/learning-assistant/learning_assistant.yml +20 -0
  35. data/examples/v2/dsl/01_basic.rb +44 -0
  36. data/examples/v2/dsl/02_core_parameters.rb +59 -0
  37. data/examples/v2/dsl/03_capabilities.rb +71 -0
  38. data/examples/v2/dsl/04_llm_parameters.rb +56 -0
  39. data/examples/v2/dsl/05_advanced_flags.rb +73 -0
  40. data/examples/v2/dsl/06_permissions.rb +80 -0
  41. data/examples/v2/dsl/07_mcp_server.rb +62 -0
  42. data/examples/v2/dsl/08_swarm_hooks.rb +53 -0
  43. data/examples/v2/dsl/09_agent_hooks.rb +67 -0
  44. data/examples/v2/dsl/10_all_agents_hooks.rb +67 -0
  45. data/examples/v2/dsl/11_delegation.rb +60 -0
  46. data/examples/v2/dsl/12_complete_integration.rb +137 -0
  47. data/examples/v2/file_tools_swarm.yml +102 -0
  48. data/examples/v2/hooks/01_basic_hooks.rb +133 -0
  49. data/examples/v2/hooks/02_usage_tracking.rb +201 -0
  50. data/examples/v2/hooks/03_production_monitoring.rb +429 -0
  51. data/examples/v2/hooks/agent_stop_exit_0.yml +21 -0
  52. data/examples/v2/hooks/agent_stop_exit_1.yml +21 -0
  53. data/examples/v2/hooks/agent_stop_exit_2.yml +26 -0
  54. data/examples/v2/hooks/multiple_hooks_all_pass.yml +37 -0
  55. data/examples/v2/hooks/multiple_hooks_first_fails.yml +37 -0
  56. data/examples/v2/hooks/multiple_hooks_second_fails.yml +37 -0
  57. data/examples/v2/hooks/multiple_hooks_warnings.yml +37 -0
  58. data/examples/v2/hooks/post_tool_use_exit_0.yml +24 -0
  59. data/examples/v2/hooks/post_tool_use_exit_1.yml +24 -0
  60. data/examples/v2/hooks/post_tool_use_exit_2.yml +24 -0
  61. data/examples/v2/hooks/post_tool_use_multi_matcher_exit_0.yml +26 -0
  62. data/examples/v2/hooks/post_tool_use_multi_matcher_exit_1.yml +26 -0
  63. data/examples/v2/hooks/post_tool_use_multi_matcher_exit_2.yml +26 -0
  64. data/examples/v2/hooks/pre_tool_use_exit_0.yml +24 -0
  65. data/examples/v2/hooks/pre_tool_use_exit_1.yml +24 -0
  66. data/examples/v2/hooks/pre_tool_use_exit_2.yml +24 -0
  67. data/examples/v2/hooks/pre_tool_use_multi_matcher_exit_0.yml +26 -0
  68. data/examples/v2/hooks/pre_tool_use_multi_matcher_exit_1.yml +26 -0
  69. data/examples/v2/hooks/pre_tool_use_multi_matcher_exit_2.yml +27 -0
  70. data/examples/v2/hooks/swarm_summary.sh +44 -0
  71. data/examples/v2/hooks/user_prompt_exit_0.yml +21 -0
  72. data/examples/v2/hooks/user_prompt_exit_1.yml +21 -0
  73. data/examples/v2/hooks/user_prompt_exit_2.yml +21 -0
  74. data/examples/v2/hooks/validate_bash.rb +59 -0
  75. data/examples/v2/multi_directory_permissions.yml +221 -0
  76. data/examples/v2/node_context_demo.rb +127 -0
  77. data/examples/v2/node_workflow.rb +173 -0
  78. data/examples/v2/path_resolution_demo.rb +216 -0
  79. data/examples/v2/simple-swarm-v2.rb +90 -0
  80. data/examples/v2/simple-swarm-v2.yml +62 -0
  81. data/examples/v2/swarm.yml +71 -0
  82. data/examples/v2/swarm_with_hooks.yml +61 -0
  83. data/examples/v2/swarm_with_hooks_simple.yml +25 -0
  84. data/examples/v2/think_tool_demo.rb +62 -0
  85. data/exe/swarm +6 -0
  86. data/lib/claude_swarm/claude_mcp_server.rb +0 -6
  87. data/lib/claude_swarm/cli.rb +10 -3
  88. data/lib/claude_swarm/commands/ps.rb +19 -20
  89. data/lib/claude_swarm/commands/show.rb +1 -1
  90. data/lib/claude_swarm/configuration.rb +10 -12
  91. data/lib/claude_swarm/mcp_generator.rb +10 -1
  92. data/lib/claude_swarm/orchestrator.rb +73 -49
  93. data/lib/claude_swarm/system_utils.rb +37 -11
  94. data/lib/claude_swarm/version.rb +1 -1
  95. data/lib/claude_swarm/worktree_manager.rb +1 -0
  96. data/lib/claude_swarm/yaml_loader.rb +22 -0
  97. data/lib/claude_swarm.rb +7 -2
  98. data/lib/swarm_cli/cli.rb +201 -0
  99. data/lib/swarm_cli/command_registry.rb +61 -0
  100. data/lib/swarm_cli/commands/mcp_serve.rb +130 -0
  101. data/lib/swarm_cli/commands/mcp_tools.rb +148 -0
  102. data/lib/swarm_cli/commands/migrate.rb +55 -0
  103. data/lib/swarm_cli/commands/run.rb +173 -0
  104. data/lib/swarm_cli/config_loader.rb +97 -0
  105. data/lib/swarm_cli/formatters/human_formatter.rb +711 -0
  106. data/lib/swarm_cli/formatters/json_formatter.rb +51 -0
  107. data/lib/swarm_cli/interactive_repl.rb +918 -0
  108. data/lib/swarm_cli/mcp_serve_options.rb +44 -0
  109. data/lib/swarm_cli/mcp_tools_options.rb +59 -0
  110. data/lib/swarm_cli/migrate_options.rb +54 -0
  111. data/lib/swarm_cli/migrator.rb +132 -0
  112. data/lib/swarm_cli/options.rb +151 -0
  113. data/lib/swarm_cli/ui/components/agent_badge.rb +33 -0
  114. data/lib/swarm_cli/ui/components/content_block.rb +120 -0
  115. data/lib/swarm_cli/ui/components/divider.rb +57 -0
  116. data/lib/swarm_cli/ui/components/panel.rb +62 -0
  117. data/lib/swarm_cli/ui/components/usage_stats.rb +70 -0
  118. data/lib/swarm_cli/ui/formatters/cost.rb +49 -0
  119. data/lib/swarm_cli/ui/formatters/number.rb +58 -0
  120. data/lib/swarm_cli/ui/formatters/text.rb +77 -0
  121. data/lib/swarm_cli/ui/formatters/time.rb +73 -0
  122. data/lib/swarm_cli/ui/icons.rb +59 -0
  123. data/lib/swarm_cli/ui/renderers/event_renderer.rb +188 -0
  124. data/lib/swarm_cli/ui/state/agent_color_cache.rb +45 -0
  125. data/lib/swarm_cli/ui/state/depth_tracker.rb +40 -0
  126. data/lib/swarm_cli/ui/state/spinner_manager.rb +170 -0
  127. data/lib/swarm_cli/ui/state/usage_tracker.rb +62 -0
  128. data/lib/swarm_cli/version.rb +5 -0
  129. data/lib/swarm_cli.rb +44 -0
  130. data/lib/swarm_memory/adapters/base.rb +141 -0
  131. data/lib/swarm_memory/adapters/filesystem_adapter.rb +845 -0
  132. data/lib/swarm_memory/chat_extension.rb +34 -0
  133. data/lib/swarm_memory/cli/commands.rb +306 -0
  134. data/lib/swarm_memory/core/entry.rb +37 -0
  135. data/lib/swarm_memory/core/frontmatter_parser.rb +108 -0
  136. data/lib/swarm_memory/core/metadata_extractor.rb +68 -0
  137. data/lib/swarm_memory/core/path_normalizer.rb +75 -0
  138. data/lib/swarm_memory/core/semantic_index.rb +244 -0
  139. data/lib/swarm_memory/core/storage.rb +288 -0
  140. data/lib/swarm_memory/core/storage_read_tracker.rb +63 -0
  141. data/lib/swarm_memory/dsl/builder_extension.rb +40 -0
  142. data/lib/swarm_memory/dsl/memory_config.rb +113 -0
  143. data/lib/swarm_memory/embeddings/embedder.rb +36 -0
  144. data/lib/swarm_memory/embeddings/informers_embedder.rb +152 -0
  145. data/lib/swarm_memory/errors.rb +21 -0
  146. data/lib/swarm_memory/integration/cli_registration.rb +30 -0
  147. data/lib/swarm_memory/integration/configuration.rb +43 -0
  148. data/lib/swarm_memory/integration/registration.rb +31 -0
  149. data/lib/swarm_memory/integration/sdk_plugin.rb +531 -0
  150. data/lib/swarm_memory/optimization/analyzer.rb +244 -0
  151. data/lib/swarm_memory/optimization/defragmenter.rb +863 -0
  152. data/lib/swarm_memory/prompts/memory.md.erb +109 -0
  153. data/lib/swarm_memory/prompts/memory_assistant.md.erb +181 -0
  154. data/lib/swarm_memory/prompts/memory_researcher.md.erb +281 -0
  155. data/lib/swarm_memory/prompts/memory_retrieval.md.erb +78 -0
  156. data/lib/swarm_memory/search/semantic_search.rb +112 -0
  157. data/lib/swarm_memory/search/text_search.rb +42 -0
  158. data/lib/swarm_memory/search/text_similarity.rb +80 -0
  159. data/lib/swarm_memory/skills/meta/deep-learning.md +101 -0
  160. data/lib/swarm_memory/skills/meta/deep-learning.yml +14 -0
  161. data/lib/swarm_memory/tools/load_skill.rb +313 -0
  162. data/lib/swarm_memory/tools/memory_defrag.rb +382 -0
  163. data/lib/swarm_memory/tools/memory_delete.rb +99 -0
  164. data/lib/swarm_memory/tools/memory_edit.rb +185 -0
  165. data/lib/swarm_memory/tools/memory_glob.rb +160 -0
  166. data/lib/swarm_memory/tools/memory_grep.rb +247 -0
  167. data/lib/swarm_memory/tools/memory_multi_edit.rb +281 -0
  168. data/lib/swarm_memory/tools/memory_read.rb +123 -0
  169. data/lib/swarm_memory/tools/memory_write.rb +231 -0
  170. data/lib/swarm_memory/utils.rb +50 -0
  171. data/lib/swarm_memory/version.rb +5 -0
  172. data/lib/swarm_memory.rb +166 -0
  173. data/lib/swarm_sdk/agent/RETRY_LOGIC.md +127 -0
  174. data/lib/swarm_sdk/agent/builder.rb +461 -0
  175. data/lib/swarm_sdk/agent/chat/context_tracker.rb +314 -0
  176. data/lib/swarm_sdk/agent/chat/hook_integration.rb +372 -0
  177. data/lib/swarm_sdk/agent/chat/logging_helpers.rb +116 -0
  178. data/lib/swarm_sdk/agent/chat/system_reminder_injector.rb +152 -0
  179. data/lib/swarm_sdk/agent/chat.rb +1159 -0
  180. data/lib/swarm_sdk/agent/context.rb +112 -0
  181. data/lib/swarm_sdk/agent/context_manager.rb +309 -0
  182. data/lib/swarm_sdk/agent/definition.rb +556 -0
  183. data/lib/swarm_sdk/claude_code_agent_adapter.rb +205 -0
  184. data/lib/swarm_sdk/configuration.rb +296 -0
  185. data/lib/swarm_sdk/context_compactor/metrics.rb +147 -0
  186. data/lib/swarm_sdk/context_compactor/token_counter.rb +106 -0
  187. data/lib/swarm_sdk/context_compactor.rb +340 -0
  188. data/lib/swarm_sdk/hooks/adapter.rb +359 -0
  189. data/lib/swarm_sdk/hooks/context.rb +197 -0
  190. data/lib/swarm_sdk/hooks/definition.rb +80 -0
  191. data/lib/swarm_sdk/hooks/error.rb +29 -0
  192. data/lib/swarm_sdk/hooks/executor.rb +146 -0
  193. data/lib/swarm_sdk/hooks/registry.rb +147 -0
  194. data/lib/swarm_sdk/hooks/result.rb +150 -0
  195. data/lib/swarm_sdk/hooks/shell_executor.rb +254 -0
  196. data/lib/swarm_sdk/hooks/tool_call.rb +35 -0
  197. data/lib/swarm_sdk/hooks/tool_result.rb +62 -0
  198. data/lib/swarm_sdk/log_collector.rb +51 -0
  199. data/lib/swarm_sdk/log_stream.rb +69 -0
  200. data/lib/swarm_sdk/markdown_parser.rb +75 -0
  201. data/lib/swarm_sdk/model_aliases.json +5 -0
  202. data/lib/swarm_sdk/models.json +1 -0
  203. data/lib/swarm_sdk/models.rb +120 -0
  204. data/lib/swarm_sdk/node/agent_config.rb +49 -0
  205. data/lib/swarm_sdk/node/builder.rb +439 -0
  206. data/lib/swarm_sdk/node/transformer_executor.rb +248 -0
  207. data/lib/swarm_sdk/node_context.rb +170 -0
  208. data/lib/swarm_sdk/node_orchestrator.rb +384 -0
  209. data/lib/swarm_sdk/permissions/config.rb +239 -0
  210. data/lib/swarm_sdk/permissions/error_formatter.rb +121 -0
  211. data/lib/swarm_sdk/permissions/path_matcher.rb +35 -0
  212. data/lib/swarm_sdk/permissions/validator.rb +173 -0
  213. data/lib/swarm_sdk/permissions_builder.rb +122 -0
  214. data/lib/swarm_sdk/plugin.rb +147 -0
  215. data/lib/swarm_sdk/plugin_registry.rb +101 -0
  216. data/lib/swarm_sdk/prompts/base_system_prompt.md.erb +243 -0
  217. data/lib/swarm_sdk/providers/openai_with_responses.rb +582 -0
  218. data/lib/swarm_sdk/result.rb +97 -0
  219. data/lib/swarm_sdk/swarm/agent_initializer.rb +334 -0
  220. data/lib/swarm_sdk/swarm/all_agents_builder.rb +140 -0
  221. data/lib/swarm_sdk/swarm/builder.rb +586 -0
  222. data/lib/swarm_sdk/swarm/mcp_configurator.rb +151 -0
  223. data/lib/swarm_sdk/swarm/tool_configurator.rb +419 -0
  224. data/lib/swarm_sdk/swarm.rb +982 -0
  225. data/lib/swarm_sdk/tools/bash.rb +274 -0
  226. data/lib/swarm_sdk/tools/clock.rb +44 -0
  227. data/lib/swarm_sdk/tools/delegate.rb +164 -0
  228. data/lib/swarm_sdk/tools/document_converters/base_converter.rb +83 -0
  229. data/lib/swarm_sdk/tools/document_converters/docx_converter.rb +99 -0
  230. data/lib/swarm_sdk/tools/document_converters/html_converter.rb +101 -0
  231. data/lib/swarm_sdk/tools/document_converters/pdf_converter.rb +78 -0
  232. data/lib/swarm_sdk/tools/document_converters/xlsx_converter.rb +194 -0
  233. data/lib/swarm_sdk/tools/edit.rb +150 -0
  234. data/lib/swarm_sdk/tools/glob.rb +158 -0
  235. data/lib/swarm_sdk/tools/grep.rb +228 -0
  236. data/lib/swarm_sdk/tools/image_extractors/docx_image_extractor.rb +43 -0
  237. data/lib/swarm_sdk/tools/image_extractors/pdf_image_extractor.rb +163 -0
  238. data/lib/swarm_sdk/tools/image_formats/tiff_builder.rb +65 -0
  239. data/lib/swarm_sdk/tools/multi_edit.rb +232 -0
  240. data/lib/swarm_sdk/tools/path_resolver.rb +43 -0
  241. data/lib/swarm_sdk/tools/read.rb +251 -0
  242. data/lib/swarm_sdk/tools/registry.rb +93 -0
  243. data/lib/swarm_sdk/tools/scratchpad/scratchpad_list.rb +96 -0
  244. data/lib/swarm_sdk/tools/scratchpad/scratchpad_read.rb +76 -0
  245. data/lib/swarm_sdk/tools/scratchpad/scratchpad_write.rb +91 -0
  246. data/lib/swarm_sdk/tools/stores/read_tracker.rb +61 -0
  247. data/lib/swarm_sdk/tools/stores/scratchpad_storage.rb +224 -0
  248. data/lib/swarm_sdk/tools/stores/storage.rb +148 -0
  249. data/lib/swarm_sdk/tools/stores/todo_manager.rb +65 -0
  250. data/lib/swarm_sdk/tools/think.rb +95 -0
  251. data/lib/swarm_sdk/tools/todo_write.rb +216 -0
  252. data/lib/swarm_sdk/tools/web_fetch.rb +261 -0
  253. data/lib/swarm_sdk/tools/write.rb +117 -0
  254. data/lib/swarm_sdk/utils.rb +50 -0
  255. data/lib/swarm_sdk/version.rb +5 -0
  256. data/lib/swarm_sdk.rb +157 -0
  257. data/llm.v2.txt +13407 -0
  258. data/rubocop/cop/security/no_reflection_methods.rb +47 -0
  259. data/rubocop/cop/security/no_ruby_llm_logger.rb +32 -0
  260. data/swarm_cli.gemspec +57 -0
  261. data/swarm_memory.gemspec +28 -0
  262. data/swarm_sdk.gemspec +41 -0
  263. data/team.yml +1 -1
  264. data/team_full.yml +1875 -0
  265. data/{team_v2.yml → team_sdk.yml} +121 -52
  266. metadata +249 -6
  267. 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`