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 +4 -4
- data/CHANGELOG.md +7 -0
- data/CLAUDE.md +2 -2
- data/lib/legion/extensions/detect/actors/delta_scan.rb +99 -0
- data/lib/legion/extensions/detect/actors/full_scan.rb +70 -0
- data/lib/legion/extensions/detect/local_migrations/20260319000001_create_detect_results.rb +16 -0
- data/lib/legion/extensions/detect/version.rb +1 -1
- data/lib/legion/extensions/detect.rb +10 -0
- metadata +4 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ac8b336bd2c34b58a559c0f4b664c728b2c61991d9f88f4a4bc83014ff5fe45f
|
|
4
|
+
data.tar.gz: 8d6b78909cf1e3c405f6251099f686882bab688496a66588681ad6646e7b2455
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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.
|
|
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
|
|
@@ -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.
|
|
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
|