swarm_cli 2.1.13 → 3.0.0.alpha2

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 (49) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +21 -0
  3. data/exe/swarm3 +11 -0
  4. data/lib/swarm_cli/v3/activity_indicator.rb +168 -0
  5. data/lib/swarm_cli/v3/ansi_colors.rb +70 -0
  6. data/lib/swarm_cli/v3/cli.rb +721 -0
  7. data/lib/swarm_cli/v3/command_completer.rb +112 -0
  8. data/lib/swarm_cli/v3/display.rb +607 -0
  9. data/lib/swarm_cli/v3/dropdown.rb +130 -0
  10. data/lib/swarm_cli/v3/event_renderer.rb +161 -0
  11. data/lib/swarm_cli/v3/file_completer.rb +143 -0
  12. data/lib/swarm_cli/v3/raw_input_reader.rb +304 -0
  13. data/lib/swarm_cli/v3/reboot_tool.rb +123 -0
  14. data/lib/swarm_cli/v3/text_input.rb +235 -0
  15. data/lib/swarm_cli/v3.rb +52 -0
  16. metadata +30 -245
  17. data/exe/swarm +0 -6
  18. data/lib/swarm_cli/cli.rb +0 -201
  19. data/lib/swarm_cli/command_registry.rb +0 -61
  20. data/lib/swarm_cli/commands/mcp_serve.rb +0 -130
  21. data/lib/swarm_cli/commands/mcp_tools.rb +0 -148
  22. data/lib/swarm_cli/commands/migrate.rb +0 -55
  23. data/lib/swarm_cli/commands/run.rb +0 -173
  24. data/lib/swarm_cli/config_loader.rb +0 -98
  25. data/lib/swarm_cli/formatters/human_formatter.rb +0 -811
  26. data/lib/swarm_cli/formatters/json_formatter.rb +0 -62
  27. data/lib/swarm_cli/interactive_repl.rb +0 -895
  28. data/lib/swarm_cli/mcp_serve_options.rb +0 -44
  29. data/lib/swarm_cli/mcp_tools_options.rb +0 -59
  30. data/lib/swarm_cli/migrate_options.rb +0 -54
  31. data/lib/swarm_cli/migrator.rb +0 -132
  32. data/lib/swarm_cli/options.rb +0 -151
  33. data/lib/swarm_cli/ui/components/agent_badge.rb +0 -33
  34. data/lib/swarm_cli/ui/components/content_block.rb +0 -120
  35. data/lib/swarm_cli/ui/components/divider.rb +0 -57
  36. data/lib/swarm_cli/ui/components/panel.rb +0 -62
  37. data/lib/swarm_cli/ui/components/usage_stats.rb +0 -70
  38. data/lib/swarm_cli/ui/formatters/cost.rb +0 -49
  39. data/lib/swarm_cli/ui/formatters/number.rb +0 -58
  40. data/lib/swarm_cli/ui/formatters/text.rb +0 -77
  41. data/lib/swarm_cli/ui/formatters/time.rb +0 -73
  42. data/lib/swarm_cli/ui/icons.rb +0 -36
  43. data/lib/swarm_cli/ui/renderers/event_renderer.rb +0 -188
  44. data/lib/swarm_cli/ui/state/agent_color_cache.rb +0 -45
  45. data/lib/swarm_cli/ui/state/depth_tracker.rb +0 -40
  46. data/lib/swarm_cli/ui/state/spinner_manager.rb +0 -170
  47. data/lib/swarm_cli/ui/state/usage_tracker.rb +0 -62
  48. data/lib/swarm_cli/version.rb +0 -5
  49. data/lib/swarm_cli.rb +0 -46
metadata CHANGED
@@ -1,303 +1,88 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: swarm_cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.13
4
+ version: 3.0.0.alpha2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paulo Arruda
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 1980-01-02 00:00:00.000000000 Z
10
+ date: 1980-01-01 00:00:00.000000000 Z
11
11
  dependencies:
12
- - !ruby/object:Gem::Dependency
13
- name: fast-mcp
14
- requirement: !ruby/object:Gem::Requirement
15
- requirements:
16
- - - "~>"
17
- - !ruby/object:Gem::Version
18
- version: '1.6'
19
- type: :runtime
20
- prerelease: false
21
- version_requirements: !ruby/object:Gem::Requirement
22
- requirements:
23
- - - "~>"
24
- - !ruby/object:Gem::Version
25
- version: '1.6'
26
- - !ruby/object:Gem::Dependency
27
- name: pastel
28
- requirement: !ruby/object:Gem::Requirement
29
- requirements:
30
- - - ">="
31
- - !ruby/object:Gem::Version
32
- version: '0'
33
- type: :runtime
34
- prerelease: false
35
- version_requirements: !ruby/object:Gem::Requirement
36
- requirements:
37
- - - ">="
38
- - !ruby/object:Gem::Version
39
- version: '0'
40
- - !ruby/object:Gem::Dependency
41
- name: reline
42
- requirement: !ruby/object:Gem::Requirement
43
- requirements:
44
- - - "~>"
45
- - !ruby/object:Gem::Version
46
- version: 0.6.3
47
- type: :runtime
48
- prerelease: false
49
- version_requirements: !ruby/object:Gem::Requirement
50
- requirements:
51
- - - "~>"
52
- - !ruby/object:Gem::Version
53
- version: 0.6.3
54
12
  - !ruby/object:Gem::Dependency
55
13
  name: swarm_sdk
56
14
  requirement: !ruby/object:Gem::Requirement
57
15
  requirements:
58
16
  - - "~>"
59
17
  - !ruby/object:Gem::Version
60
- version: '2.7'
18
+ version: 3.0.alpha
61
19
  type: :runtime
62
20
  prerelease: false
63
21
  version_requirements: !ruby/object:Gem::Requirement
64
22
  requirements:
65
23
  - - "~>"
66
24
  - !ruby/object:Gem::Version
67
- version: '2.7'
68
- - !ruby/object:Gem::Dependency
69
- name: tty-box
70
- requirement: !ruby/object:Gem::Requirement
71
- requirements:
72
- - - ">="
73
- - !ruby/object:Gem::Version
74
- version: '0'
75
- type: :runtime
76
- prerelease: false
77
- version_requirements: !ruby/object:Gem::Requirement
78
- requirements:
79
- - - ">="
80
- - !ruby/object:Gem::Version
81
- version: '0'
82
- - !ruby/object:Gem::Dependency
83
- name: tty-cursor
84
- requirement: !ruby/object:Gem::Requirement
85
- requirements:
86
- - - ">="
87
- - !ruby/object:Gem::Version
88
- version: '0'
89
- type: :runtime
90
- prerelease: false
91
- version_requirements: !ruby/object:Gem::Requirement
92
- requirements:
93
- - - ">="
94
- - !ruby/object:Gem::Version
95
- version: '0'
96
- - !ruby/object:Gem::Dependency
97
- name: tty-link
98
- requirement: !ruby/object:Gem::Requirement
99
- requirements:
100
- - - ">="
101
- - !ruby/object:Gem::Version
102
- version: '0'
103
- type: :runtime
104
- prerelease: false
105
- version_requirements: !ruby/object:Gem::Requirement
106
- requirements:
107
- - - ">="
108
- - !ruby/object:Gem::Version
109
- version: '0'
25
+ version: 3.0.alpha
110
26
  - !ruby/object:Gem::Dependency
111
27
  name: tty-markdown
112
- requirement: !ruby/object:Gem::Requirement
113
- requirements:
114
- - - ">="
115
- - !ruby/object:Gem::Version
116
- version: '0'
117
- type: :runtime
118
- prerelease: false
119
- version_requirements: !ruby/object:Gem::Requirement
120
- requirements:
121
- - - ">="
122
- - !ruby/object:Gem::Version
123
- version: '0'
124
- - !ruby/object:Gem::Dependency
125
- name: tty-option
126
- requirement: !ruby/object:Gem::Requirement
127
- requirements:
128
- - - ">="
129
- - !ruby/object:Gem::Version
130
- version: '0'
131
- type: :runtime
132
- prerelease: false
133
- version_requirements: !ruby/object:Gem::Requirement
134
- requirements:
135
- - - ">="
136
- - !ruby/object:Gem::Version
137
- version: '0'
138
- - !ruby/object:Gem::Dependency
139
- name: tty-spinner
140
- requirement: !ruby/object:Gem::Requirement
141
- requirements:
142
- - - ">="
143
- - !ruby/object:Gem::Version
144
- version: '0'
145
- type: :runtime
146
- prerelease: false
147
- version_requirements: !ruby/object:Gem::Requirement
148
- requirements:
149
- - - ">="
150
- - !ruby/object:Gem::Version
151
- version: '0'
152
- - !ruby/object:Gem::Dependency
153
- name: tty-tree
154
- requirement: !ruby/object:Gem::Requirement
155
- requirements:
156
- - - ">="
157
- - !ruby/object:Gem::Version
158
- version: '0'
159
- type: :runtime
160
- prerelease: false
161
- version_requirements: !ruby/object:Gem::Requirement
162
- requirements:
163
- - - ">="
164
- - !ruby/object:Gem::Version
165
- version: '0'
166
- - !ruby/object:Gem::Dependency
167
- name: zeitwerk
168
- requirement: !ruby/object:Gem::Requirement
169
- requirements:
170
- - - ">="
171
- - !ruby/object:Gem::Version
172
- version: '0'
173
- type: :runtime
174
- prerelease: false
175
- version_requirements: !ruby/object:Gem::Requirement
176
- requirements:
177
- - - ">="
178
- - !ruby/object:Gem::Version
179
- version: '0'
180
- - !ruby/object:Gem::Dependency
181
- name: csv
182
- requirement: !ruby/object:Gem::Requirement
183
- requirements:
184
- - - ">="
185
- - !ruby/object:Gem::Version
186
- version: '0'
187
- type: :runtime
188
- prerelease: false
189
- version_requirements: !ruby/object:Gem::Requirement
190
- requirements:
191
- - - ">="
192
- - !ruby/object:Gem::Version
193
- version: '0'
194
- - !ruby/object:Gem::Dependency
195
- name: docx
196
- requirement: !ruby/object:Gem::Requirement
197
- requirements:
198
- - - "~>"
199
- - !ruby/object:Gem::Version
200
- version: '0.10'
201
- type: :runtime
202
- prerelease: false
203
- version_requirements: !ruby/object:Gem::Requirement
204
- requirements:
205
- - - "~>"
206
- - !ruby/object:Gem::Version
207
- version: '0.10'
208
- - !ruby/object:Gem::Dependency
209
- name: pdf-reader
210
28
  requirement: !ruby/object:Gem::Requirement
211
29
  requirements:
212
30
  - - "~>"
213
31
  - !ruby/object:Gem::Version
214
- version: '2.15'
32
+ version: '0.7'
215
33
  type: :runtime
216
34
  prerelease: false
217
35
  version_requirements: !ruby/object:Gem::Requirement
218
36
  requirements:
219
37
  - - "~>"
220
38
  - !ruby/object:Gem::Version
221
- version: '2.15'
39
+ version: '0.7'
222
40
  - !ruby/object:Gem::Dependency
223
- name: reverse_markdown
224
- requirement: !ruby/object:Gem::Requirement
225
- requirements:
226
- - - "~>"
227
- - !ruby/object:Gem::Version
228
- version: 3.0.0
229
- type: :runtime
230
- prerelease: false
231
- version_requirements: !ruby/object:Gem::Requirement
232
- requirements:
233
- - - "~>"
234
- - !ruby/object:Gem::Version
235
- version: 3.0.0
236
- - !ruby/object:Gem::Dependency
237
- name: roo
41
+ name: zeitwerk
238
42
  requirement: !ruby/object:Gem::Requirement
239
43
  requirements:
240
44
  - - "~>"
241
45
  - !ruby/object:Gem::Version
242
- version: 3.0.0
46
+ version: '2.6'
243
47
  type: :runtime
244
48
  prerelease: false
245
49
  version_requirements: !ruby/object:Gem::Requirement
246
50
  requirements:
247
51
  - - "~>"
248
52
  - !ruby/object:Gem::Version
249
- version: 3.0.0
53
+ version: '2.6'
250
54
  description: |
251
- SwarmCLI provides a command-line interface for SwarmSDK, the lightweight multi-agent
252
- AI orchestration framework. Built with the TTY toolkit, it offers an intuitive and interactive
253
- way to define, manage, and execute AI agent swarms with progress indicators, formatted output,
254
- and comprehensive help documentation.
55
+ SwarmCLI V3 provides a lightweight command-line interface for SwarmSDK V3 agents.
56
+ Features interactive REPL mode with always-available input, single-prompt execution,
57
+ and memory maintenance commands. Uses minimal dependencies with custom ANSI styling
58
+ and raw terminal input handling for a responsive experience.
255
59
  email:
256
60
  - parrudaj@gmail.com
257
61
  executables:
258
- - swarm
62
+ - swarm3
259
63
  extensions: []
260
64
  extra_rdoc_files: []
261
65
  files:
262
- - exe/swarm
263
- - lib/swarm_cli.rb
264
- - lib/swarm_cli/cli.rb
265
- - lib/swarm_cli/command_registry.rb
266
- - lib/swarm_cli/commands/mcp_serve.rb
267
- - lib/swarm_cli/commands/mcp_tools.rb
268
- - lib/swarm_cli/commands/migrate.rb
269
- - lib/swarm_cli/commands/run.rb
270
- - lib/swarm_cli/config_loader.rb
271
- - lib/swarm_cli/formatters/human_formatter.rb
272
- - lib/swarm_cli/formatters/json_formatter.rb
273
- - lib/swarm_cli/interactive_repl.rb
274
- - lib/swarm_cli/mcp_serve_options.rb
275
- - lib/swarm_cli/mcp_tools_options.rb
276
- - lib/swarm_cli/migrate_options.rb
277
- - lib/swarm_cli/migrator.rb
278
- - lib/swarm_cli/options.rb
279
- - lib/swarm_cli/ui/components/agent_badge.rb
280
- - lib/swarm_cli/ui/components/content_block.rb
281
- - lib/swarm_cli/ui/components/divider.rb
282
- - lib/swarm_cli/ui/components/panel.rb
283
- - lib/swarm_cli/ui/components/usage_stats.rb
284
- - lib/swarm_cli/ui/formatters/cost.rb
285
- - lib/swarm_cli/ui/formatters/number.rb
286
- - lib/swarm_cli/ui/formatters/text.rb
287
- - lib/swarm_cli/ui/formatters/time.rb
288
- - lib/swarm_cli/ui/icons.rb
289
- - lib/swarm_cli/ui/renderers/event_renderer.rb
290
- - lib/swarm_cli/ui/state/agent_color_cache.rb
291
- - lib/swarm_cli/ui/state/depth_tracker.rb
292
- - lib/swarm_cli/ui/state/spinner_manager.rb
293
- - lib/swarm_cli/ui/state/usage_tracker.rb
294
- - lib/swarm_cli/version.rb
66
+ - LICENSE
67
+ - exe/swarm3
68
+ - lib/swarm_cli/v3.rb
69
+ - lib/swarm_cli/v3/activity_indicator.rb
70
+ - lib/swarm_cli/v3/ansi_colors.rb
71
+ - lib/swarm_cli/v3/cli.rb
72
+ - lib/swarm_cli/v3/command_completer.rb
73
+ - lib/swarm_cli/v3/display.rb
74
+ - lib/swarm_cli/v3/dropdown.rb
75
+ - lib/swarm_cli/v3/event_renderer.rb
76
+ - lib/swarm_cli/v3/file_completer.rb
77
+ - lib/swarm_cli/v3/raw_input_reader.rb
78
+ - lib/swarm_cli/v3/reboot_tool.rb
79
+ - lib/swarm_cli/v3/text_input.rb
295
80
  homepage: https://github.com/parruda/swarm
296
81
  licenses:
297
82
  - MIT
298
83
  metadata:
299
84
  source_code_uri: https://github.com/parruda/swarm
300
- changelog_uri: https://github.com/parruda/swarm/blob/main/docs/v2/CHANGELOG.swarm_cli.md
85
+ changelog_uri: https://github.com/parruda/swarm/blob/main/docs/v3/CHANGELOG.md
301
86
  rdoc_options: []
302
87
  require_paths:
303
88
  - lib
@@ -314,5 +99,5 @@ required_rubygems_version: !ruby/object:Gem::Requirement
314
99
  requirements: []
315
100
  rubygems_version: 3.6.9
316
101
  specification_version: 4
317
- summary: Command-line interface for SwarmSDK
102
+ summary: Lightweight CLI for SwarmSDK V3 agents
318
103
  test_files: []
data/exe/swarm DELETED
@@ -1,6 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- require "swarm_cli"
5
-
6
- SwarmCLI::CLI.start(ARGV)
data/lib/swarm_cli/cli.rb DELETED
@@ -1,201 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module SwarmCLI
4
- class CLI
5
- class << self
6
- def start(args)
7
- new(args).run
8
- end
9
- end
10
-
11
- def initialize(args)
12
- @args = args
13
- end
14
-
15
- def run
16
- # Handle special cases first
17
- if @args.empty? || @args.include?("--help") || @args.include?("-h")
18
- print_help
19
- exit(0)
20
- end
21
-
22
- if @args.include?("--version") || @args.include?("-v")
23
- print_version
24
- exit(0)
25
- end
26
-
27
- # Extract command
28
- command = @args.first
29
-
30
- # Route to command
31
- case command
32
- when "run"
33
- run_command(@args[1..])
34
- when "mcp"
35
- mcp_command(@args[1..])
36
- when "migrate"
37
- migrate_command(@args[1..])
38
- else
39
- # Check if it's an extension command
40
- if CommandRegistry.registered?(command)
41
- extension_command(command, @args[1..])
42
- else
43
- $stderr.puts "Unknown command: #{command}"
44
- $stderr.puts
45
- print_help
46
- exit(1)
47
- end
48
- end
49
- rescue StandardError => e
50
- $stderr.puts "Fatal error: #{e.message}"
51
- exit(1)
52
- end
53
-
54
- private
55
-
56
- def mcp_command(args)
57
- # MCP has subcommands
58
- subcommand = args.first
59
-
60
- case subcommand
61
- when "serve"
62
- mcp_serve_command(args[1..])
63
- when "tools"
64
- mcp_tools_command(args[1..])
65
- else
66
- $stderr.puts "Unknown mcp subcommand: #{subcommand}"
67
- $stderr.puts
68
- $stderr.puts "Available mcp subcommands:"
69
- $stderr.puts " serve Start an MCP server exposing swarm lead agent"
70
- $stderr.puts " tools Start an MCP server exposing SwarmSDK tools"
71
- exit(1)
72
- end
73
- end
74
-
75
- def mcp_serve_command(args)
76
- # Parse options
77
- options = McpServeOptions.new
78
- options.parse(args)
79
-
80
- # Execute mcp serve command
81
- Commands::McpServe.new(options).execute
82
- rescue TTY::Option::InvalidParameter, TTY::Option::InvalidArgument => e
83
- $stderr.puts "Error: #{e.message}"
84
- $stderr.puts
85
- $stderr.puts options.help
86
- exit(1)
87
- end
88
-
89
- def mcp_tools_command(args)
90
- # Parse options
91
- options = McpToolsOptions.new
92
- options.parse(args)
93
-
94
- # Execute mcp tools command
95
- Commands::McpTools.new(options).execute
96
- rescue TTY::Option::InvalidParameter, TTY::Option::InvalidArgument => e
97
- $stderr.puts "Error: #{e.message}"
98
- $stderr.puts
99
- $stderr.puts options.help
100
- exit(1)
101
- end
102
-
103
- def run_command(args)
104
- # Parse options
105
- options = Options.new
106
- options.parse(args)
107
-
108
- # Execute run command
109
- Commands::Run.new(options).execute
110
- rescue TTY::Option::InvalidParameter, TTY::Option::InvalidArgument => e
111
- $stderr.puts "Error: #{e.message}"
112
- $stderr.puts
113
- $stderr.puts options.help
114
- exit(1)
115
- end
116
-
117
- def migrate_command(args)
118
- # Parse options
119
- options = MigrateOptions.new
120
- options.parse(args)
121
-
122
- # Execute migrate command
123
- Commands::Migrate.new(options).execute
124
- rescue TTY::Option::InvalidParameter, TTY::Option::InvalidArgument => e
125
- $stderr.puts "Error: #{e.message}"
126
- $stderr.puts
127
- $stderr.puts options.help
128
- exit(1)
129
- end
130
-
131
- def extension_command(command_name, args)
132
- # Get extension command class from registry
133
- command_class = CommandRegistry.get(command_name)
134
-
135
- # Execute extension command
136
- command_class.execute(args)
137
- end
138
-
139
- def print_help
140
- puts
141
- puts "SwarmCLI v#{VERSION} - AI Agent Orchestration"
142
- puts
143
- puts "Usage:"
144
- puts " swarm run CONFIG_FILE -p PROMPT [options]"
145
- puts " swarm migrate INPUT_FILE [--output OUTPUT_FILE]"
146
- puts " swarm mcp serve CONFIG_FILE"
147
- puts " swarm mcp tools [TOOL_NAMES...]"
148
-
149
- # Show extension commands dynamically
150
- CommandRegistry.commands.each do |cmd|
151
- puts " swarm #{cmd} ..."
152
- end
153
-
154
- puts
155
- puts "Commands:"
156
- puts " run Execute a swarm with AI agents"
157
- puts " migrate Migrate Claude Swarm v1 config to SwarmSDK v2 format"
158
- puts " mcp serve Start an MCP server exposing swarm lead agent"
159
- puts " mcp tools Start an MCP server exposing SwarmSDK tools"
160
-
161
- # Show extension command descriptions (if registered)
162
- if CommandRegistry.registered?("memory")
163
- puts " memory Manage SwarmMemory embeddings"
164
- end
165
-
166
- puts
167
- puts "Options:"
168
- puts " -p, --prompt PROMPT Task prompt for the swarm"
169
- puts " -o, --output FILE Output file for migrated config (default: stdout)"
170
- puts " --output-format FORMAT Output format: 'human' or 'json' (default: human)"
171
- puts " -q, --quiet Suppress progress output (human format only)"
172
- puts " --truncate Truncate long outputs for concise view"
173
- puts " --verbose Show system reminders and additional debug information"
174
- puts " -h, --help Print help"
175
- puts " -v, --version Print version"
176
- puts
177
- puts "Examples:"
178
- puts " swarm run team.yml -p 'Build a REST API'"
179
- puts " echo 'Build a REST API' | swarm run team.yml"
180
- puts " swarm run team.yml -p 'Refactor code' --output-format json"
181
- puts " swarm migrate old-config.yml"
182
- puts " swarm migrate old-config.yml --output new-config.yml"
183
- puts " swarm mcp serve team.yml"
184
- puts " swarm mcp tools # Expose all SwarmSDK tools"
185
- puts " swarm mcp tools Bash Grep Read # Space-separated tools"
186
- puts " swarm mcp tools ScratchpadWrite,ScratchpadRead # Comma-separated tools"
187
-
188
- # Show extension command examples dynamically
189
- if CommandRegistry.registered?("memory")
190
- puts " swarm memory setup # Setup embeddings (download model)"
191
- puts " swarm memory status # Check embedding status"
192
- end
193
-
194
- puts
195
- end
196
-
197
- def print_version
198
- puts "SwarmCLI v#{VERSION}"
199
- end
200
- end
201
- end
@@ -1,61 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module SwarmCLI
4
- # Registry for CLI command extensions
5
- #
6
- # Allows gems (like swarm_memory) to register additional CLI commands
7
- # that integrate seamlessly with the main swarm CLI.
8
- #
9
- # @example
10
- # # In swarm_memory gem
11
- # SwarmCLI::CommandRegistry.register(:memory, MyMemoryCommand)
12
- #
13
- # # User runs:
14
- # swarm memory status
15
- #
16
- # # SwarmCLI routes to MyMemoryCommand.execute(["status"])
17
- class CommandRegistry
18
- @extensions = {}
19
-
20
- class << self
21
- # Register a command extension
22
- #
23
- # @param command_name [Symbol, String] Command name (e.g., :memory)
24
- # @param command_class [Class] Command class with execute(args) method
25
- # @return [void]
26
- #
27
- # @example
28
- # CommandRegistry.register(:memory, SwarmMemory::CLI::Commands)
29
- def register(command_name, command_class)
30
- @extensions ||= {}
31
- @extensions[command_name.to_s] = command_class
32
- end
33
-
34
- # Get command class by name
35
- #
36
- # @param command_name [String] Command name
37
- # @return [Class, nil] Command class or nil if not found
38
- def get(command_name)
39
- @extensions ||= {}
40
- @extensions[command_name.to_s]
41
- end
42
-
43
- # Check if a command is registered
44
- #
45
- # @param command_name [String] Command name
46
- # @return [Boolean] True if command exists
47
- def registered?(command_name)
48
- @extensions ||= {}
49
- @extensions.key?(command_name.to_s)
50
- end
51
-
52
- # Get all registered command names
53
- #
54
- # @return [Array<String>] Command names
55
- def commands
56
- @extensions ||= {}
57
- @extensions.keys
58
- end
59
- end
60
- end
61
- end