stimulus_plumbers_mcp 0.4.11 → 0.4.13

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4264c09824d1dac3bf2009e90bb925f83687e73d803f4d48fac9b77399282f39
4
- data.tar.gz: 3990955ed15ca78cdb8682336156e886da628f48fbf4c2a7afba2b8fc859d7c4
3
+ metadata.gz: 68e06f1fca6808050f3876dd1b702a6f685c82402333e9f20eed3c8189f0c6a3
4
+ data.tar.gz: fb8d36d0973c69d545a75f26c9f0189a263a2a12e2fc5f14f4c4f02ea2121333
5
5
  SHA512:
6
- metadata.gz: e63b73265eb2bf7f4b4615a73448e114de0438b8b4c17040b9560331619487f0b2b7ed560f83ca1a77f974e96f397144c57224ee91bbde13bf6f4c0fe968ef11
7
- data.tar.gz: cf9d7983cb0021c4c679b24ece1ba7296eaf830667b551e00071d764a51a47bfcefb3d230b4291976214b0973efdb6de8ab96febe02dd9cbdd17cdaee0f208e3
6
+ metadata.gz: c338b7ad747e663083818043b9e13ee4cccaac092a357bda1edb320c0f6a3f30608a0f9b530d58e6c55c651f1e11eb225de90500bc1e97f1f8a2feca40e7ac5c
7
+ data.tar.gz: 662348ce1dc9703ee9ca27a31f82abe40445f600732fdc55e1a8efb476f348a1515d1b16e6e2bbe0c07ac1098568d4db73835f3a1716a74650878018bd455f52
@@ -3,10 +3,12 @@
3
3
  module StimulusPlumbers
4
4
  module MCP
5
5
  module CLI
6
- def self.run
7
- server = Server.build
8
- warn "[stimulus-plumbers-mcp] server started (version #{VERSION})"
9
- ::MCP::Server::Transports::StdioTransport.new(server).open
6
+ class << self
7
+ def run
8
+ server = Server.build
9
+ warn "[stimulus-plumbers-mcp] server started (version #{VERSION})"
10
+ ::MCP::Server::Transports::StdioTransport.new(server).open
11
+ end
10
12
  end
11
13
  end
12
14
  end
@@ -7,11 +7,13 @@ module StimulusPlumbers
7
7
  module GemVendorPath
8
8
  GEM_NAME = "stimulus_plumbers"
9
9
 
10
- def self.resolve(*relative)
11
- gem_dir = Gem::Specification.find_by_name(GEM_NAME).gem_dir
12
- File.join(gem_dir, "vendor", *relative)
13
- rescue Gem::MissingSpecError
14
- nil
10
+ class << self
11
+ def resolve(*relative)
12
+ gem_dir = Gem::Specification.find_by_name(GEM_NAME).gem_dir
13
+ File.join(gem_dir, "vendor", *relative)
14
+ rescue Gem::MissingSpecError
15
+ nil
16
+ end
15
17
  end
16
18
  end
17
19
  end
@@ -5,9 +5,13 @@ module StimulusPlumbers
5
5
  module Plugins
6
6
  class Aria < Base
7
7
  class << self
8
- def loader_key = :aria
8
+ def loader_key
9
+ :aria
10
+ end
9
11
 
10
- def loader = AriaLoader
12
+ def loader
13
+ AriaLoader
14
+ end
11
15
 
12
16
  def static_resources
13
17
  [
@@ -21,11 +21,16 @@ module StimulusPlumbers
21
21
  raise NotImplementedError, "#{name} must define .read"
22
22
  end
23
23
 
24
- def static_resources = []
24
+ def static_resources
25
+ []
26
+ end
25
27
 
26
- def dynamic_resource_templates = []
28
+ def dynamic_resource_templates
29
+ []
30
+ end
27
31
 
28
- def register_tools(_server, _store); end
32
+ def register_tools(_server, _store)
33
+ end
29
34
 
30
35
  def not_found(message)
31
36
  NotFound.new(message)
@@ -5,9 +5,13 @@ module StimulusPlumbers
5
5
  module Plugins
6
6
  class ComponentDocs < Base
7
7
  class << self
8
- def loader_key = :component_docs
8
+ def loader_key
9
+ :component_docs
10
+ end
9
11
 
10
- def loader = ComponentDocsLoader
12
+ def loader
13
+ ComponentDocsLoader
14
+ end
11
15
 
12
16
  def dynamic_resource_templates
13
17
  [
@@ -5,9 +5,13 @@ module StimulusPlumbers
5
5
  module Plugins
6
6
  class ComponentSchema < Base
7
7
  class << self
8
- def loader_key = :component_schema
8
+ def loader_key
9
+ :component_schema
10
+ end
9
11
 
10
- def loader = ComponentSchemaLoader
12
+ def loader
13
+ ComponentSchemaLoader
14
+ end
11
15
 
12
16
  def static_resources
13
17
  [
@@ -5,9 +5,13 @@ module StimulusPlumbers
5
5
  module Plugins
6
6
  class ComponentTheme < Base
7
7
  class << self
8
- def loader_key = :component_theme
8
+ def loader_key
9
+ :component_theme
10
+ end
9
11
 
10
- def loader = ComponentThemeLoader
12
+ def loader
13
+ ComponentThemeLoader
14
+ end
11
15
 
12
16
  def static_resources
13
17
  [
@@ -8,9 +8,13 @@ module StimulusPlumbers
8
8
  # narrative markdown, grouped by controller family, not individual identifier).
9
9
  class ControllerDocs < Base
10
10
  class << self
11
- def loader_key = :controller_docs
11
+ def loader_key
12
+ :controller_docs
13
+ end
12
14
 
13
- def loader = ControllerDocsLoader
15
+ def loader
16
+ ControllerDocsLoader
17
+ end
14
18
 
15
19
  def static_resources
16
20
  [
@@ -5,9 +5,13 @@ module StimulusPlumbers
5
5
  module Plugins
6
6
  class ControllerSchema < Base
7
7
  class << self
8
- def loader_key = :controller_schema
8
+ def loader_key
9
+ :controller_schema
10
+ end
9
11
 
10
- def loader = ControllerSchemaLoader
12
+ def loader
13
+ ControllerSchemaLoader
14
+ end
11
15
 
12
16
  def static_resources
13
17
  [
@@ -7,9 +7,13 @@ module StimulusPlumbers
7
7
  GUIDE_NAMES = %w[component controller tailwind theme].freeze
8
8
 
9
9
  class << self
10
- def loader_key = :guide
10
+ def loader_key
11
+ :guide
12
+ end
11
13
 
12
- def loader = GuideLoader
14
+ def loader
15
+ GuideLoader
16
+ end
13
17
 
14
18
  def static_resources
15
19
  [
@@ -5,9 +5,13 @@ module StimulusPlumbers
5
5
  module Plugins
6
6
  class Icons < Base
7
7
  class << self
8
- def loader_key = :icons
8
+ def loader_key
9
+ :icons
10
+ end
9
11
 
10
- def loader = IconsLoader
12
+ def loader
13
+ IconsLoader
14
+ end
11
15
 
12
16
  def static_resources
13
17
  [
@@ -5,9 +5,13 @@ module StimulusPlumbers
5
5
  module Plugins
6
6
  class Tailwind < Base
7
7
  class << self
8
- def loader_key = :tailwind
8
+ def loader_key
9
+ :tailwind
10
+ end
9
11
 
10
- def loader = TailwindLoader
12
+ def loader
13
+ TailwindLoader
14
+ end
11
15
 
12
16
  def static_resources
13
17
  [
@@ -5,9 +5,13 @@ module StimulusPlumbers
5
5
  module Plugins
6
6
  class Versions < Base
7
7
  class << self
8
- def loader_key = :versions
8
+ def loader_key
9
+ :versions
10
+ end
9
11
 
10
- def loader = VersionsLoader
12
+ def loader
13
+ VersionsLoader
14
+ end
11
15
 
12
16
  def static_resources
13
17
  [
@@ -19,64 +19,68 @@ module StimulusPlumbers
19
19
  Plugins::Versions
20
20
  ].freeze
21
21
 
22
- INSTRUCTIONS = "Use these resources and tools for accurate API references when " \
23
- "generating Rails/ERB view code with the stimulus-plumbers UI library. " \
24
- "Read guide://overview first for a map of the form/view/stimulus API."
22
+ INSTRUCTIONS = <<~MSG.strip
23
+ Use these resources and tools for accurate API references when
24
+ generating Rails/ERB view code with the stimulus-plumbers UI library.
25
+ Read guide://overview first for a map of the form/view/stimulus API.
26
+ MSG
25
27
 
26
- def self.build
27
- store = build_store
28
- report_sources(store)
28
+ class << self
29
+ def build
30
+ store = build_store
31
+ report_sources(store)
29
32
 
30
- server = new_server
31
- server.resources_read_handler do |params|
32
- PLUGINS.lazy.filter_map { |plugin| plugin.read(params[:uri], store) }.first ||
33
- unknown_resource(params[:uri])
33
+ server = new_server
34
+ server.resources_read_handler do |params|
35
+ PLUGINS.lazy.filter_map { |plugin| plugin.read(params[:uri], store) }.first ||
36
+ unknown_resource(params[:uri])
37
+ end
38
+ PLUGINS.each { |plugin| plugin.register_tools(server, store) }
39
+ server
34
40
  end
35
- PLUGINS.each { |plugin| plugin.register_tools(server, store) }
36
- server
37
- end
38
41
 
39
- def self.build_store
40
- PLUGINS.to_h { |plugin| [plugin.loader_key, plugin.loader.call] }
41
- end
42
+ def build_store
43
+ PLUGINS.to_h { |plugin| [plugin.loader_key, plugin.loader.call] }
44
+ end
42
45
 
43
- def self.unknown_resource(uri)
44
- message = "unknown resource: #{uri} — read guide://overview for a map of available resources"
45
- [{ uri: uri, mimeType: "application/json", text: JSON.generate(error: message) }]
46
- end
46
+ def unknown_resource(uri)
47
+ message = "unknown resource: #{uri} — read guide://overview for a map of available resources"
48
+ [{ uri: uri, mimeType: "application/json", text: JSON.generate(error: message) }]
49
+ end
47
50
 
48
- def self.new_server
49
- ::MCP::Server.new(
50
- name: "stimulus-plumbers",
51
- version: StimulusPlumbers::MCP::VERSION,
52
- instructions: INSTRUCTIONS,
53
- resources: PLUGINS.flat_map(&:static_resources),
54
- resource_templates: PLUGINS.flat_map(&:dynamic_resource_templates)
55
- )
56
- end
51
+ def new_server
52
+ ::MCP::Server.new(
53
+ name: "stimulus-plumbers",
54
+ version: StimulusPlumbers::MCP::VERSION,
55
+ instructions: INSTRUCTIONS,
56
+ resources: PLUGINS.flat_map(&:static_resources),
57
+ resource_templates: PLUGINS.flat_map(&:dynamic_resource_templates)
58
+ )
59
+ end
57
60
 
58
- # Loaders fail soft (sibling paths may be absent), so report what resolved
59
- # and warn loudly on any empty source instead of starting silently wrong.
60
- def self.report_sources(store)
61
- summary = store.map { |key, value| "#{key}=#{source_size(value)}" }.join(" ")
62
- StimulusPlumbers::Logger.info("sources: #{summary}")
63
- store.each_key do |key|
64
- StimulusPlumbers::Logger.warn("source '#{key}' is empty") if empty_source?(store[key])
61
+ # Loaders fail soft (sibling paths may be absent), so report what resolved
62
+ # and warn loudly on any empty source instead of starting silently wrong.
63
+ def report_sources(store)
64
+ summary = store.map { |key, value| "#{key}=#{source_size(value)}" }.join(" ")
65
+ StimulusPlumbers::Logger.info("sources: #{summary}")
66
+ store.each_key do |key|
67
+ StimulusPlumbers::Logger.warn("source '#{key}' is empty") if empty_source?(store[key])
68
+ end
65
69
  end
66
- end
67
70
 
68
- def self.source_size(value)
69
- case value
70
- when String then value.empty? ? 0 : "ok"
71
- when Hash then value.key?(:components) ? value[:components].size : value.size
72
- when Enumerable then value.size
73
- else value.nil? ? 0 : 1
71
+ def source_size(value)
72
+ case value
73
+ when String then value.empty? ? 0 : "ok"
74
+ when Hash then value.key?(:components) ? value[:components].size : value.size
75
+ when Enumerable then value.size
76
+ else value.nil? ? 0 : 1
77
+ end
74
78
  end
75
- end
76
79
 
77
- def self.empty_source?(value)
78
- content = value.is_a?(Hash) && value.key?(:components) ? value[:components] : value
79
- content.respond_to?(:empty?) && content.empty?
80
+ def empty_source?(value)
81
+ content = value.is_a?(Hash) && value.key?(:components) ? value[:components] : value
82
+ content.respond_to?(:empty?) && content.empty?
83
+ end
80
84
  end
81
85
  end
82
86
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module StimulusPlumbers
4
4
  module MCP
5
- VERSION = "0.4.11"
5
+ VERSION = "0.4.13"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stimulus_plumbers_mcp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.11
4
+ version: 0.4.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Chang