legionio 1.4.184 → 1.4.185

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: 2c694550903fcfcd9a2903bdc1036668d7e08587b02311abc07893b6695c9ff4
4
- data.tar.gz: 889d14b5e592ac288fdcebe66db37341eda954c77df717d063920c223ed357a9
3
+ metadata.gz: f9621be53d738c0999c6bc8258cbea49d64bb52d0b3ff5ec004ab60b460d0db9
4
+ data.tar.gz: 4fbe9c2e3dbc4d33ef6ae6eb0631172020ce869faa75aebcae40f5606b22a5dc
5
5
  SHA512:
6
- metadata.gz: eb3d703112e2471be760793607fd341f1648ae132cd99168606cc565bbc0f0130d5e26dea8857f6387d775bf2cc55377a146f12ccf8c014be38e51ab1dda9ca4
7
- data.tar.gz: 2c2c609e51998c432ddb3e66c8319d0bdcf1a39c1efd2f29c965d300772d0edc646ab49f701eb44402d015be51cf5ab2ea912f67738e47543b659d2b8702aa76
6
+ metadata.gz: 98bf4e665d4f95bfd4061340e33fd45320f3ccb967677e7bb6086df0c64b7f8fe308506765b6d0798cc504347fd1370eadb3d661c9b06c522b008b0540750da2
7
+ data.tar.gz: e73ee8599eaadd40dfb4c11b91034d24d76caa8c68b719d55bc21aa75346d7fef7fb9943acd8d24a638ff7fb6e264a726ff6ca4891f602f9a89c69774646887b
@@ -0,0 +1,13 @@
1
+ # Auto-generated from team-config.yml
2
+ # Team: core
3
+ #
4
+ # To apply: scripts/apply-codeowners.sh LegionIO
5
+
6
+ * @LegionIO/maintainers
7
+ * @LegionIO/core
8
+
9
+ # Path-specific reviewers
10
+ lib/legion/cli/chat/ @LegionIO/ai
11
+ lib/legion/api/ @LegionIO/core
12
+ lib/legion/extensions/ @LegionIO/extensions
13
+ .github/ @LegionIO/infra
@@ -0,0 +1,18 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: bundler
4
+ directory: /
5
+ schedule:
6
+ interval: weekly
7
+ day: monday
8
+ open-pull-requests-limit: 5
9
+ labels:
10
+ - "type:dependencies"
11
+ - package-ecosystem: github-actions
12
+ directory: /
13
+ schedule:
14
+ interval: weekly
15
+ day: monday
16
+ open-pull-requests-limit: 5
17
+ labels:
18
+ - "type:dependencies"
@@ -3,55 +3,33 @@ on:
3
3
  push:
4
4
  branches: [main]
5
5
  pull_request:
6
+ schedule:
7
+ - cron: '0 9 * * 1'
6
8
 
7
9
  jobs:
8
10
  ci:
9
11
  uses: LegionIO/.github/.github/workflows/ci.yml@main
12
+ with:
13
+ needs-rabbitmq: true
14
+
15
+ security:
16
+ uses: LegionIO/.github/.github/workflows/security-scan.yml@main
17
+ with:
18
+ brakeman-enabled: false
19
+
20
+ version-changelog:
21
+ uses: LegionIO/.github/.github/workflows/version-changelog.yml@main
22
+
23
+ dependency-review:
24
+ uses: LegionIO/.github/.github/workflows/dependency-review.yml@main
25
+
26
+ stale:
27
+ if: github.event_name == 'schedule'
28
+ uses: LegionIO/.github/.github/workflows/stale.yml@main
10
29
 
11
30
  release:
12
- needs: ci
31
+ needs: [ci]
13
32
  if: github.event_name == 'push' && github.ref == 'refs/heads/main'
14
33
  uses: LegionIO/.github/.github/workflows/release.yml@main
15
34
  secrets:
16
35
  rubygems-api-key: ${{ secrets.RUBYGEMS_API_KEY }}
17
-
18
- trigger-homebrew:
19
- needs: release
20
- if: needs.release.outputs.changed == 'true'
21
- runs-on: ubuntu-latest
22
- steps:
23
- - name: Trigger unified Homebrew build
24
- env:
25
- GH_TOKEN: ${{ secrets.HOMEBREW_DISPATCH_TOKEN }}
26
- LEGIONIO_VERSION: ${{ needs.release.outputs.version }}
27
- run: |
28
- gh api repos/LegionIO/homebrew-tap/dispatches \
29
- -f event_type=build-legion \
30
- -f "client_payload[legionio_version]=$LEGIONIO_VERSION" \
31
- -f "client_payload[ruby_version]=3.4.8" \
32
- -f "client_payload[package_revision]=1"
33
-
34
- docker-build:
35
- name: Build Docker Image
36
- needs: release
37
- if: needs.release.outputs.changed == 'true'
38
- runs-on: ubuntu-latest
39
- permissions:
40
- packages: write
41
- steps:
42
- - uses: actions/checkout@v4
43
- - uses: docker/setup-buildx-action@v3
44
- - uses: docker/login-action@v3
45
- with:
46
- registry: ghcr.io
47
- username: ${{ github.actor }}
48
- password: ${{ secrets.GITHUB_TOKEN }}
49
- - uses: docker/build-push-action@v5
50
- with:
51
- context: .
52
- push: true
53
- tags: |
54
- ghcr.io/legionio/legion:${{ needs.release.outputs.version }}
55
- ghcr.io/legionio/legion:latest
56
- cache-from: type=gha
57
- cache-to: type=gha,mode=max
data/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # Legion Changelog
2
2
 
3
+ ## [1.4.185] - 2026-03-23
4
+
5
+ ### Fixed
6
+ - Restrict settings search paths to canonical directories (`~/.legionio/settings`, `/etc/legionio/settings`) (#25)
7
+ - Remove broken/dead paths from `Service#default_paths` (`~/legionio`, `$home/legionio`, `./settings`)
8
+ - `CLI::Connection#resolve_config_dir` now delegates to `Loader.default_directories` instead of hardcoded list
9
+ - Add `legion-settings` local path to Gemfile for development
10
+
11
+ ### Changed
12
+ - `Service#setup_settings` loads all matching directories via `config_dirs:` instead of first-match-wins
13
+
3
14
  ## [1.4.184] - 2026-03-23
4
15
 
5
16
  ### Added
data/CLAUDE.md CHANGED
@@ -9,7 +9,7 @@ The primary gem for the LegionIO framework. An extensible async job engine for s
9
9
 
10
10
  **GitHub**: https://github.com/LegionIO/LegionIO
11
11
  **Gem**: `legionio`
12
- **Version**: 1.4.114
12
+ **Version**: 1.4.185
13
13
  **License**: Apache-2.0
14
14
  **Docker**: `legionio/legion`
15
15
  **Ruby**: >= 3.4
@@ -194,7 +194,7 @@ Legion (lib/legion.rb)
194
194
  │ ├── Session # Multi-turn chat session with streaming
195
195
  │ ├── SessionStore # Persistent session save/load/list/resume/fork
196
196
  │ ├── Permissions # Tool permission model (interactive/auto_approve/read_only)
197
- │ ├── ToolRegistry # Chat tool discovery and registration (22 built-in + extension tools)
197
+ │ ├── ToolRegistry # Chat tool discovery and registration (40 built-in + extension tools)
198
198
  │ ├── ExtensionTool # permission_tier DSL module for LEX chat tools (:read/:write/:shell)
199
199
  │ ├── ExtensionToolLoader # Lazy discovery of tools/ directories from loaded extensions
200
200
  │ ├── Context # Project awareness (git, language, instructions, extra dirs)
@@ -632,7 +632,7 @@ rack-test, rake, rspec, rubocop, rubocop-rspec, simplecov
632
632
  | `lib/legion/cli/chat/session.rb` | Chat session: multi-turn conversation, streaming, tool use |
633
633
  | `lib/legion/cli/chat/session_store.rb` | Session persistence: save, load, list, resume, fork |
634
634
  | `lib/legion/cli/chat/permissions.rb` | Tool permission model (interactive/auto_approve/read_only) |
635
- | `lib/legion/cli/chat/tool_registry.rb` | Chat tool discovery and registration (22 tools) |
635
+ | `lib/legion/cli/chat/tool_registry.rb` | Chat tool discovery and registration (40 tools) |
636
636
  | `lib/legion/cli/chat/extension_tool.rb` | permission_tier DSL module for extension chat tools |
637
637
  | `lib/legion/cli/chat/extension_tool_loader.rb` | Lazy discovery engine: scans loaded extensions for tools/ directories |
638
638
  | `lib/legion/cli/chat/context.rb` | Project awareness: git info, language detection, instructions, extra dirs |
@@ -645,10 +645,11 @@ rack-test, rake, rspec, rubocop, rubocop-rspec, simplecov
645
645
  | `lib/legion/cli/chat/agent_registry.rb` | Custom agent definitions from `.legion/agents/*.json` and `.yaml` |
646
646
  | `lib/legion/cli/chat/agent_delegator.rb` | `@name` at-mention parsing and dispatch via Subagent |
647
647
  | `lib/legion/cli/chat/chat_logger.rb` | Chat-specific logging |
648
+ | `lib/legion/cli/chat/context_manager.rb` | Context window management: dedup, compression, summarization strategies |
648
649
  | `lib/legion/cli/chat/progress_bar.rb` | Progress bar rendering for long operations |
649
650
  | `lib/legion/cli/chat/status_indicator.rb` | Status indicator (spinner, checkmark, cross) |
650
651
  | `lib/legion/cli/chat/team.rb` | Multi-user team support for chat sessions |
651
- | `lib/legion/cli/chat/tools/` | Built-in tools: read_file, write_file, edit_file, search_files, search_content, run_command, save_memory, search_memory, web_search, spawn_agent, search_traces, query_knowledge, ingest_knowledge, consolidate_memory, relate_knowledge, knowledge_maintenance, knowledge_stats, summarize_traces, list_extensions, manage_tasks, system_status, view_events |
652
+ | `lib/legion/cli/chat/tools/` | 40 built-in tools: read_file, write_file, edit_file, search_files, search_content, run_command, save_memory, search_memory, web_search, spawn_agent, search_traces, query_knowledge, ingest_knowledge, consolidate_memory, relate_knowledge, knowledge_maintenance, knowledge_stats, summarize_traces, list_extensions, manage_tasks, system_status, view_events, cost_summary, reflect, manage_schedules, worker_status, detect_anomalies, view_trends, trigger_dream, generate_insights, budget_status, provider_health, model_comparison, shadow_eval_status, entity_extract, arbitrage_status, escalation_status, graph_explore, scheduling_status, memory_status |
652
653
  | `lib/legion/chat/skills.rb` | Skill discovery: parses `.legion/skills/` and `~/.legionio/skills/` YAML frontmatter files |
653
654
  | `lib/legion/cli/graph_command.rb` | `legion graph` subcommands (show with --format mermaid\|dot, --chain, --output) |
654
655
  | `lib/legion/cli/trace_command.rb` | `legion trace search` — NL trace search via LLM |
@@ -727,7 +728,7 @@ rack-test, rake, rspec, rubocop, rubocop-rspec, simplecov
727
728
 
728
729
  ```bash
729
730
  bundle install
730
- bundle exec rspec # 2514 examples, 0 failures
731
+ bundle exec rspec # 3194 examples, 0 failures
731
732
  bundle exec rubocop # 0 offenses
732
733
  ```
733
734
 
data/Gemfile CHANGED
@@ -9,6 +9,7 @@ gem 'legion-gaia', path: '../legion-gaia' if File.exist?(File.expand_path('../le
9
9
  gem 'legion-llm', path: '../legion-llm' if File.exist?(File.expand_path('../legion-llm', __dir__))
10
10
  gem 'legion-logging', path: '../legion-logging' if File.exist?(File.expand_path('../legion-logging', __dir__))
11
11
  gem 'legion-mcp', path: '../legion-mcp' if File.exist?(File.expand_path('../legion-mcp', __dir__))
12
+ gem 'legion-settings', path: '../legion-settings' if File.exist?(File.expand_path('../legion-settings', __dir__))
12
13
 
13
14
  gem 'lex-agentic-memory', path: '../extensions-agentic/lex-agentic-memory' if File.exist?(File.expand_path('../extensions-agentic/lex-agentic-memory', __dir__))
14
15
  gem 'lex-llm-gateway', path: '../extensions-core/lex-llm-gateway' if File.exist?(File.expand_path('../extensions-core/lex-llm-gateway', __dir__))
@@ -130,19 +130,12 @@ module Legion
130
130
  def resolve_config_dir
131
131
  return @config_dir if @config_dir && Dir.exist?(@config_dir)
132
132
 
133
- [
134
- '/etc/legionio',
135
- "#{Dir.home}/.legionio/settings",
136
- "#{Dir.home}/legionio",
137
- '~/legionio',
138
- './settings'
139
- ].each do |path|
140
- expanded = File.expand_path(path)
141
- return expanded if Dir.exist?(expanded)
133
+ require 'legion/settings/loader' unless defined?(Legion::Settings::Loader)
134
+ Legion::Settings::Loader.default_directories.each do |path|
135
+ return path if Dir.exist?(path)
142
136
  end
143
137
 
144
- # Fall back to gem's lib dir (same as Service does)
145
- File.expand_path('../../', __dir__)
138
+ nil
146
139
  end
147
140
  end
148
141
  end
@@ -134,30 +134,13 @@ module Legion
134
134
  Legion::Logging.warn "Legion::Rbac failed to load: #{e.message}"
135
135
  end
136
136
 
137
- # noinspection RubyArgCount
138
- def default_paths
139
- [
140
- '/etc/legionio',
141
- "#{Dir.home}/.legionio/settings",
142
- "#{ENV.fetch('home', nil)}/legionio",
143
- '~/legionio',
144
- './settings'
145
- ]
146
- end
147
-
148
- def setup_settings(default_dir = __dir__)
137
+ def setup_settings
149
138
  require 'legion/settings'
150
- config_directory = default_dir
151
- default_paths.each do |path|
152
- next unless Dir.exist? path
153
-
154
- Legion::Logging.info "Using #{path} for settings"
155
- config_directory = path
156
- break
157
- end
158
-
159
- Legion::Logging.info "Using directory #{config_directory} for settings"
160
- Legion::Settings.load(config_dir: config_directory)
139
+ directories = Legion::Settings::Loader.default_directories
140
+ existing = directories.select { |d| Dir.exist?(d) }
141
+ Legion::Logging.info "Settings search directories: #{directories.inspect}"
142
+ existing.each { |d| Legion::Logging.info "Settings: will load from #{d}" }
143
+ Legion::Settings.load(config_dirs: existing)
161
144
  Legion::Readiness.mark_ready(:settings)
162
145
  Legion::Logging.info('Legion::Settings Loaded')
163
146
  self.class.log_privacy_mode_status
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Legion
4
- VERSION = '1.4.184'
4
+ VERSION = '1.4.185'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: legionio
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.184
4
+ version: 1.4.185
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity
@@ -356,6 +356,8 @@ extensions: []
356
356
  extra_rdoc_files: []
357
357
  files:
358
358
  - ".dockerignore"
359
+ - ".github/CODEOWNERS"
360
+ - ".github/dependabot.yml"
359
361
  - ".github/workflow-templates/eval-gate.yml"
360
362
  - ".github/workflows/ci-cd.yml"
361
363
  - ".github/workflows/ci.yml"