claude_swarm 1.0.1 → 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.
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 +6 -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 +247 -4
  267. data/EXAMPLES.md +0 -164
@@ -0,0 +1,71 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # Manual Test 3: Agent Capabilities
5
+ #
6
+ # Tests: tools, delegates_to, directory
7
+ #
8
+ # Run: bundle exec ruby -Ilib lib/swarm_sdk/examples/dsl/03_capabilities.rb
9
+
10
+ require "swarm_sdk"
11
+ require_relative "../../../swarm_sdk/swarm_builder"
12
+ require_relative "../../../swarm_sdk/agent_builder"
13
+
14
+ ENV["OPENAI_API_KEY"] = "test-key"
15
+
16
+ swarm = SwarmSDK.build do
17
+ name("Capabilities Test")
18
+ lead(:coordinator)
19
+
20
+ agent(:coordinator) do
21
+ model("gpt-5-nano")
22
+ provider("openai")
23
+ system_prompt("You coordinate work and delegate to workers. Use TodoWrite for multi-step tasks.")
24
+ description("Coordinator testing delegation")
25
+
26
+ # Multiple tools
27
+ tools(:Read, :Grep, :Glob, :TodoWrite)
28
+
29
+ # Delegation
30
+ delegates_to(:worker)
31
+
32
+ # Working directory
33
+ directory(".")
34
+ end
35
+
36
+ agent(:worker) do
37
+ model("gpt-5-nano")
38
+ provider("openai")
39
+ system_prompt("You are a worker agent. Answer concisely.")
40
+ description("Worker agent for delegation testing")
41
+
42
+ tools(:Read)
43
+ end
44
+ end
45
+
46
+ puts "✅ Swarm with capabilities built!"
47
+ puts ""
48
+
49
+ # Verify configuration using public API
50
+ coordinator_def = swarm.agent_definition(:coordinator)
51
+ worker_def = swarm.agent_definition(:worker)
52
+
53
+ puts "Coordinator:"
54
+ puts " tools: #{coordinator_def.tools.map { |t| t[:name] }.join(", ")}"
55
+ puts " delegates_to: #{coordinator_def.delegates_to.join(", ")}"
56
+ puts " directory: #{coordinator_def.directory}"
57
+ puts ""
58
+
59
+ puts "Worker:"
60
+ puts " tools: #{worker_def.tools.map { |t| t[:name] }.join(", ")}"
61
+ puts ""
62
+
63
+ puts "Testing delegation..."
64
+ result = swarm.execute("Delegate a simple task to the worker: ask them what 5 + 3 equals")
65
+
66
+ puts ""
67
+ puts "Response: #{result.content}"
68
+ puts "Agents involved: #{result.agents_involved.join(", ")}"
69
+ puts "Success: #{result.success?}"
70
+ puts ""
71
+ puts "✅ Tools, delegation, and directory work!"
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # Manual Test 4: LLM Parameters
5
+ #
6
+ # Tests: parameters (temperature, max_tokens, reasoning), timeout
7
+ #
8
+ # Run: bundle exec ruby -Ilib lib/swarm_sdk/examples/dsl/04_llm_parameters.rb
9
+
10
+ require "swarm_sdk"
11
+ require_relative "../../../swarm_sdk/swarm_builder"
12
+ require_relative "../../../swarm_sdk/agent_builder"
13
+
14
+ ENV["OPENAI_API_KEY"] = "test-key"
15
+
16
+ swarm = SwarmSDK.build do
17
+ name("LLM Parameters Test")
18
+ lead(:configured_agent)
19
+
20
+ agent(:configured_agent) do
21
+ model("gpt-5-nano")
22
+ provider("openai")
23
+ system_prompt("You test LLM parameters. Be concise.")
24
+ description("Agent with custom LLM parameters")
25
+ tools(:Read)
26
+
27
+ # LLM parameters hash
28
+ parameters(
29
+ temperature: 0.3,
30
+ max_tokens: 100,
31
+ reasoning: "low",
32
+ )
33
+
34
+ # HTTP timeout
35
+ timeout(60)
36
+ end
37
+ end
38
+
39
+ puts "✅ Swarm with LLM parameters built!"
40
+ puts ""
41
+
42
+ agent_def = swarm.agent_definition(:configured_agent)
43
+
44
+ puts "Parameter Verification:"
45
+ puts " parameters: #{agent_def.parameters.inspect}"
46
+ puts " timeout: #{agent_def.timeout}"
47
+ puts ""
48
+
49
+ puts "Running test query with configured parameters..."
50
+ result = swarm.execute("Count to 3")
51
+
52
+ puts ""
53
+ puts "Response: #{result.content}"
54
+ puts "Success: #{result.success?}"
55
+ puts ""
56
+ puts "✅ LLM parameters and timeout work!"
@@ -0,0 +1,73 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # Manual Test 5: Advanced Flags
5
+ #
6
+ # Tests: disable_default_tools, bypass_permissions, coding_agent, assume_model_exists
7
+ #
8
+ # Run: bundle exec ruby -Ilib lib/swarm_sdk/examples/dsl/05_advanced_flags.rb
9
+
10
+ require "swarm_sdk"
11
+ require_relative "../../../swarm_sdk/swarm_builder"
12
+ require_relative "../../../swarm_sdk/agent_builder"
13
+ require_relative "../../../swarm_sdk/permissions_builder"
14
+
15
+ ENV["OPENAI_API_KEY"] = "test-key"
16
+
17
+ swarm = SwarmSDK.build do
18
+ name("Advanced Flags Test")
19
+ lead(:test_agent)
20
+
21
+ agent(:test_agent) do
22
+ model("gpt-5-nano")
23
+ provider("openai")
24
+ description("Agent testing advanced flags")
25
+
26
+ # Test skip_base_prompt: true (custom prompt only)
27
+ coding_agent(false)
28
+ system_prompt("You are a test agent. You only have Read tool. Say 'flags work' when asked.")
29
+
30
+ # Test assume_model_exists: true (skip model validation)
31
+ assume_model_exists(true)
32
+
33
+ # Test bypass_permissions: false (respect permissions)
34
+ bypass_permissions(false)
35
+
36
+ # Only Read tool (no defaults) - using include_default: false
37
+ tools(:Read, include_default: false)
38
+
39
+ # Add permissions to verify bypass_permissions: false respects them
40
+ permissions do
41
+ tool(:Read).deny_paths("tmp/secret.txt")
42
+ end
43
+ end
44
+ end
45
+
46
+ puts "✅ Swarm with advanced flags built!"
47
+ puts ""
48
+
49
+ agent_def = swarm.agent_definition(:test_agent)
50
+
51
+ puts "Advanced Flags Verification:"
52
+ puts " coding_agent: #{agent_def.coding_agent}"
53
+ puts " disable_default_tools: #{agent_def.disable_default_tools}"
54
+ puts " bypass_permissions: #{agent_def.bypass_permissions}"
55
+ puts " assume_model_exists: #{agent_def.assume_model_exists}"
56
+ puts " system_prompt: #{agent_def.system_prompt[0..80]}..."
57
+ puts ""
58
+
59
+ # Verify agent tools (should NOT include defaults like Grep, Glob)
60
+ agent_chat = swarm.agent(:test_agent)
61
+ tool_names = agent_chat.tools.keys
62
+ puts "Agent tools (should be ONLY Read, no defaults):"
63
+ puts " #{tool_names.join(", ")}"
64
+ puts ""
65
+
66
+ puts "Running test query..."
67
+ result = swarm.execute("Are the flags working?")
68
+
69
+ puts ""
70
+ puts "Response: #{result.content}"
71
+ puts "Success: #{result.success?}"
72
+ puts ""
73
+ puts "✅ All advanced flags work correctly!"
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # Manual Test 6: Permissions DSL
5
+ #
6
+ # Tests: all_agents permissions, agent permissions, path and command restrictions
7
+ #
8
+ # Run: bundle exec ruby -Ilib lib/swarm_sdk/examples/dsl/06_permissions.rb
9
+
10
+ require "swarm_sdk"
11
+ require_relative "../../../swarm_sdk/swarm_builder"
12
+ require_relative "../../../swarm_sdk/agent_builder"
13
+ require_relative "../../../swarm_sdk/all_agents_builder"
14
+ require_relative "../../../swarm_sdk/permissions_builder"
15
+ require "fileutils"
16
+
17
+ ENV["OPENAI_API_KEY"] = "test-key"
18
+
19
+ # Setup test environment
20
+ FileUtils.mkdir_p("tmp/allowed")
21
+ FileUtils.mkdir_p("tmp/forbidden")
22
+ File.write("tmp/allowed/test.txt", "allowed content")
23
+ File.write("tmp/forbidden/secret.txt", "secret content")
24
+
25
+ swarm = SwarmSDK.build do
26
+ name("Permissions Test")
27
+ lead(:restricted_agent)
28
+
29
+ # Default permissions for all agents
30
+ all_agents do
31
+ tools(:Write)
32
+
33
+ permissions do
34
+ tool(:Write).allow_paths("tmp/allowed/**/*")
35
+ tool(:Write).deny_paths("tmp/forbidden/**/*")
36
+ end
37
+ end
38
+
39
+ agent(:restricted_agent) do
40
+ model("gpt-5-nano")
41
+ provider("openai")
42
+ system_prompt("You test file permissions. Try to write to allowed and forbidden paths.")
43
+ description("Agent with write restrictions")
44
+
45
+ tools(:Read, :Bash)
46
+
47
+ # Agent-specific Bash permissions
48
+ permissions do
49
+ tool(:Bash).allow_commands("^ls", "^pwd$", "^echo")
50
+ tool(:Bash).deny_commands("^rm", "^dd")
51
+ end
52
+ end
53
+ end
54
+
55
+ puts "✅ Swarm with permissions built!"
56
+ puts ""
57
+
58
+ agent_def = swarm.agent_definition(:restricted_agent)
59
+
60
+ puts "Permissions Verification:"
61
+ puts " Default (Write): #{agent_def.default_permissions}"
62
+ puts " Agent (Bash): #{agent_def.agent_permissions}"
63
+ puts ""
64
+
65
+ puts "Testing simple query with permissions in place..."
66
+ result = swarm.execute("Say 'permissions configured'")
67
+
68
+ puts ""
69
+ puts "Response: #{result.content}"
70
+ puts "Success: #{result.success?}"
71
+ puts ""
72
+ puts "✅ Permissions DSL configured correctly!"
73
+ puts ""
74
+ puts "Note: Permissions are enforced - agent can only:"
75
+ puts " - Write to tmp/allowed/** (not tmp/forbidden/**)"
76
+ puts " - Run Bash: ls, pwd, echo (not rm, dd)"
77
+
78
+ # Cleanup
79
+ FileUtils.rm_rf("tmp/allowed")
80
+ FileUtils.rm_rf("tmp/forbidden")
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # Manual Test 7: MCP Server Configuration
5
+ #
6
+ # Tests: mcp_server with filesystem MCP server (stdio transport)
7
+ #
8
+ # Run: bundle exec ruby -Ilib lib/swarm_sdk/examples/dsl/07_mcp_server.rb
9
+
10
+ require "swarm_sdk"
11
+ require_relative "../../../swarm_sdk/swarm_builder"
12
+ require_relative "../../../swarm_sdk/agent_builder"
13
+
14
+ ENV["OPENAI_API_KEY"] = "test-key"
15
+
16
+ swarm = SwarmSDK.build do
17
+ name("MCP Server Test")
18
+ lead(:mcp_agent)
19
+
20
+ agent(:mcp_agent) do
21
+ model("gpt-5-nano")
22
+ provider("openai")
23
+ system_prompt("You have access to MCP tools from filesystem server. List available tools when asked.")
24
+ description("Agent with MCP server access")
25
+
26
+ tools(:Read)
27
+
28
+ # Add example MCP server (filesystem-mcp for demonstration)
29
+ mcp_server(
30
+ :filesystem,
31
+ type: :stdio,
32
+ command: "npx",
33
+ args: ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"],
34
+ env: {},
35
+ )
36
+ end
37
+ end
38
+
39
+ puts "✅ Swarm with MCP server built!"
40
+ puts ""
41
+
42
+ agent_def = swarm.agent_definition(:mcp_agent)
43
+
44
+ puts "MCP Server Verification:"
45
+ puts " Servers configured: #{agent_def.mcp_servers.size}"
46
+ agent_def.mcp_servers.each do |server|
47
+ puts " - #{server[:name]} (#{server[:type]})"
48
+ puts " command: #{server[:command]}"
49
+ puts " args: #{server[:args].inspect}"
50
+ end
51
+ puts ""
52
+
53
+ puts "Testing MCP server connection..."
54
+ puts "(Agent should have access to filesystem MCP tools)"
55
+ puts ""
56
+
57
+ result = swarm.execute("What tools do you have access to? List them.")
58
+
59
+ puts "Response: #{result.content[0..300]}..."
60
+ puts "Success: #{result.success?}"
61
+ puts ""
62
+ puts "✅ MCP server configuration works!"
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # Manual Test 8: Swarm-Level Hooks
5
+ #
6
+ # Tests: hook :swarm_start, hook :swarm_stop (Ruby blocks)
7
+ #
8
+ # Run: bundle exec ruby -Ilib lib/swarm_sdk/examples/dsl/08_swarm_hooks.rb
9
+
10
+ require "swarm_sdk"
11
+ require_relative "../../../swarm_sdk/swarm_builder"
12
+ require_relative "../../../swarm_sdk/agent_builder"
13
+
14
+ ENV["OPENAI_API_KEY"] = "test-key"
15
+
16
+ swarm = SwarmSDK.build do
17
+ name("Swarm Hooks Test")
18
+ lead(:agent)
19
+
20
+ # Swarm-level hook: swarm_start
21
+ hook(:swarm_start) do |ctx|
22
+ puts "🪝 swarm_start hook fired!"
23
+ puts " Prompt: #{ctx.metadata[:prompt]}"
24
+ end
25
+
26
+ # Swarm-level hook: swarm_stop
27
+ hook(:swarm_stop) do |ctx|
28
+ puts "🪝 swarm_stop hook fired!"
29
+ puts " Success: #{ctx.metadata[:success]}"
30
+ puts " Cost: $#{ctx.metadata[:total_cost]}"
31
+ end
32
+
33
+ agent(:agent) do
34
+ model("gpt-5-nano")
35
+ provider("openai")
36
+ system_prompt("You test swarm hooks. Say 'hooks work'.")
37
+ description("Test agent")
38
+ tools(:Read)
39
+ end
40
+ end
41
+
42
+ puts "✅ Swarm with swarm-level hooks built!"
43
+ puts ""
44
+ puts "Running execution to trigger hooks..."
45
+ puts ""
46
+
47
+ result = swarm.execute("Say 'swarm hooks test'")
48
+
49
+ puts ""
50
+ puts "Response: #{result.content}"
51
+ puts ""
52
+ puts "✅ Swarm-level hooks work correctly!"
53
+ puts "(Check output above for 🪝 markers)"
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # Manual Test 9: Agent-Level Hooks
5
+ #
6
+ # Tests: hook :pre_tool_use, hook :post_tool_use, hook :user_prompt (Ruby blocks)
7
+ #
8
+ # Run: bundle exec ruby -Ilib lib/swarm_sdk/examples/dsl/09_agent_hooks.rb
9
+
10
+ require "swarm_sdk"
11
+ require_relative "../../../swarm_sdk/swarm_builder"
12
+ require_relative "../../../swarm_sdk/agent_builder"
13
+
14
+ ENV["OPENAI_API_KEY"] = "test-key"
15
+
16
+ swarm = SwarmSDK.build do
17
+ name("Agent Hooks Test")
18
+ lead(:agent)
19
+
20
+ agent(:agent) do
21
+ model("gpt-5-nano")
22
+ provider("openai")
23
+ system_prompt("You test agent hooks. Use Read tool to read tmp/test.txt")
24
+ description("Test agent with hooks")
25
+ tools(:Read)
26
+
27
+ # Hook: user_prompt (before sending to LLM)
28
+ hook(:user_prompt) do |ctx|
29
+ puts "🪝 user_prompt hook fired!"
30
+ puts " Prompt: #{ctx.metadata[:prompt][0..50]}..."
31
+ end
32
+
33
+ # Hook: pre_tool_use (before tool execution)
34
+ hook(:pre_tool_use, matcher: "Read") do |ctx|
35
+ puts "🪝 pre_tool_use hook fired!"
36
+ puts " Tool: #{ctx.tool_call.name}"
37
+ puts " File: #{ctx.tool_call.parameters[:file_path]}"
38
+ end
39
+
40
+ # Hook: post_tool_use (after tool execution)
41
+ hook(:post_tool_use, matcher: "Read") do |ctx|
42
+ puts "🪝 post_tool_use hook fired!"
43
+ puts " Result length: #{ctx.tool_result.content.to_s.length} chars"
44
+ end
45
+ end
46
+ end
47
+
48
+ # Setup test file
49
+ require "fileutils"
50
+ FileUtils.mkdir_p("tmp")
51
+ File.write("tmp/test.txt", "test content for hooks")
52
+
53
+ puts "✅ Swarm with agent-level hooks built!"
54
+ puts ""
55
+ puts "Running execution to trigger hooks..."
56
+ puts ""
57
+
58
+ result = swarm.execute("Read the file tmp/test.txt")
59
+
60
+ puts ""
61
+ puts "Response: #{result.content}"
62
+ puts ""
63
+ puts "✅ Agent-level hooks work correctly!"
64
+ puts "(Hooks fired - check output above for 🪝 markers)"
65
+
66
+ # Cleanup
67
+ File.delete("tmp/test.txt") if File.exist?("tmp/test.txt")
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # Manual Test 10: All-Agents Hooks
5
+ #
6
+ # Tests: all_agents { hook } (applies to all agents)
7
+ #
8
+ # Run: bundle exec ruby -Ilib lib/swarm_sdk/examples/dsl/10_all_agents_hooks.rb
9
+
10
+ require "swarm_sdk"
11
+ require_relative "../../../swarm_sdk/swarm_builder"
12
+ require_relative "../../../swarm_sdk/agent_builder"
13
+ require_relative "../../../swarm_sdk/all_agents_builder"
14
+
15
+ ENV["OPENAI_API_KEY"] = "test-key"
16
+
17
+ swarm = SwarmSDK.build do
18
+ name("All-Agents Hooks Test")
19
+ lead(:agent1)
20
+
21
+ # Hook that applies to ALL agents
22
+ all_agents do
23
+ hook(:pre_tool_use, matcher: "Read") do |ctx|
24
+ agent = ctx.agent_name
25
+ puts "🪝 all_agents hook fired for: #{agent}"
26
+ puts " Tool: #{ctx.tool_call.name}"
27
+ end
28
+ end
29
+
30
+ agent(:agent1) do
31
+ model("gpt-5-nano")
32
+ provider("openai")
33
+ system_prompt("You test all_agents hooks. Use Read tool. Delegate to agent2.")
34
+ description("First test agent")
35
+ tools(:Read)
36
+ delegates_to(:agent2)
37
+ end
38
+
39
+ agent(:agent2) do
40
+ model("gpt-5-nano")
41
+ provider("openai")
42
+ system_prompt("You are agent2. Use Read tool when asked.")
43
+ description("Second test agent")
44
+ tools(:Read)
45
+ end
46
+ end
47
+
48
+ # Setup test file
49
+ require "fileutils"
50
+ FileUtils.mkdir_p("tmp")
51
+ File.write("tmp/all_agents_test.txt", "testing all_agents hooks")
52
+
53
+ puts "✅ Swarm with all_agents hooks built!"
54
+ puts ""
55
+ puts "Running execution to trigger hooks across agents..."
56
+ puts ""
57
+
58
+ result = swarm.execute("Read tmp/all_agents_test.txt, then delegate to agent2 to also read it")
59
+
60
+ puts ""
61
+ puts "Response: #{result.content[0..150]}..."
62
+ puts ""
63
+ puts "✅ All-agents hooks work correctly!"
64
+ puts "(Check output above for 🪝 markers showing hook fired for multiple agents)"
65
+
66
+ # Cleanup
67
+ File.delete("tmp/all_agents_test.txt") if File.exist?("tmp/all_agents_test.txt")
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # Manual Test 11: Agent Delegation
5
+ #
6
+ # Tests: Multi-agent delegation with delegates_to
7
+ #
8
+ # Run: bundle exec ruby -Ilib lib/swarm_sdk/examples/dsl/11_delegation.rb
9
+
10
+ require "swarm_sdk"
11
+ require_relative "../../../swarm_sdk/swarm_builder"
12
+ require_relative "../../../swarm_sdk/agent_builder"
13
+
14
+ ENV["OPENAI_API_KEY"] = "test-key"
15
+
16
+ swarm = SwarmSDK.build do
17
+ name("Delegation Test")
18
+ lead(:coordinator)
19
+
20
+ agent(:coordinator) do
21
+ model("gpt-5-nano")
22
+ provider("openai")
23
+ system_prompt("You coordinate tasks. Delegate math to calculator, text to writer.")
24
+ description("Coordinator")
25
+ tools(:TodoWrite)
26
+ delegates_to(:calculator, :writer)
27
+ end
28
+
29
+ agent(:calculator) do
30
+ model("gpt-5-nano")
31
+ provider("openai")
32
+ system_prompt("You do math. Answer with just the number.")
33
+ description("Math specialist")
34
+ tools(:Read)
35
+ end
36
+
37
+ agent(:writer) do
38
+ model("gpt-5-nano")
39
+ provider("openai")
40
+ system_prompt("You write text. Be creative and concise.")
41
+ description("Writing specialist")
42
+ tools(:Read)
43
+ end
44
+ end
45
+
46
+ puts "✅ Swarm with delegation built!"
47
+ puts ""
48
+
49
+ coordinator_def = swarm.agent_definition(:coordinator)
50
+ puts "Coordinator can delegate to: #{coordinator_def.delegates_to.join(", ")}"
51
+ puts ""
52
+
53
+ puts "Testing multi-agent delegation..."
54
+ result = swarm.execute("Delegate to calculator: what is 7 + 8? Then delegate to writer: write a haiku about swarms")
55
+
56
+ puts ""
57
+ puts "Response: #{result.content}"
58
+ puts "Success: #{result.success?}"
59
+ puts ""
60
+ puts "✅ Delegation works!"