claude_swarm 0.1.19 → 0.2.0

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 (43) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +9 -63
  3. data/.rubocop_todo.yml +11 -0
  4. data/CHANGELOG.md +110 -0
  5. data/CLAUDE.md +64 -2
  6. data/README.md +190 -28
  7. data/Rakefile +1 -1
  8. data/examples/mixed-provider-swarm.yml +23 -0
  9. data/examples/monitoring-demo.yml +4 -4
  10. data/lib/claude_swarm/claude_code_executor.rb +7 -13
  11. data/lib/claude_swarm/claude_mcp_server.rb +26 -17
  12. data/lib/claude_swarm/cli.rb +384 -265
  13. data/lib/claude_swarm/commands/ps.rb +22 -24
  14. data/lib/claude_swarm/commands/show.rb +45 -63
  15. data/lib/claude_swarm/configuration.rb +137 -8
  16. data/lib/claude_swarm/mcp_generator.rb +39 -15
  17. data/lib/claude_swarm/openai/chat_completion.rb +264 -0
  18. data/lib/claude_swarm/openai/executor.rb +301 -0
  19. data/lib/claude_swarm/openai/responses.rb +338 -0
  20. data/lib/claude_swarm/orchestrator.rb +221 -45
  21. data/lib/claude_swarm/process_tracker.rb +7 -7
  22. data/lib/claude_swarm/session_cost_calculator.rb +93 -0
  23. data/lib/claude_swarm/session_path.rb +3 -5
  24. data/lib/claude_swarm/system_utils.rb +16 -0
  25. data/lib/claude_swarm/templates/generation_prompt.md.erb +230 -0
  26. data/lib/claude_swarm/tools/reset_session_tool.rb +24 -0
  27. data/lib/claude_swarm/tools/session_info_tool.rb +24 -0
  28. data/lib/claude_swarm/tools/task_tool.rb +43 -0
  29. data/lib/claude_swarm/version.rb +1 -1
  30. data/lib/claude_swarm/worktree_manager.rb +145 -48
  31. data/lib/claude_swarm.rb +34 -12
  32. data/llms.txt +2 -2
  33. data/single.yml +482 -6
  34. data/team.yml +344 -0
  35. metadata +65 -14
  36. data/claude-swarm.yml +0 -64
  37. data/lib/claude_swarm/reset_session_tool.rb +0 -22
  38. data/lib/claude_swarm/session_info_tool.rb +0 -22
  39. data/lib/claude_swarm/task_tool.rb +0 -39
  40. /data/{example → examples}/claude-swarm.yml +0 -0
  41. /data/{example → examples}/microservices-team.yml +0 -0
  42. /data/{example → examples}/session-restoration-demo.yml +0 -0
  43. /data/{example → examples}/test-generation.yml +0 -0
@@ -6,7 +6,7 @@ swarm:
6
6
  coordinator:
7
7
  description: "Main coordinator managing the team"
8
8
  directory: .
9
- model: haiku
9
+ model: sonnet
10
10
  connections: [analyzer, reporter]
11
11
  prompt: "You coordinate analysis and reporting tasks"
12
12
  allowed_tools: [Read, Edit]
@@ -14,13 +14,13 @@ swarm:
14
14
  analyzer:
15
15
  description: "Data analyzer processing information"
16
16
  directory: ./data
17
- model: haiku
17
+ model: sonnet
18
18
  prompt: "You analyze data and provide insights"
19
19
  allowed_tools: [Read, Bash]
20
20
 
21
21
  reporter:
22
22
  description: "Report generator creating summaries"
23
23
  directory: ./reports
24
- model: haiku
24
+ model: sonnet
25
25
  prompt: "You generate reports from analysis"
26
- allowed_tools: [Write, Edit]
26
+ allowed_tools: [Write, Edit]
@@ -1,18 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "json"
4
- require "open3"
5
- require "logger"
6
- require "fileutils"
7
- require_relative "session_path"
8
-
9
3
  module ClaudeSwarm
10
4
  class ClaudeCodeExecutor
11
5
  attr_reader :session_id, :last_response, :working_directory, :logger, :session_path
12
6
 
13
7
  def initialize(working_directory: Dir.pwd, model: nil, mcp_config: nil, vibe: false,
14
- instance_name: nil, instance_id: nil, calling_instance: nil, calling_instance_id: nil,
15
- claude_session_id: nil, additional_directories: [])
8
+ instance_name: nil, instance_id: nil, calling_instance: nil, calling_instance_id: nil,
9
+ claude_session_id: nil, additional_directories: [])
16
10
  @working_directory = working_directory
17
11
  @additional_directories = additional_directories
18
12
  @model = model
@@ -112,7 +106,7 @@ module ClaudeSwarm
112
106
  instance_id: @instance_id,
113
107
  claude_session_id: @session_id,
114
108
  status: "active",
115
- updated_at: Time.now.iso8601
109
+ updated_at: Time.now.iso8601,
116
110
  }
117
111
 
118
112
  File.write(state_file, JSON.pretty_generate(state_data))
@@ -159,7 +153,7 @@ module ClaudeSwarm
159
153
  to_instance: @instance_name,
160
154
  to_instance_id: @instance_id,
161
155
  prompt: prompt,
162
- timestamp: Time.now.iso8601
156
+ timestamp: Time.now.iso8601,
163
157
  }
164
158
 
165
159
  append_to_session_json(event)
@@ -171,7 +165,7 @@ module ClaudeSwarm
171
165
  instance_info = @instance_name
172
166
  instance_info += " (#{@instance_id})" if @instance_id
173
167
  @logger.info(
174
- "($#{response["total_cost"]} - #{response["duration_ms"]}ms) #{instance_info} -> #{caller_info}: \n---\n#{response["result"]}\n---"
168
+ "($#{response["total_cost"]} - #{response["duration_ms"]}ms) #{instance_info} -> #{caller_info}: \n---\n#{response["result"]}\n---",
175
169
  )
176
170
  end
177
171
 
@@ -208,7 +202,7 @@ module ClaudeSwarm
208
202
  instance_info = @instance_name
209
203
  instance_info += " (#{@instance_id})" if @instance_id
210
204
  @logger.info(
211
- "Tool call from #{instance_info} -> Tool: #{tool_call["name"]}, ID: #{tool_call["id"]}, Arguments: #{arguments}"
205
+ "Tool call from #{instance_info} -> Tool: #{tool_call["name"]}, ID: #{tool_call["id"]}, Arguments: #{arguments}",
212
206
  )
213
207
  end
214
208
 
@@ -239,7 +233,7 @@ module ClaudeSwarm
239
233
  calling_instance: @calling_instance,
240
234
  calling_instance_id: @calling_instance_id,
241
235
  timestamp: Time.now.iso8601,
242
- event: event
236
+ event: event,
243
237
  }
244
238
 
245
239
  # Write as single line JSON (JSONL format)
@@ -1,13 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "fast_mcp_annotations"
4
- require "json"
5
- require_relative "claude_code_executor"
6
- require_relative "task_tool"
7
- require_relative "session_info_tool"
8
- require_relative "reset_session_tool"
9
- require_relative "process_tracker"
10
-
11
3
  module ClaudeSwarm
12
4
  class ClaudeMcpServer
13
5
  # Class variables to share state with tool classes
@@ -19,7 +11,9 @@ module ClaudeSwarm
19
11
  @instance_config = instance_config
20
12
  @calling_instance = calling_instance
21
13
  @calling_instance_id = calling_instance_id
22
- @executor = ClaudeCodeExecutor.new(
14
+
15
+ # Create appropriate executor based on provider
16
+ common_params = {
23
17
  working_directory: instance_config[:directory],
24
18
  model: instance_config[:model],
25
19
  mcp_config: instance_config[:mcp_config_path],
@@ -29,8 +23,23 @@ module ClaudeSwarm
29
23
  calling_instance: calling_instance,
30
24
  calling_instance_id: calling_instance_id,
31
25
  claude_session_id: instance_config[:claude_session_id],
32
- additional_directories: instance_config[:directories][1..] || []
33
- )
26
+ additional_directories: instance_config[:directories][1..] || [],
27
+ }
28
+
29
+ @executor = if instance_config[:provider] == "openai"
30
+ OpenAI::Executor.new(
31
+ **common_params,
32
+ # OpenAI-specific parameters
33
+ temperature: instance_config[:temperature],
34
+ api_version: instance_config[:api_version],
35
+ openai_token_env: instance_config[:openai_token_env],
36
+ base_url: instance_config[:base_url],
37
+ reasoning_effort: instance_config[:reasoning_effort],
38
+ )
39
+ else
40
+ # Default Claude behavior (existing code)
41
+ ClaudeCodeExecutor.new(**common_params)
42
+ end
34
43
 
35
44
  # Set class variables so tools can access them
36
45
  self.class.executor = @executor
@@ -50,20 +59,20 @@ module ClaudeSwarm
50
59
 
51
60
  server = FastMcp::Server.new(
52
61
  name: @instance_config[:name],
53
- version: "1.0.0"
62
+ version: "1.0.0",
54
63
  )
55
64
 
56
65
  # Set dynamic description for TaskTool based on instance config
57
66
  if @instance_config[:description]
58
- TaskTool.description "Execute a task using Agent #{@instance_config[:name]}. #{@instance_config[:description]}"
67
+ Tools::TaskTool.description("Execute a task using Agent #{@instance_config[:name]}. #{@instance_config[:description]}")
59
68
  else
60
- TaskTool.description "Execute a task using Agent #{@instance_config[:name]}"
69
+ Tools::TaskTool.description("Execute a task using Agent #{@instance_config[:name]}")
61
70
  end
62
71
 
63
72
  # Register tool classes (not instances)
64
- server.register_tool(TaskTool)
65
- server.register_tool(SessionInfoTool)
66
- server.register_tool(ResetSessionTool)
73
+ server.register_tool(Tools::TaskTool)
74
+ server.register_tool(Tools::SessionInfoTool)
75
+ server.register_tool(Tools::ResetSessionTool)
67
76
 
68
77
  # Start the stdio server
69
78
  server.start