lex-detect 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: 0f221abbf1751de26290f2d11137ec31338bb77dfb64b033ce09ebffbcd73d9d
4
- data.tar.gz: fac9bfec6e9275b5b48d8d1e253edf98e1fa504b48f90300a44604fe79bd5cc9
3
+ metadata.gz: ac8b336bd2c34b58a559c0f4b664c728b2c61991d9f88f4a4bc83014ff5fe45f
4
+ data.tar.gz: 8d6b78909cf1e3c405f6251099f686882bab688496a66588681ad6646e7b2455
5
5
  SHA512:
6
- metadata.gz: '0259374ea1f54906333dba2cbb9de76c6c1081a1e24082956a86b055cfdaa942a442c8d48eb3f49f373276c91bf2901e21720b669205ddc90a3fe97001976d41'
7
- data.tar.gz: b6a5d1afa9da7d4f7a6feecd24e49ae2bced0123e79df54d368fa6f1e610189a72e8991866768ff0f4881bd056404b6208318764fb38e66bf57ab2f30835277e
6
+ metadata.gz: e0f94a3e7c7f3ab15a9f27c5646423d98a9c275c203911a8c6d3a44c1c17830c3de2cd1cad4e5d769e5d1662ab54e03daedfb3f885cd579d47ab62ef67c83031
7
+ data.tar.gz: ac6498c5166dc7cbf6b077be7476b8911c979fe3eb911703840bb87f7944f35a5262581d6918ba4a142c98d37f4373816ac0eb68e7dae9b114f82979e4dd6afe
data/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.1.2] - 2026-03-19
4
+
5
+ ### Added
6
+ - `FullScan` Once actor: runs full environment scan at boot with 2s delay, persists results and writes traces
7
+ - `DeltaScan` Every actor: runs delta detection every 300s, computes additions/removals via Set comparison
8
+ - Data::Local migration for detect_results table (optional persistence)
9
+
3
10
  ## [0.1.1] - 2026-03-18
4
11
 
5
12
  ### Changed
data/CLAUDE.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # lex-detect: Environment-Aware Extension Discovery
2
2
 
3
3
  **Repository Level 3 Documentation**
4
- - **Parent (Level 2)**: `/Users/miverso2/rubymine/legion/extensions/CLAUDE.md`
4
+ - **Parent (Level 2)**: `/Users/miverso2/rubymine/legion/extensions-core/CLAUDE.md`
5
5
  - **Parent (Level 1)**: `/Users/miverso2/rubymine/legion/CLAUDE.md`
6
6
 
7
7
  ## Purpose
@@ -10,7 +10,7 @@ Legion Extension that scans the local environment and recommends which `lex-*` e
10
10
 
11
11
  **GitHub**: https://github.com/LegionIO/lex-detect
12
12
  **License**: MIT
13
- **Version**: 0.1.0
13
+ **Version**: 0.1.1
14
14
 
15
15
  ## Architecture
16
16
 
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Detect
6
+ module Actors
7
+ class DeltaScan < Legion::Extensions::Actors::Every
8
+ def time
9
+ settings_interval || 300
10
+ end
11
+
12
+ def run_now?
13
+ false
14
+ end
15
+
16
+ def action(**_opts)
17
+ current = Scanner.scan
18
+ previous = last_scan_results
19
+ deltas = compute_deltas(current, previous)
20
+
21
+ persist_results(current) unless deltas[:added].empty? && deltas[:removed].empty?
22
+ write_delta_traces(deltas) unless deltas[:added].empty? && deltas[:removed].empty?
23
+ deltas
24
+ end
25
+
26
+ private
27
+
28
+ def settings_interval
29
+ return nil unless defined?(Legion::Settings)
30
+
31
+ Legion::Settings.dig(:extensions, :'lex-detect', :delta_interval)
32
+ rescue StandardError
33
+ nil
34
+ end
35
+
36
+ def last_scan_results
37
+ return [] unless defined?(Legion::Data::Local) &&
38
+ Legion::Data::Local.respond_to?(:connected?) &&
39
+ Legion::Data::Local.connected?
40
+
41
+ Legion::Data::Local.model(:detect_results).all.map do |row|
42
+ {
43
+ name: row[:name],
44
+ extensions: Legion::JSON.load(row[:extensions]),
45
+ matched_signals: Legion::JSON.load(row[:matched_signals])
46
+ }
47
+ end
48
+ rescue StandardError
49
+ []
50
+ end
51
+
52
+ def compute_deltas(current, previous)
53
+ prev_names = previous.to_set { |r| r[:name] }
54
+ curr_names = current.to_set { |r| r[:name] }
55
+
56
+ added = current.reject { |r| prev_names.include?(r[:name]) }
57
+ removed = previous.reject { |r| curr_names.include?(r[:name]) }
58
+ { added: added, removed: removed }
59
+ end
60
+
61
+ def persist_results(results)
62
+ return unless defined?(Legion::Data::Local) &&
63
+ Legion::Data::Local.respond_to?(:connected?) &&
64
+ Legion::Data::Local.connected?
65
+
66
+ model = Legion::Data::Local.model(:detect_results)
67
+ model.where.delete
68
+ results.each do |result|
69
+ model.insert(
70
+ name: result[:name],
71
+ extensions: Legion::JSON.dump(result[:extensions]),
72
+ matched_signals: Legion::JSON.dump(result[:matched_signals]),
73
+ installed: Legion::JSON.dump(result[:installed]),
74
+ scanned_at: Time.now,
75
+ created_at: Time.now,
76
+ updated_at: Time.now
77
+ )
78
+ end
79
+ rescue StandardError
80
+ nil
81
+ end
82
+
83
+ def write_delta_traces(deltas)
84
+ return unless defined?(Legion::Extensions::Agentic::Memory)
85
+
86
+ deltas[:added]&.each do |r|
87
+ Legion::Extensions::Agentic::Memory::Trace.write(
88
+ source: 'lex-detect', category: 'environment',
89
+ content: "New detection: #{r[:name]}", confidence: 0.8
90
+ )
91
+ end
92
+ rescue StandardError
93
+ nil
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Detect
6
+ module Actors
7
+ class FullScan < Legion::Extensions::Actors::Once
8
+ def delay
9
+ 2.0
10
+ end
11
+
12
+ def action(**_opts)
13
+ results = Scanner.scan
14
+ persist_results(results)
15
+ write_traces(results)
16
+ transition_catalog
17
+ results
18
+ end
19
+
20
+ private
21
+
22
+ def persist_results(results)
23
+ return unless defined?(Legion::Data::Local) &&
24
+ Legion::Data::Local.respond_to?(:connected?) &&
25
+ Legion::Data::Local.connected?
26
+
27
+ model = Legion::Data::Local.model(:detect_results)
28
+ model.where.delete
29
+ results.each do |result|
30
+ model.insert(
31
+ name: result[:name],
32
+ extensions: Legion::JSON.dump(result[:extensions]),
33
+ matched_signals: Legion::JSON.dump(result[:matched_signals]),
34
+ installed: Legion::JSON.dump(result[:installed]),
35
+ scanned_at: Time.now,
36
+ created_at: Time.now,
37
+ updated_at: Time.now
38
+ )
39
+ end
40
+ rescue StandardError => e
41
+ Legion::Logging.debug { "FullScan persist failed: #{e.message}" } if defined?(Legion::Logging)
42
+ end
43
+
44
+ def write_traces(results)
45
+ return unless defined?(Legion::Extensions::Agentic::Memory)
46
+
47
+ results.each do |result|
48
+ Legion::Extensions::Agentic::Memory::Trace.write(
49
+ source: 'lex-detect',
50
+ category: 'environment',
51
+ content: "Detected #{result[:name]}: #{result[:matched_signals].join(', ')}",
52
+ confidence: 0.9
53
+ )
54
+ end
55
+ rescue StandardError => e
56
+ Legion::Logging.debug { "FullScan trace write failed: #{e.message}" } if defined?(Legion::Logging)
57
+ end
58
+
59
+ def transition_catalog
60
+ return unless defined?(Legion::Extensions::Catalog)
61
+
62
+ Legion::Extensions::Catalog.transition('lex-detect', :running)
63
+ rescue StandardError
64
+ nil
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ Sequel.migration do
4
+ change do
5
+ create_table(:detect_results) do
6
+ primary_key :id
7
+ String :name, null: false
8
+ String :extensions, text: true
9
+ String :matched_signals, text: true
10
+ String :installed, text: true
11
+ Time :scanned_at
12
+ Time :created_at
13
+ Time :updated_at
14
+ end
15
+ end
16
+ end
@@ -3,7 +3,7 @@
3
3
  module Legion
4
4
  module Extensions
5
5
  module Detect
6
- VERSION = '0.1.1'
6
+ VERSION = '0.1.2'
7
7
  end
8
8
  end
9
9
  end
@@ -40,6 +40,16 @@ module Legion
40
40
  CATALOG
41
41
  end
42
42
  end
43
+
44
+ require_relative 'detect/actors/full_scan' if defined?(Legion::Extensions::Actors::Once)
45
+ require_relative 'detect/actors/delta_scan' if defined?(Legion::Extensions::Actors::Every)
46
+
47
+ if defined?(Legion::Data::Local)
48
+ Legion::Data::Local.register_migrations(
49
+ name: :detect,
50
+ path: File.join(__dir__, 'detect', 'local_migrations')
51
+ )
52
+ end
43
53
  end
44
54
  end
45
55
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lex-detect
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
  - Esity
@@ -27,8 +27,11 @@ files:
27
27
  - README.md
28
28
  - lex-detect.gemspec
29
29
  - lib/legion/extensions/detect.rb
30
+ - lib/legion/extensions/detect/actors/delta_scan.rb
31
+ - lib/legion/extensions/detect/actors/full_scan.rb
30
32
  - lib/legion/extensions/detect/catalog.rb
31
33
  - lib/legion/extensions/detect/installer.rb
34
+ - lib/legion/extensions/detect/local_migrations/20260319000001_create_detect_results.rb
32
35
  - lib/legion/extensions/detect/scanner.rb
33
36
  - lib/legion/extensions/detect/version.rb
34
37
  homepage: https://github.com/LegionIO/lex-detect