shared_tools 0.3.1 → 0.4.1

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 (75) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +46 -16
  3. data/README.md +257 -262
  4. data/lib/shared_tools/browser_tool.rb +5 -0
  5. data/lib/shared_tools/calculator_tool.rb +4 -0
  6. data/lib/shared_tools/clipboard_tool.rb +4 -0
  7. data/lib/shared_tools/composite_analysis_tool.rb +4 -0
  8. data/lib/shared_tools/computer_tool.rb +5 -0
  9. data/lib/shared_tools/cron_tool.rb +4 -0
  10. data/lib/shared_tools/current_date_time_tool.rb +4 -0
  11. data/lib/shared_tools/data_science_kit.rb +4 -0
  12. data/lib/shared_tools/database.rb +4 -0
  13. data/lib/shared_tools/database_query_tool.rb +4 -0
  14. data/lib/shared_tools/database_tool.rb +5 -0
  15. data/lib/shared_tools/disk_tool.rb +5 -0
  16. data/lib/shared_tools/dns_tool.rb +4 -0
  17. data/lib/shared_tools/doc_tool.rb +5 -0
  18. data/lib/shared_tools/error_handling_tool.rb +4 -0
  19. data/lib/shared_tools/eval_tool.rb +5 -0
  20. data/lib/shared_tools/mcp/brave_search_client.rb +37 -0
  21. data/lib/shared_tools/mcp/chart_client.rb +32 -0
  22. data/lib/shared_tools/mcp/github_client.rb +38 -0
  23. data/lib/shared_tools/mcp/hugging_face_client.rb +43 -0
  24. data/lib/shared_tools/mcp/memory_client.rb +33 -0
  25. data/lib/shared_tools/mcp/notion_client.rb +40 -0
  26. data/lib/shared_tools/mcp/sequential_thinking_client.rb +33 -0
  27. data/lib/shared_tools/mcp/slack_client.rb +54 -0
  28. data/lib/shared_tools/mcp/streamable_http_patch.rb +42 -0
  29. data/lib/shared_tools/mcp/tavily_client.rb +41 -0
  30. data/lib/shared_tools/mcp.rb +45 -16
  31. data/lib/shared_tools/system_info_tool.rb +4 -0
  32. data/lib/shared_tools/tools/browser/base_tool.rb +8 -12
  33. data/lib/shared_tools/tools/browser/click_tool.rb +4 -2
  34. data/lib/shared_tools/tools/browser/ferrum_driver.rb +119 -0
  35. data/lib/shared_tools/tools/browser/inspect_tool.rb +4 -2
  36. data/lib/shared_tools/tools/browser/page_inspect_tool.rb +4 -2
  37. data/lib/shared_tools/tools/browser/page_screenshot_tool.rb +19 -7
  38. data/lib/shared_tools/tools/browser/selector_inspect_tool.rb +4 -2
  39. data/lib/shared_tools/tools/browser/text_field_area_set_tool.rb +4 -2
  40. data/lib/shared_tools/tools/browser/visit_tool.rb +4 -2
  41. data/lib/shared_tools/tools/browser.rb +31 -2
  42. data/lib/shared_tools/tools/browser_tool.rb +6 -0
  43. data/lib/shared_tools/tools/clipboard_tool.rb +69 -144
  44. data/lib/shared_tools/tools/composite_analysis_tool.rb +60 -4
  45. data/lib/shared_tools/tools/computer/mac_driver.rb +37 -4
  46. data/lib/shared_tools/tools/cron_tool.rb +237 -379
  47. data/lib/shared_tools/tools/current_date_time_tool.rb +54 -120
  48. data/lib/shared_tools/tools/data_science_kit.rb +63 -13
  49. data/lib/shared_tools/tools/dns_tool.rb +335 -269
  50. data/lib/shared_tools/tools/doc/docx_reader_tool.rb +107 -0
  51. data/lib/shared_tools/tools/doc/spreadsheet_reader_tool.rb +171 -0
  52. data/lib/shared_tools/tools/doc/text_reader_tool.rb +57 -0
  53. data/lib/shared_tools/tools/doc.rb +3 -0
  54. data/lib/shared_tools/tools/doc_tool.rb +101 -6
  55. data/lib/shared_tools/tools/docker/compose_run_tool.rb +1 -1
  56. data/lib/shared_tools/tools/enabler.rb +42 -0
  57. data/lib/shared_tools/tools/error_handling_tool.rb +3 -1
  58. data/lib/shared_tools/tools/notification/base_driver.rb +51 -0
  59. data/lib/shared_tools/tools/notification/linux_driver.rb +115 -0
  60. data/lib/shared_tools/tools/notification/mac_driver.rb +66 -0
  61. data/lib/shared_tools/tools/notification/null_driver.rb +29 -0
  62. data/lib/shared_tools/tools/notification.rb +12 -0
  63. data/lib/shared_tools/tools/notification_tool.rb +99 -0
  64. data/lib/shared_tools/tools/system_info_tool.rb +130 -343
  65. data/lib/shared_tools/tools/workflow_manager_tool.rb +32 -0
  66. data/lib/shared_tools/utilities.rb +193 -0
  67. data/lib/shared_tools/version.rb +1 -1
  68. data/lib/shared_tools/weather_tool.rb +4 -0
  69. data/lib/shared_tools/workflow_manager_tool.rb +4 -0
  70. data/lib/shared_tools.rb +28 -38
  71. metadata +74 -9
  72. data/lib/shared_tools/mcp/github_mcp_server.rb +0 -58
  73. data/lib/shared_tools/mcp/imcp.rb +0 -28
  74. data/lib/shared_tools/mcp/tavily_mcp_server.rb +0 -44
  75. data/lib/shared_tools/tools/devops_toolkit.rb +0 -420
@@ -0,0 +1,193 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # lib/shared_tools/utilities.rb
4
+ #
5
+ # General-purpose utility methods for SharedTools MCP clients and tools.
6
+ # Loaded automatically by lib/shared_tools.rb.
7
+
8
+ module SharedTools
9
+ MCP_LOG_MUTEX = Mutex.new
10
+ @mcp_load_log = {}
11
+
12
+ class << self
13
+
14
+ # ---------------------------------------------------------------------------
15
+ # MCP load tracking
16
+ # ---------------------------------------------------------------------------
17
+
18
+ # Record the outcome of loading a single MCP client.
19
+ # Called by mcp.rb from within each loader thread.
20
+ #
21
+ # SharedTools.record_mcp_result("tavily") # success
22
+ # SharedTools.record_mcp_result("notion", error: e) # failure
23
+ def record_mcp_result(name, error: nil)
24
+ MCP_LOG_MUTEX.synchronize do
25
+ @mcp_load_log[name] = error ? { status: :failed, reason: error.message } : { status: :ok }
26
+ end
27
+ end
28
+
29
+ # Returns an array of client names that loaded successfully.
30
+ #
31
+ # SharedTools.mcp_loaded #=> ["github", "memory", "chart"]
32
+ def mcp_loaded
33
+ MCP_LOG_MUTEX.synchronize { @mcp_load_log.select { |_, v| v[:status] == :ok }.keys }
34
+ end
35
+
36
+ # Returns a hash of client names that failed to load, mapped to their error messages.
37
+ #
38
+ # SharedTools.mcp_failed #=> {"tavily" => "Missing envars: TAVILY_API_KEY", ...}
39
+ def mcp_failed
40
+ MCP_LOG_MUTEX.synchronize do
41
+ @mcp_load_log.select { |_, v| v[:status] == :failed }.transform_values { |v| v[:reason] }
42
+ end
43
+ end
44
+
45
+ # Prints a summary table of MCP client load results and returns the full log hash.
46
+ #
47
+ # SharedTools.mcp_status
48
+ # # MCP Client Status
49
+ # # ✓ github
50
+ # # ✓ memory
51
+ # # ✗ tavily — Missing envars: TAVILY_API_KEY
52
+ def mcp_status
53
+ log = MCP_LOG_MUTEX.synchronize { @mcp_load_log.dup }
54
+
55
+ if log.empty?
56
+ puts "No MCP clients have been loaded yet. Try: require 'shared_tools/mcp'"
57
+ return log
58
+ end
59
+
60
+ puts "MCP Client Status"
61
+ puts "-" * 40
62
+ log.sort.each do |name, entry|
63
+ if entry[:status] == :ok
64
+ puts " \u2713 #{name}"
65
+ else
66
+ puts " \u2717 #{name} \u2014 #{entry[:reason]}"
67
+ end
68
+ end
69
+ puts "-" * 40
70
+ puts " #{log.count { |_, v| v[:status] == :ok }} loaded, " \
71
+ "#{log.count { |_, v| v[:status] == :failed }} skipped"
72
+
73
+ log
74
+ end
75
+
76
+ # Returns true if all named environment variables are set and non-empty.
77
+ # Warns for each missing variable and returns false if any are absent.
78
+ #
79
+ # SharedTools.verify_envars("GITHUB_PERSONAL_ACCESS_TOKEN")
80
+ # SharedTools.verify_envars("TAVILY_API_KEY", "ANOTHER_KEY")
81
+ def verify_envars(*names)
82
+ missing = names.select { |n| ENV.fetch(n, "").empty? }
83
+ missing.each { |n| warn "SharedTools — #{n} is not set" }
84
+ unless missing.empty?
85
+ raise LoadError, "Missing envars: #{missing.join(', ')}"
86
+ end
87
+ end
88
+
89
+ # High-level package installer. Detects the current platform and calls the
90
+ # appropriate *_install method. Raises LoadError if any package cannot be installed.
91
+ #
92
+ # SharedTools.package_install("github-mcp-server")
93
+ # SharedTools.package_install("curl", "jq")
94
+ def package_install(*packages)
95
+ case RUBY_PLATFORM
96
+ when /darwin/
97
+ brew_install(*packages)
98
+ when /linux/
99
+ if system("which apt-get > /dev/null 2>&1")
100
+ apt_install(*packages)
101
+ elsif system("which dnf > /dev/null 2>&1")
102
+ dnf_install(*packages)
103
+ elsif system("which brew > /dev/null 2>&1")
104
+ brew_install(*packages)
105
+ else
106
+ raise LoadError, "No supported package manager found (apt-get, dnf, brew)"
107
+ end
108
+ else
109
+ raise LoadError, "Unsupported platform: #{RUBY_PLATFORM}"
110
+ end
111
+ end
112
+
113
+ # Ensures each named binary is available in PATH, installing via brew if missing.
114
+ # Raises LoadError if brew is not installed or any package install fails.
115
+ #
116
+ # SharedTools.brew_install("github-mcp-server")
117
+ # SharedTools.brew_install("gh", "jq")
118
+ def brew_install(*packages)
119
+ raise LoadError, "Homebrew is not installed (https://brew.sh)" unless system("which brew > /dev/null 2>&1")
120
+
121
+ packages.each do |pkg|
122
+ next unless `brew list --versions #{pkg} 2>/dev/null`.strip.empty?
123
+
124
+ warn "SharedTools — #{pkg} not found, installing via brew..."
125
+ raise LoadError, "#{pkg} could not be installed" unless system("brew install --quiet #{pkg} > /dev/null 2>&1")
126
+ end
127
+ end
128
+
129
+ # Ensures each named binary is available in PATH, installing via apt-get if missing.
130
+ # Raises LoadError if any package install fails.
131
+ #
132
+ # SharedTools.apt_install("curl")
133
+ # SharedTools.apt_install("curl", "jq")
134
+ def apt_install(*packages)
135
+ packages.each do |pkg|
136
+ # SMELL: what if package is a library?
137
+ next if system("which #{pkg} > /dev/null 2>&1")
138
+
139
+ warn "SharedTools — #{pkg} not found, installing via apt-get..."
140
+ raise LoadError, "#{pkg} could not be installed" unless system("sudo apt-get install -y -q #{pkg} > /dev/null 2>&1")
141
+ end
142
+ end
143
+
144
+ # Ensures each named binary is available in PATH, installing via dnf if missing.
145
+ # Raises LoadError if any package install fails.
146
+ #
147
+ # SharedTools.dnf_install("curl")
148
+ # SharedTools.dnf_install("curl", "jq")
149
+ def dnf_install(*packages)
150
+ packages.each do |pkg|
151
+ # SMELL: What if package is a library?
152
+ next if system("which #{pkg} > /dev/null 2>&1")
153
+
154
+ warn "SharedTools — #{pkg} not found, installing via dnf..."
155
+ raise LoadError, "#{pkg} could not be installed" unless system("sudo dnf install -y -q #{pkg} > /dev/null 2>&1")
156
+ end
157
+ end
158
+
159
+ # Ensures each named npm package binary is available in PATH, installing
160
+ # globally via npm if missing. Raises LoadError if npm is not found or any install fails.
161
+ #
162
+ # SharedTools.npm_install("typescript")
163
+ # SharedTools.npm_install("typescript", "ts-node")
164
+ def npm_install(*packages)
165
+ raise LoadError, "npm is not installed (https://nodejs.org)" unless system("which npm > /dev/null 2>&1")
166
+
167
+ packages.each do |pkg|
168
+ # SMELL: What if package is a library?
169
+ next if system("which #{pkg} > /dev/null 2>&1")
170
+
171
+ warn "SharedTools — #{pkg} not found, installing via npm..."
172
+ raise LoadError, "#{pkg} could not be installed" unless system("npm install -g --silent #{pkg} > /dev/null 2>&1")
173
+ end
174
+ end
175
+
176
+ # Ensures each named gem is available, installing via gem install if missing.
177
+ # Raises LoadError if gem is not available or any install fails.
178
+ #
179
+ # SharedTools.gem_install("nokogiri")
180
+ # SharedTools.gem_install("nokogiri", "oj")
181
+ def gem_install(*packages)
182
+ raise LoadError, "gem is not available" unless system("which gem > /dev/null 2>&1")
183
+
184
+ packages.each do |pkg|
185
+ next if system("gem list -i #{pkg} > /dev/null 2>&1")
186
+
187
+ warn "SharedTools — #{pkg} not found, installing via gem..."
188
+ raise LoadError, "#{pkg} could not be installed" unless system("gem install --silent #{pkg} > /dev/null 2>&1")
189
+ end
190
+ end
191
+
192
+ end
193
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SharedTools
4
- VERSION = "0.3.1"
4
+ VERSION = "0.4.1"
5
5
  end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+ # Shim: require 'shared_tools/weather_tool'
3
+ require 'shared_tools'
4
+ require 'shared_tools/tools/weather_tool'
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+ # Shim: require 'shared_tools/workflow_manager_tool'
3
+ require 'shared_tools'
4
+ require 'shared_tools/tools/workflow_manager_tool'
data/lib/shared_tools.rb CHANGED
@@ -17,54 +17,27 @@ SharedToolsLoader.ignore("#{__dir__}/shared_tools/tools/disk.rb")
17
17
  SharedToolsLoader.ignore("#{__dir__}/shared_tools/tools/doc.rb")
18
18
  SharedToolsLoader.ignore("#{__dir__}/shared_tools/tools/docker.rb")
19
19
  SharedToolsLoader.ignore("#{__dir__}/shared_tools/tools/eval.rb")
20
+ SharedToolsLoader.ignore("#{__dir__}/shared_tools/tools/notification.rb")
20
21
  SharedToolsLoader.ignore("#{__dir__}/shared_tools/tools/version.rb") # Defines VERSION constant, not Version class
21
22
  SharedToolsLoader.ignore("#{__dir__}/shared_tools/tools/incomplete") # Empty/incomplete tools directory
23
+ SharedToolsLoader.ignore("#{__dir__}/shared_tools/tools/enabler.rb") # Experimental; defines Tools::Enabler not SharedTools::Tools::Enabler
24
+
25
+ # Ignore per-tool shim files (require-path shortcuts: require 'shared_tools/<tool_name>')
26
+ Dir.glob("#{__dir__}/shared_tools/*_tool.rb").each { |f| SharedToolsLoader.ignore(f) }
27
+ SharedToolsLoader.ignore("#{__dir__}/shared_tools/data_science_kit.rb")
28
+ SharedToolsLoader.ignore("#{__dir__}/shared_tools/database.rb")
29
+ SharedToolsLoader.ignore("#{__dir__}/shared_tools/utilities.rb") # Reopens SharedTools, not SharedTools::Utilities
30
+
22
31
  SharedToolsLoader.setup
23
32
 
24
33
  module SharedTools
25
- @auto_execute ||= true # Auto-execute by default, no human-in-the-loop
26
-
34
+ @auto_execute ||= true # Auto-execute by default, no human-in-the-loop
27
35
  class << self
36
+
28
37
  def auto_execute(wildwest=true)
29
38
  @auto_execute = wildwest
30
39
  end
31
40
 
32
- # Load all tool classes so they're available via ObjectSpace
33
- # Call this when using AIA with --rq shared_tools
34
- # Uses manual loading to gracefully handle missing dependencies
35
- def load_all_tools
36
- tools_dir = File.join(__dir__, 'shared_tools', 'tools')
37
- Dir.glob(File.join(tools_dir, '*_tool.rb')).each do |tool_file|
38
- begin
39
- require tool_file
40
- rescue LoadError => e
41
- # Skip tools with missing dependencies
42
- warn "SharedTools: Skipping #{File.basename(tool_file)} - #{e.message}" if ENV['DEBUG']
43
- end
44
- end
45
- end
46
-
47
- # Get all available tool classes (those that inherit from RubyLLM::Tool)
48
- # Only returns tools that can be successfully instantiated without arguments (RubyLLM requirement)
49
- def tools
50
- load_all_tools
51
- ObjectSpace.each_object(Class).select do |klass|
52
- next false unless klass < RubyLLM::Tool
53
- next false unless klass.to_s.start_with?('SharedTools::')
54
-
55
- # Actually try to instantiate the tool to verify it works
56
- # RubyLLM calls tool.new without args, so tools must be instantiable this way
57
- begin
58
- klass.new
59
- true
60
- rescue ArgumentError, LoadError, StandardError => e
61
- # Skip tools that can't be instantiated (missing args, missing platform drivers, etc.)
62
- warn "SharedTools: Excluding #{klass} - #{e.message}" if ENV['DEBUG']
63
- false
64
- end
65
- end
66
- end
67
-
68
41
  def execute?(tool: 'unknown', stuff: '')
69
42
  # Return true if auto_execute is explicitly enabled
70
43
  return true if @auto_execute == true
@@ -78,5 +51,22 @@ module SharedTools
78
51
  print "\nIs it okay to proceed? (y/N"
79
52
  STDIN.getch == "y"
80
53
  end
54
+
55
+ # Force-load all tool classes into ObjectSpace.
56
+ # Called by AIA's GemActivator.trigger_tool_loading when shared_tools is
57
+ # passed to --require. Without this, Zeitwerk lazy-loads classes on first
58
+ # reference, so no RubyLLM::Tool subclasses appear in ObjectSpace at scan time.
59
+ def load_all_tools
60
+ SharedToolsLoader.eager_load
61
+ end
62
+
63
+ # Return all loaded RubyLLM::Tool subclasses provided by this gem.
64
+ # Also triggers eager loading so the list is complete.
65
+ def tools
66
+ load_all_tools
67
+ ObjectSpace.each_object(Class).select { |k| k < ::RubyLLM::Tool }.to_a
68
+ end
81
69
  end
82
70
  end
71
+
72
+ require_relative "shared_tools/utilities"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shared_tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dewayne VanHoozer
@@ -122,7 +122,21 @@ dependencies:
122
122
  - !ruby/object:Gem::Version
123
123
  version: '0'
124
124
  - !ruby/object:Gem::Dependency
125
- name: sqlite3
125
+ name: docx
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ type: :development
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: roo
126
140
  requirement: !ruby/object:Gem::Requirement
127
141
  requirements:
128
142
  - - ">="
@@ -136,7 +150,7 @@ dependencies:
136
150
  - !ruby/object:Gem::Version
137
151
  version: '0'
138
152
  - !ruby/object:Gem::Dependency
139
- name: watir
153
+ name: sqlite3
140
154
  requirement: !ruby/object:Gem::Requirement
141
155
  requirements:
142
156
  - - ">="
@@ -150,7 +164,7 @@ dependencies:
150
164
  - !ruby/object:Gem::Version
151
165
  version: '0'
152
166
  - !ruby/object:Gem::Dependency
153
- name: webdrivers
167
+ name: ferrum
154
168
  requirement: !ruby/object:Gem::Requirement
155
169
  requirements:
156
170
  - - ">="
@@ -219,6 +233,20 @@ dependencies:
219
233
  - - ">="
220
234
  - !ruby/object:Gem::Version
221
235
  version: '0'
236
+ - !ruby/object:Gem::Dependency
237
+ name: minitest-mock
238
+ requirement: !ruby/object:Gem::Requirement
239
+ requirements:
240
+ - - ">="
241
+ - !ruby/object:Gem::Version
242
+ version: '0'
243
+ type: :development
244
+ prerelease: false
245
+ version_requirements: !ruby/object:Gem::Requirement
246
+ requirements:
247
+ - - ">="
248
+ - !ruby/object:Gem::Version
249
+ version: '0'
222
250
  - !ruby/object:Gem::Dependency
223
251
  name: rake
224
252
  requirement: !ruby/object:Gem::Requirement
@@ -246,10 +274,34 @@ files:
246
274
  - LICENSE
247
275
  - README.md
248
276
  - lib/shared_tools.rb
277
+ - lib/shared_tools/browser_tool.rb
278
+ - lib/shared_tools/calculator_tool.rb
279
+ - lib/shared_tools/clipboard_tool.rb
280
+ - lib/shared_tools/composite_analysis_tool.rb
281
+ - lib/shared_tools/computer_tool.rb
282
+ - lib/shared_tools/cron_tool.rb
283
+ - lib/shared_tools/current_date_time_tool.rb
284
+ - lib/shared_tools/data_science_kit.rb
285
+ - lib/shared_tools/database.rb
286
+ - lib/shared_tools/database_query_tool.rb
287
+ - lib/shared_tools/database_tool.rb
288
+ - lib/shared_tools/disk_tool.rb
289
+ - lib/shared_tools/dns_tool.rb
290
+ - lib/shared_tools/doc_tool.rb
291
+ - lib/shared_tools/error_handling_tool.rb
292
+ - lib/shared_tools/eval_tool.rb
249
293
  - lib/shared_tools/mcp.rb
250
- - lib/shared_tools/mcp/github_mcp_server.rb
251
- - lib/shared_tools/mcp/imcp.rb
252
- - lib/shared_tools/mcp/tavily_mcp_server.rb
294
+ - lib/shared_tools/mcp/brave_search_client.rb
295
+ - lib/shared_tools/mcp/chart_client.rb
296
+ - lib/shared_tools/mcp/github_client.rb
297
+ - lib/shared_tools/mcp/hugging_face_client.rb
298
+ - lib/shared_tools/mcp/memory_client.rb
299
+ - lib/shared_tools/mcp/notion_client.rb
300
+ - lib/shared_tools/mcp/sequential_thinking_client.rb
301
+ - lib/shared_tools/mcp/slack_client.rb
302
+ - lib/shared_tools/mcp/streamable_http_patch.rb
303
+ - lib/shared_tools/mcp/tavily_client.rb
304
+ - lib/shared_tools/system_info_tool.rb
253
305
  - lib/shared_tools/tools.rb
254
306
  - lib/shared_tools/tools/browser.rb
255
307
  - lib/shared_tools/tools/browser/base_driver.rb
@@ -257,6 +309,7 @@ files:
257
309
  - lib/shared_tools/tools/browser/click_tool.rb
258
310
  - lib/shared_tools/tools/browser/elements/element_grouper.rb
259
311
  - lib/shared_tools/tools/browser/elements/nearby_element_detector.rb
312
+ - lib/shared_tools/tools/browser/ferrum_driver.rb
260
313
  - lib/shared_tools/tools/browser/formatters/action_formatter.rb
261
314
  - lib/shared_tools/tools/browser/formatters/data_entry_formatter.rb
262
315
  - lib/shared_tools/tools/browser/formatters/element_formatter.rb
@@ -293,7 +346,6 @@ files:
293
346
  - lib/shared_tools/tools/database/sqlite_driver.rb
294
347
  - lib/shared_tools/tools/database_query_tool.rb
295
348
  - lib/shared_tools/tools/database_tool.rb
296
- - lib/shared_tools/tools/devops_toolkit.rb
297
349
  - lib/shared_tools/tools/disk.rb
298
350
  - lib/shared_tools/tools/disk/base_driver.rb
299
351
  - lib/shared_tools/tools/disk/base_tool.rb
@@ -311,23 +363,36 @@ files:
311
363
  - lib/shared_tools/tools/disk_tool.rb
312
364
  - lib/shared_tools/tools/dns_tool.rb
313
365
  - lib/shared_tools/tools/doc.rb
366
+ - lib/shared_tools/tools/doc/docx_reader_tool.rb
314
367
  - lib/shared_tools/tools/doc/pdf_reader_tool.rb
368
+ - lib/shared_tools/tools/doc/spreadsheet_reader_tool.rb
369
+ - lib/shared_tools/tools/doc/text_reader_tool.rb
315
370
  - lib/shared_tools/tools/doc_tool.rb
316
371
  - lib/shared_tools/tools/docker.rb
317
372
  - lib/shared_tools/tools/docker/base_tool.rb
318
373
  - lib/shared_tools/tools/docker/compose_run_tool.rb
374
+ - lib/shared_tools/tools/enabler.rb
319
375
  - lib/shared_tools/tools/error_handling_tool.rb
320
376
  - lib/shared_tools/tools/eval.rb
321
377
  - lib/shared_tools/tools/eval/python_eval_tool.rb
322
378
  - lib/shared_tools/tools/eval/ruby_eval_tool.rb
323
379
  - lib/shared_tools/tools/eval/shell_eval_tool.rb
324
380
  - lib/shared_tools/tools/eval_tool.rb
381
+ - lib/shared_tools/tools/notification.rb
382
+ - lib/shared_tools/tools/notification/base_driver.rb
383
+ - lib/shared_tools/tools/notification/linux_driver.rb
384
+ - lib/shared_tools/tools/notification/mac_driver.rb
385
+ - lib/shared_tools/tools/notification/null_driver.rb
386
+ - lib/shared_tools/tools/notification_tool.rb
325
387
  - lib/shared_tools/tools/secure_tool_template.rb
326
388
  - lib/shared_tools/tools/system_info_tool.rb
327
389
  - lib/shared_tools/tools/version.rb
328
390
  - lib/shared_tools/tools/weather_tool.rb
329
391
  - lib/shared_tools/tools/workflow_manager_tool.rb
392
+ - lib/shared_tools/utilities.rb
330
393
  - lib/shared_tools/version.rb
394
+ - lib/shared_tools/weather_tool.rb
395
+ - lib/shared_tools/workflow_manager_tool.rb
331
396
  homepage: https://github.com/madbomber/shared_tools
332
397
  licenses:
333
398
  - MIT
@@ -349,7 +414,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
349
414
  - !ruby/object:Gem::Version
350
415
  version: '0'
351
416
  requirements: []
352
- rubygems_version: 4.0.1
417
+ rubygems_version: 4.0.9
353
418
  specification_version: 4
354
419
  summary: Shared utilities and AI tools for Ruby applications with configurable logging
355
420
  test_files: []
@@ -1,58 +0,0 @@
1
- # shared_tools/mcp/github_mcp_server.rb
2
- #
3
- # GitHub MCP Server Client Configuration for ruby_llm-mcp >= 0.7.0
4
- #
5
- # Provides access to GitHub operations including:
6
- # - Repository management
7
- # - Issue and PR operations
8
- # - Code search
9
- # - Branch operations
10
- # - And more GitHub API functionality
11
- #
12
- # Installation:
13
- # brew install github-mcp-server
14
- #
15
- # Configuration:
16
- # Set environment variable: GITHUB_PERSONAL_ACCESS_TOKEN
17
- # export GITHUB_PERSONAL_ACCESS_TOKEN=your_token_here
18
- #
19
- # Compatible with ruby_llm-mcp v0.7.0+
20
-
21
- require "ruby_llm/mcp"
22
-
23
- RubyLLM::MCP.add_client(
24
- name: "github-mcp-server",
25
- transport_type: :stdio,
26
- config: {
27
- command: "/opt/homebrew/bin/github-mcp-server",
28
- args: %w[stdio],
29
- env: { "GITHUB_PERSONAL_ACCESS_TOKEN" => ENV.fetch("GITHUB_PERSONAL_ACCESS_TOKEN") },
30
- },
31
- )
32
-
33
-
34
- __END__
35
-
36
-
37
- A GitHub MCP server that handles various tools and resources.
38
-
39
- Usage:
40
- server [command]
41
-
42
- Available Commands:
43
- completion Generate the autocompletion script for the specified shell
44
- help Help about any command
45
- stdio Start stdio server
46
-
47
- Flags:
48
- --dynamic-toolsets Enable dynamic toolsets
49
- --enable-command-logging When enabled, the server will log all command requests and responses to the log file
50
- --export-translations Save translations to a JSON file
51
- --gh-host string Specify the GitHub hostname (for GitHub Enterprise etc.)
52
- -h, --help help for server
53
- --log-file string Path to log file
54
- --read-only Restrict the server to read-only operations
55
- --toolsets strings An optional comma separated list of groups of tools to allow, defaults to enabling all (default [all])
56
- -v, --version version for server
57
-
58
- Use "server [command] --help" for more information about a command.
@@ -1,28 +0,0 @@
1
- # shared_tools/mcp/imcp.rb
2
- #
3
- # iMCP Client Configuration for ruby_llm-mcp >= 0.7.0
4
- #
5
- # iMCP is a macOS application that provides MCP access to:
6
- # - Notes
7
- # - Calendar
8
- # - Contacts
9
- # - Reminders
10
- # - And other macOS native applications
11
- #
12
- # Installation:
13
- # brew install --cask loopwork/tap/iMCP
14
- #
15
- # Documentation:
16
- # https://github.com/loopwork/iMCP
17
- #
18
- # Compatible with ruby_llm-mcp v0.7.0+
19
-
20
- require 'ruby_llm/mcp'
21
-
22
- RubyLLM::MCP.add_client(
23
- name: "imcp-server",
24
- transport_type: :stdio,
25
- config: {
26
- command: "/Applications/iMCP.app/Contents/MacOS/imcp-server 2> /dev/null"
27
- }
28
- )
@@ -1,44 +0,0 @@
1
- # shared_tools/mcp/tavily_mcp_server.rb
2
- #
3
- # Tavily MCP Server Client Configuration for ruby_llm-mcp >= 0.7.0
4
- #
5
- # Provides AI-powered web search and research capabilities:
6
- # - Web search with AI-optimized results
7
- # - Research-grade content extraction
8
- # - Real-time information gathering
9
- # - News and current events search
10
- #
11
- # Installation:
12
- # Requires Node.js and npx (comes with Node.js)
13
- # The mcp-remote package will be installed automatically via npx
14
- #
15
- # Configuration:
16
- # Set environment variable: TAVILY_API_KEY
17
- # export TAVILY_API_KEY=your_api_key_here
18
- # Get your API key at: https://tavily.com
19
- #
20
- # Compatible with ruby_llm-mcp v0.7.0+
21
-
22
- require "ruby_llm/mcp"
23
-
24
- RubyLLM::MCP.add_client(
25
- name: "tavily",
26
- transport_type: :stdio,
27
- config: {
28
- command: "npx -y mcp-remote https://mcp.tavily.com/mcp/?tavilyApiKey=#{ENV.fetch('TAVILY_API_KEY')}",
29
- env: {}
30
- }
31
- )
32
-
33
-
34
- __END__
35
-
36
-
37
- # {
38
- # "mcpServers": {
39
- # "tavily-remote-mcp": {
40
- # "command": "npx -y mcp-remote https://mcp.tavily.com/mcp/?tavilyApiKey=$TAVILY_API_KEY",
41
- # "env": {}
42
- # }
43
- # }
44
- # }