lex-adapter 0.1.1 → 0.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9ad72da4328d17f6ff4ea47db389e0fd7657f4e136ed9eb6b1ff8c65b74b83a1
4
- data.tar.gz: dbb87f253a93eb5c3bcdd0671ad6d65eb016f641a1836558af94e9b199fb5a01
3
+ metadata.gz: c6c7c92916a737f3a06a86540f8a893174c001f272acfeedb46a89e67ac62f5b
4
+ data.tar.gz: ff0b7e9852b32d01e90339029c446cd55be6384b7953d9d5ea78d8c0bd16e339
5
5
  SHA512:
6
- metadata.gz: ab80d58bf48b68dafb888814da2eba3dc013502543ac3daf7631c8f7b8ec7d4668158d425cc81cd5f2c111bd5e5df62bd35beba029e25705359c4018bb5e02ac
7
- data.tar.gz: ff414d8ca634fee1047177dc4a1475f6d867fbfc451357b416eaf1a5bf253fcc3bbf5cebccd279793a3f7644d269b8d5647b32511b27451f7040f86e2773fc0c
6
+ metadata.gz: 6b2a5cdea156f00ee9bba3f58c628d2f094e7f434a8ef313fb7e0c58c6a27ce71171d86e8db8654218a4323c568fa7eff5a3f2f6c332a8a1318ea00e0055d9dd
7
+ data.tar.gz: 3742ac09884486e82d7d1dc041664af942f55c99680effc231feca7d461dff375cc0dba3ada3952bce169e95f2216783497886789222d02b2189f2f283a4587c
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+ gemspec
5
+
6
+ gem 'rake'
7
+ gem 'rspec'
8
+ gem 'rubocop'
9
+ gem 'rubocop-legion', '~> 0.1', require: false
10
+ gem 'rubocop-rspec'
11
+ gem 'simplecov'
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'legion/extensions/adapter/version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'lex-adapter'
9
+ spec.version = Legion::Extensions::Adapter::VERSION
10
+ spec.authors = ['Matthew Iverson']
11
+ spec.email = ['matt@legionio.dev']
12
+ spec.summary = 'External agent adapter abstraction for LegionIO'
13
+ spec.description = 'Standardized interface for invoking external AI agents via CLI, process, or HTTP'
14
+ spec.homepage = 'https://github.com/LegionIO/lex-adapter'
15
+ spec.license = 'MIT'
16
+ spec.required_ruby_version = '>= 3.4'
17
+
18
+ spec.metadata['homepage_uri'] = spec.homepage
19
+ spec.metadata['source_code_uri'] = 'https://github.com/LegionIO/lex-adapter'
20
+ spec.metadata['documentation_uri'] = 'https://github.com/LegionIO/lex-adapter'
21
+ spec.metadata['changelog_uri'] = 'https://github.com/LegionIO/lex-adapter'
22
+ spec.metadata['bug_tracker_uri'] = 'https://github.com/LegionIO/lex-adapter/issues'
23
+ spec.metadata['rubygems_mfa_required'] = 'true'
24
+
25
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
26
+ Dir.glob('{lib,spec}/**/*') + %w[lex-adapter.gemspec Gemfile]
27
+ end
28
+ spec.require_paths = ['lib']
29
+
30
+ spec.add_dependency 'legion-cache', '>= 1.3.11'
31
+ spec.add_dependency 'legion-crypt', '>= 1.4.9'
32
+ spec.add_dependency 'legion-data', '>= 1.4.17'
33
+ spec.add_dependency 'legion-json', '>= 1.2.1'
34
+ spec.add_dependency 'legion-logging', '>= 1.3.2'
35
+ spec.add_dependency 'legion-settings', '>= 1.3.14'
36
+ spec.add_dependency 'legion-transport', '>= 1.3.9'
37
+
38
+ spec.add_development_dependency 'rake'
39
+ spec.add_development_dependency 'rspec'
40
+ spec.add_development_dependency 'rubocop'
41
+ spec.add_development_dependency 'rubocop-rspec'
42
+ spec.add_development_dependency 'simplecov'
43
+ end
@@ -28,7 +28,7 @@ module Legion
28
28
  @handles[handle] = { stdout: stdout, stderr: stderr, exit_code: status.exitstatus }
29
29
 
30
30
  { success: status.success?, output: stdout, duration: duration, handle: handle }
31
- rescue Timeout::Error
31
+ rescue Timeout::Error => _e
32
32
  { success: false, output: nil, duration: timeout.to_f, handle: handle, reason: :timeout }
33
33
  rescue StandardError => e
34
34
  { success: false, output: nil, duration: 0.0, handle: handle, reason: :error, message: e.message }
@@ -28,7 +28,7 @@ module Legion
28
28
  @handles[handle] = { stdout: stdout, stderr: stderr, exit_code: status.exitstatus }
29
29
 
30
30
  { success: status.success?, output: stdout, duration: duration, handle: handle }
31
- rescue Timeout::Error
31
+ rescue Timeout::Error => _e
32
32
  { success: false, output: nil, duration: timeout.to_f, handle: handle, reason: :timeout }
33
33
  rescue StandardError => e
34
34
  { success: false, output: nil, duration: 0.0, handle: handle, reason: :error, message: e.message }
@@ -45,11 +45,11 @@ module Legion
45
45
  { available: !@url.nil?, url: @url }
46
46
  end
47
47
 
48
- def cancel(handle:)
48
+ def cancel(_handle:)
49
49
  { success: false, reason: :not_supported }
50
50
  end
51
51
 
52
- def output(handle:)
52
+ def output(_handle:)
53
53
  { stdout: nil, stderr: nil, exit_code: nil }
54
54
  end
55
55
  end
@@ -22,7 +22,7 @@ module Legion
22
22
  input = if task.is_a?(Hash)
23
23
  begin
24
24
  task.to_json
25
- rescue StandardError
25
+ rescue StandardError => _e
26
26
  task.to_s
27
27
  end
28
28
  else
@@ -37,7 +37,7 @@ module Legion
37
37
  @handles[handle] = { stdout: stdout, stderr: stderr, exit_code: status.exitstatus }
38
38
 
39
39
  { success: status.success?, output: stdout, duration: duration, handle: handle }
40
- rescue Timeout::Error
40
+ rescue Timeout::Error => _e
41
41
  { success: false, output: nil, duration: timeout.to_f, handle: handle, reason: :timeout }
42
42
  rescue StandardError => e
43
43
  { success: false, output: nil, duration: 0.0, handle: handle, reason: :error, message: e.message }
@@ -4,27 +4,27 @@ module Legion
4
4
  module Extensions
5
5
  module Adapter
6
6
  class Registry
7
- @adapters = {}
7
+ @adapters = {} # rubocop:disable ThreadSafety/MutableClassInstanceVariable
8
8
 
9
9
  class << self
10
10
  def register(name, klass)
11
- @adapters[name.to_s] = klass
11
+ @adapters[name.to_s] = klass # rubocop:disable ThreadSafety/ClassInstanceVariable
12
12
  end
13
13
 
14
14
  def find(name)
15
- @adapters[name.to_s]
15
+ @adapters[name.to_s] # rubocop:disable ThreadSafety/ClassInstanceVariable
16
16
  end
17
17
 
18
18
  def all
19
- @adapters.dup
19
+ @adapters.dup # rubocop:disable ThreadSafety/ClassInstanceVariable
20
20
  end
21
21
 
22
22
  def names
23
- @adapters.keys
23
+ @adapters.keys # rubocop:disable ThreadSafety/ClassInstanceVariable
24
24
  end
25
25
 
26
26
  def reset!
27
- @adapters = {}
27
+ @adapters = {} # rubocop:disable ThreadSafety/ClassInstanceVariable
28
28
  end
29
29
  end
30
30
  end
@@ -5,6 +5,8 @@ module Legion
5
5
  module Adapter
6
6
  module Runners
7
7
  module Adapter
8
+ extend self # rubocop:disable Style/ModuleFunction
9
+
8
10
  def invoke_adapter(adapter_name:, task:, timeout: 30, **)
9
11
  klass = Registry.find(adapter_name)
10
12
  return { success: false, reason: :adapter_not_found } unless klass
@@ -3,7 +3,7 @@
3
3
  module Legion
4
4
  module Extensions
5
5
  module Adapter
6
- VERSION = '0.1.1'
6
+ VERSION = '0.1.2'
7
7
  end
8
8
  end
9
9
  end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Legion::Extensions::Adapter::Adapters::ClaudeCode do
6
+ subject(:adapter) { described_class.new }
7
+
8
+ describe '#status' do
9
+ it 'returns a hash with available key' do
10
+ result = adapter.status
11
+ expect(result).to have_key(:available)
12
+ end
13
+ end
14
+
15
+ describe 'self-registration' do
16
+ it 'registers as claude_code' do
17
+ expect(Legion::Extensions::Adapter::Registry.find('claude_code')).to eq(described_class)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Legion::Extensions::Adapter::Adapters::Codex do
6
+ subject(:adapter) { described_class.new }
7
+
8
+ describe '#status' do
9
+ it 'returns a hash with available key' do
10
+ result = adapter.status
11
+ expect(result).to have_key(:available)
12
+ end
13
+ end
14
+
15
+ describe 'self-registration' do
16
+ it 'registers as codex' do
17
+ expect(Legion::Extensions::Adapter::Registry.find('codex')).to eq(described_class)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Legion::Extensions::Adapter::Adapters::GenericHttp do
6
+ subject(:adapter) { described_class.new(url: 'http://localhost:19876/test') }
7
+
8
+ describe '#invoke' do
9
+ it 'returns failure when endpoint unreachable' do
10
+ result = adapter.invoke(task: { input: 'test' }, timeout: 1)
11
+ expect(result[:success]).to be false
12
+ end
13
+ end
14
+
15
+ describe '#status' do
16
+ it 'includes url in status' do
17
+ result = adapter.status
18
+ expect(result[:url]).to eq('http://localhost:19876/test')
19
+ end
20
+ end
21
+
22
+ describe 'self-registration' do
23
+ it 'registers as generic_http' do
24
+ expect(Legion::Extensions::Adapter::Registry.find('generic_http')).to eq(described_class)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Legion::Extensions::Adapter::Adapters::GenericProcess do
6
+ subject(:adapter) { described_class.new(command: 'echo') }
7
+
8
+ describe '#invoke' do
9
+ it 'executes the command and returns result' do
10
+ result = adapter.invoke(task: { input: 'hello' }, timeout: 5)
11
+ expect(result[:success]).to be true
12
+ expect(result[:handle]).to be_a(String)
13
+ expect(result[:duration]).to be_a(Float)
14
+ end
15
+ end
16
+
17
+ describe '#status' do
18
+ it 'returns available when command exists' do
19
+ result = adapter.status
20
+ expect(result[:available]).to be true
21
+ end
22
+
23
+ it 'returns unavailable when command missing' do
24
+ bad = described_class.new(command: 'nonexistent_binary_xyz_99')
25
+ result = bad.status
26
+ expect(result[:available]).to be false
27
+ end
28
+ end
29
+
30
+ describe '#cancel' do
31
+ it 'returns success for unknown handle' do
32
+ result = adapter.cancel(handle: 'nonexistent')
33
+ expect(result[:success]).to be false
34
+ end
35
+ end
36
+
37
+ describe 'self-registration' do
38
+ it 'registers as generic_process' do
39
+ expect(Legion::Extensions::Adapter::Registry.find('generic_process')).to eq(described_class)
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Legion::Extensions::Adapter::Base do
6
+ subject(:adapter) { described_class.new }
7
+
8
+ describe '#invoke' do
9
+ it 'raises NotImplementedError' do
10
+ expect { adapter.invoke(task: {}) }.to raise_error(NotImplementedError)
11
+ end
12
+ end
13
+
14
+ describe '#status' do
15
+ it 'raises NotImplementedError' do
16
+ expect { adapter.status }.to raise_error(NotImplementedError)
17
+ end
18
+ end
19
+
20
+ describe '#cancel' do
21
+ it 'raises NotImplementedError' do
22
+ expect { adapter.cancel(handle: 'abc') }.to raise_error(NotImplementedError)
23
+ end
24
+ end
25
+
26
+ describe '#output' do
27
+ it 'raises NotImplementedError' do
28
+ expect { adapter.output(handle: 'abc') }.to raise_error(NotImplementedError)
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Legion::Extensions::Adapter::Registry do
6
+ before { described_class.reset! }
7
+
8
+ let(:test_adapter_class) do
9
+ Class.new(Legion::Extensions::Adapter::Base) do
10
+ def invoke(_task:, **) = { success: true }
11
+ def status = { available: true, version: '1.0' }
12
+ def cancel(_handle:) = { success: true }
13
+ def output(_handle:) = { stdout: '', stderr: '', exit_code: 0 }
14
+ end
15
+ end
16
+
17
+ describe '.register' do
18
+ it 'stores adapter class by name' do
19
+ described_class.register('test', test_adapter_class)
20
+ expect(described_class.find('test')).to eq(test_adapter_class)
21
+ end
22
+
23
+ it 'accepts symbol names' do
24
+ described_class.register(:test, test_adapter_class)
25
+ expect(described_class.find('test')).to eq(test_adapter_class)
26
+ end
27
+ end
28
+
29
+ describe '.find' do
30
+ it 'returns nil for unregistered names' do
31
+ expect(described_class.find('nonexistent')).to be_nil
32
+ end
33
+ end
34
+
35
+ describe '.all' do
36
+ it 'returns all registered adapters' do
37
+ described_class.register('a', test_adapter_class)
38
+ described_class.register('b', test_adapter_class)
39
+ expect(described_class.all.keys).to contain_exactly('a', 'b')
40
+ end
41
+ end
42
+
43
+ describe '.names' do
44
+ it 'returns registered adapter names' do
45
+ described_class.register('x', test_adapter_class)
46
+ expect(described_class.names).to include('x')
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Legion::Extensions::Adapter::Runners::Adapter do
6
+ let(:runner_instance) { Class.new { include Legion::Extensions::Adapter::Runners::Adapter }.new }
7
+
8
+ before do
9
+ r = Legion::Extensions::Adapter::Registry
10
+ r.register('generic_process', Legion::Extensions::Adapter::Adapters::GenericProcess)
11
+ r.register('generic_http', Legion::Extensions::Adapter::Adapters::GenericHttp)
12
+ r.register('claude_code', Legion::Extensions::Adapter::Adapters::ClaudeCode)
13
+ r.register('codex', Legion::Extensions::Adapter::Adapters::Codex)
14
+ end
15
+
16
+ describe '#invoke_adapter' do
17
+ it 'invokes registered adapter by name' do
18
+ result = runner_instance.invoke_adapter(adapter_name: 'generic_process', task: { input: 'test' },
19
+ command: 'echo', timeout: 5)
20
+ expect(result[:success]).to be true
21
+ end
22
+
23
+ it 'returns failure for unknown adapter' do
24
+ result = runner_instance.invoke_adapter(adapter_name: 'nonexistent', task: {})
25
+ expect(result[:success]).to be false
26
+ expect(result[:reason]).to eq(:adapter_not_found)
27
+ end
28
+ end
29
+
30
+ describe '#list_adapters' do
31
+ it 'returns registered adapter names' do
32
+ result = runner_instance.list_adapters
33
+ expect(result[:success]).to be true
34
+ expect(result[:adapters]).to include('generic_process')
35
+ expect(result[:adapters]).to include('generic_http')
36
+ expect(result[:adapters]).to include('claude_code')
37
+ expect(result[:adapters]).to include('codex')
38
+ end
39
+ end
40
+
41
+ describe '#adapter_status' do
42
+ it 'returns status for a named adapter' do
43
+ result = runner_instance.adapter_status(adapter_name: 'generic_http', url: 'http://example.com')
44
+ expect(result[:success]).to be true
45
+ expect(result[:status]).to have_key(:available)
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/setup'
4
+ require 'legion/logging'
5
+ require 'legion/settings'
6
+ require 'legion/cache/helper'
7
+ require 'legion/crypt/helper'
8
+ require 'legion/data/helper'
9
+ require 'legion/json/helper'
10
+ require 'legion/transport/helper'
11
+
12
+ module Legion
13
+ module Extensions
14
+ module Helpers
15
+ module Lex
16
+ include Legion::Logging::Helper
17
+ include Legion::Settings::Helper
18
+ include Legion::Cache::Helper
19
+ include Legion::Crypt::Helper
20
+ include Legion::Data::Helper
21
+ include Legion::JSON::Helper
22
+ include Legion::Transport::Helper
23
+ end
24
+ end
25
+
26
+ module Actors
27
+ class Every
28
+ include Helpers::Lex
29
+ end
30
+
31
+ class Once
32
+ include Helpers::Lex
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ require 'legion/extensions/adapter'
39
+
40
+ RSpec.configure do |config|
41
+ config.example_status_persistence_file_path = '.rspec_status'
42
+ config.disable_monkey_patching!
43
+ config.expect_with(:rspec) { |c| c.syntax = :expect }
44
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lex-adapter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Iverson
@@ -9,6 +9,104 @@ bindir: bin
9
9
  cert_chain: []
10
10
  date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: legion-cache
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: 1.3.11
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: 1.3.11
26
+ - !ruby/object:Gem::Dependency
27
+ name: legion-crypt
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.4.9
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 1.4.9
40
+ - !ruby/object:Gem::Dependency
41
+ name: legion-data
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 1.4.17
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 1.4.17
54
+ - !ruby/object:Gem::Dependency
55
+ name: legion-json
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 1.2.1
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: 1.2.1
68
+ - !ruby/object:Gem::Dependency
69
+ name: legion-logging
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 1.3.2
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: 1.3.2
82
+ - !ruby/object:Gem::Dependency
83
+ name: legion-settings
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: 1.3.14
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: 1.3.14
96
+ - !ruby/object:Gem::Dependency
97
+ name: legion-transport
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: 1.3.9
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: 1.3.9
12
110
  - !ruby/object:Gem::Dependency
13
111
  name: rake
14
112
  requirement: !ruby/object:Gem::Requirement
@@ -87,9 +185,8 @@ executables: []
87
185
  extensions: []
88
186
  extra_rdoc_files: []
89
187
  files:
90
- - CHANGELOG.md
91
- - LICENSE
92
- - README.md
188
+ - Gemfile
189
+ - lex-adapter.gemspec
93
190
  - lib/legion/extensions/adapter.rb
94
191
  - lib/legion/extensions/adapter/adapters/claude_code.rb
95
192
  - lib/legion/extensions/adapter/adapters/codex.rb
@@ -99,10 +196,23 @@ files:
99
196
  - lib/legion/extensions/adapter/registry.rb
100
197
  - lib/legion/extensions/adapter/runners/adapter.rb
101
198
  - lib/legion/extensions/adapter/version.rb
199
+ - spec/legion/extensions/adapter/adapters/claude_code_spec.rb
200
+ - spec/legion/extensions/adapter/adapters/codex_spec.rb
201
+ - spec/legion/extensions/adapter/adapters/generic_http_spec.rb
202
+ - spec/legion/extensions/adapter/adapters/generic_process_spec.rb
203
+ - spec/legion/extensions/adapter/base_spec.rb
204
+ - spec/legion/extensions/adapter/registry_spec.rb
205
+ - spec/legion/extensions/adapter/runners/adapter_spec.rb
206
+ - spec/spec_helper.rb
102
207
  homepage: https://github.com/LegionIO/lex-adapter
103
208
  licenses:
104
209
  - MIT
105
210
  metadata:
211
+ homepage_uri: https://github.com/LegionIO/lex-adapter
212
+ source_code_uri: https://github.com/LegionIO/lex-adapter
213
+ documentation_uri: https://github.com/LegionIO/lex-adapter
214
+ changelog_uri: https://github.com/LegionIO/lex-adapter
215
+ bug_tracker_uri: https://github.com/LegionIO/lex-adapter/issues
106
216
  rubygems_mfa_required: 'true'
107
217
  rdoc_options: []
108
218
  require_paths:
data/CHANGELOG.md DELETED
@@ -1,13 +0,0 @@
1
- # Changelog
2
-
3
- ## [0.1.0] - 2026-03-20
4
-
5
- ### Added
6
- - Base adapter interface with `invoke`, `available?`, and `validate_options`
7
- - Registry for adapter registration and lookup
8
- - GenericProcess adapter for CLI tool invocation via stdin/stdout
9
- - GenericHTTP adapter for REST API endpoint invocation
10
- - ClaudeCode adapter for Anthropic Claude Code sessions
11
- - Codex adapter for OpenAI Codex CLI sessions
12
- - Runner module for framework-integrated invocation
13
- - 25 specs with 90.2% line coverage
data/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 LegionIO
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
data/README.md DELETED
@@ -1,40 +0,0 @@
1
- # lex-adapter
2
-
3
- External agent adapter abstraction for LegionIO. Provides a standardized interface for invoking external AI agents via CLI, process, or HTTP.
4
-
5
- ## Adapters
6
-
7
- | Adapter | Transport | Use Case |
8
- |---|---|---|
9
- | `GenericProcess` | stdin/stdout | Any CLI tool that accepts input and returns output |
10
- | `GenericHTTP` | HTTP POST | REST API endpoints |
11
- | `ClaudeCode` | CLI subprocess | Anthropic Claude Code sessions |
12
- | `Codex` | CLI subprocess | OpenAI Codex CLI sessions |
13
-
14
- ## Usage
15
-
16
- ```ruby
17
- require 'legion/extensions/adapter'
18
-
19
- # Register a custom adapter
20
- Legion::Extensions::Adapter::Registry.register(:my_adapter, MyAdapter)
21
-
22
- # Invoke via runner
23
- result = Legion::Extensions::Adapter::Runners::Adapter.invoke(
24
- adapter: :claude_code,
25
- prompt: "Explain this code",
26
- options: { model: "claude-sonnet-4-20250514" }
27
- )
28
- ```
29
-
30
- ## Development
31
-
32
- ```bash
33
- bundle install
34
- bundle exec rspec
35
- bundle exec rubocop
36
- ```
37
-
38
- ## License
39
-
40
- MIT