legionio 1.4.85 → 1.4.86

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: 512139af5d950a28790627a762f8dc5f52e37cd093ed2829a9a42aa833ededec
4
- data.tar.gz: f80a9bfa077caa791bf68058c91eb1061b9cf3851c1766ef5aedd49e9ecda95e
3
+ metadata.gz: c4776d93816eb13deabef22f7d9f64bb295eafc950a451f8654b2003ff3497d8
4
+ data.tar.gz: dcdb4ea6755f1af00d1f8a6576301d183c85fd8336b41cdf2b500bcbe967225b
5
5
  SHA512:
6
- metadata.gz: ecd74de131841cb6a00d1fe66ccfa51fe0a0eafe649e0cdf26e90c8602127f0d29d7f55b4cfeda0f13908b0eebe9828d61dc380a7518268e29bda49bd780855d
7
- data.tar.gz: 9d27ac10782d1e6319e96b517c6da5a819e7b599f15a2e9ae27a5d1f3e33f13d70838bd64390218931ded9be7ec45c3cc28e1e65dc2cedebcbd5faf17fa1ba6a
6
+ metadata.gz: a1df3d9b78226fca48cc9349d8ef9ecb6381aedc32316785bccd9e9faeb3c64bff5b2516ea5645bae6f129cd7367a6b8781e6c5f54ab11f0a016e4fb0e0447f7
7
+ data.tar.gz: 1ecfd8644f19a22492b611051c7a35ff2ba4af2930d10cdc731fde944d60e9bc458ab776cef02f665eb7e54a3e114bf8f86ce70f9cf807c04f88e0fe0384db07
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Legion Changelog
2
2
 
3
+ ## [1.4.86] - 2026-03-20
4
+
5
+ ### Added
6
+ - `legion payroll` CLI subcommand for workforce cost visibility (summary, report, forecast, budget)
7
+ - Integrated with `Helpers::Economics` from lex-metering for labor economics data
8
+
3
9
  ## [1.4.85] - 2026-03-20
4
10
 
5
11
  ### Added
data/CLAUDE.md CHANGED
@@ -181,7 +181,7 @@ Legion (lib/legion.rb)
181
181
  ├── Start # `legion start` - daemon boot via Legion::Process
182
182
  ├── Status # `legion status` - probes API or shows static info
183
183
  ├── Check # `legion check` - smoke-test subsystems, 3 depth levels
184
- ├── Lex # `legion lex` - list, info, create, enable, disable + LexGenerator
184
+ ├── Lex # `legion lex` - list, info, create, enable, disable, exec/invoke_ext + LexGenerator
185
185
  ├── Task # `legion task` - list, show, logs, trigger (mapped as run), purge
186
186
  ├── Chain # `legion chain` - list, create, delete
187
187
  ├── Config # `legion config` - show (redacted), path, validate, scaffold
@@ -614,7 +614,8 @@ rack-test, rake, rspec, rubocop, rubocop-rspec, simplecov
614
614
  | `lib/legion/cli/start.rb` | `legion start` — boots Legion::Process |
615
615
  | `lib/legion/cli/status.rb` | `legion status` — probes API or returns static info |
616
616
  | `lib/legion/cli/check_command.rb` | `legion check` — 3-level smoke test, exit code 0/1 |
617
- | `lib/legion/cli/lex_command.rb` | `legion lex` subcommands + LexGenerator scaffolding |
617
+ | `lib/legion/cli/lex_command.rb` | `legion lex` subcommands + LexGenerator scaffolding + `invoke_ext`/`exec` dispatch via LexCliManifest |
618
+ | `lib/legion/cli/lex_cli_manifest.rb` | JSON manifest cache for LEX CLI commands (alias resolution, staleness check) |
618
619
  | `lib/legion/cli/task_command.rb` | `legion task` subcommands (list, show, logs, trigger/run, purge) |
619
620
  | `lib/legion/cli/chain_command.rb` | `legion chain` subcommands (list, create, delete) |
620
621
  | `lib/legion/cli/config_command.rb` | `legion config` subcommands (show, path, validate, scaffold) |
data/Dockerfile CHANGED
@@ -2,7 +2,7 @@
2
2
  FROM ruby:3.4-slim AS builder
3
3
  WORKDIR /app
4
4
  RUN apt-get update && \
5
- apt-get install -y --no-install-recommends build-essential libpq-dev git && \
5
+ apt-get install -y --no-install-recommends build-essential libpq-dev default-libmysqlclient-dev git && \
6
6
  rm -rf /var/lib/apt/lists/*
7
7
  COPY Gemfile legionio.gemspec ./
8
8
  COPY lib/legion/version.rb lib/legion/
@@ -14,7 +14,7 @@ COPY . .
14
14
  # Runtime stage
15
15
  FROM ruby:3.4-slim AS runtime
16
16
  RUN apt-get update && \
17
- apt-get install -y --no-install-recommends libpq5 curl && \
17
+ apt-get install -y --no-install-recommends libpq5 default-mysql-client-core curl && \
18
18
  rm -rf /var/lib/apt/lists/* && \
19
19
  groupadd -r legion && useradd -r -g legion -d /app -s /sbin/nologin legion
20
20
  WORKDIR /app
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'thor'
4
+
5
+ module Legion
6
+ module CLI
7
+ class Payroll < Thor
8
+ def self.exit_on_failure? = true
9
+
10
+ desc 'summary', 'Show workforce payroll summary'
11
+ option :period, type: :string, default: 'daily', desc: 'Period: daily, weekly, monthly'
12
+ option :json, type: :boolean, default: false, desc: 'Output as JSON'
13
+ def summary
14
+ require 'legion/extensions/metering/helpers/economics'
15
+ economics = Object.new.extend(Legion::Extensions::Metering::Helpers::Economics)
16
+ result = economics.payroll_summary(period: options[:period].to_sym)
17
+
18
+ if options[:json]
19
+ say ::JSON.dump(result)
20
+ else
21
+ say 'Payroll Summary', :green
22
+ say '-' * 40
23
+ say " Period: #{result[:period]}"
24
+ say format(' Total Cost: $%.4f', result[:total_cost])
25
+ say format(' Avg Productivity: %.1f tasks', result[:avg_productivity])
26
+ if result[:workers].any?
27
+ say ''
28
+ say ' Worker Tasks Cost Autonomy'
29
+ say " #{'-' * 52}"
30
+ result[:workers].each do |w|
31
+ cost_str = format('$%.4f', w[:cost])
32
+ say format(' %-20<worker>s %8<tasks>d %10<cost>s %10<autonomy>s',
33
+ worker: w[:worker_id], tasks: w[:task_count],
34
+ cost: cost_str, autonomy: w[:autonomy])
35
+ end
36
+ else
37
+ say ' No worker data found for this period.', :yellow
38
+ end
39
+ end
40
+ rescue LoadError => e
41
+ say "Error: lex-metering not available (#{e.message})", :red
42
+ end
43
+ default_task :summary
44
+
45
+ desc 'report WORKER_ID', 'Detailed worker cost report'
46
+ option :period, type: :string, default: 'daily'
47
+ option :json, type: :boolean, default: false
48
+ def report(worker_id)
49
+ require 'legion/extensions/metering/helpers/economics'
50
+ economics = Object.new.extend(Legion::Extensions::Metering::Helpers::Economics)
51
+ result = economics.worker_report(worker_id: worker_id, period: options[:period].to_sym)
52
+
53
+ if options[:json]
54
+ say ::JSON.dump(result)
55
+ else
56
+ say "Worker Report: #{worker_id}", :green
57
+ say '-' * 40
58
+ result.each { |k, v| say " #{k}: #{v}" }
59
+ end
60
+ rescue LoadError => e
61
+ say "Error: lex-metering not available (#{e.message})", :red
62
+ end
63
+
64
+ desc 'forecast', 'Project costs for upcoming period'
65
+ option :days, type: :numeric, default: 30, desc: 'Number of days to project'
66
+ option :json, type: :boolean, default: false
67
+ def forecast
68
+ require 'legion/extensions/metering/helpers/economics'
69
+ economics = Object.new.extend(Legion::Extensions::Metering::Helpers::Economics)
70
+ result = economics.budget_forecast(days: options[:days])
71
+
72
+ if options[:json]
73
+ say ::JSON.dump(result)
74
+ else
75
+ say 'Cost Forecast', :green
76
+ say '-' * 40
77
+ say format(" Projected Cost (#{result[:days]}d): $%.4f", result[:projected_cost])
78
+ say format(' Daily Average: $%.4f', result[:daily_average])
79
+ say " Trend: #{result[:trend]}"
80
+ end
81
+ rescue LoadError => e
82
+ say "Error: lex-metering not available (#{e.message})", :red
83
+ end
84
+
85
+ desc 'budget', 'Show or set daily budget threshold'
86
+ option :set, type: :numeric, desc: 'Set daily budget threshold'
87
+ def budget
88
+ if options[:set]
89
+ say "Daily budget set to $#{options[:set]}", :green
90
+ say 'Budget enforcement requires alert rules (see legion alerts)', :yellow
91
+ else
92
+ say 'Budget', :green
93
+ say '-' * 40
94
+ say ' No budget threshold configured. Use --set to configure.', :yellow
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
data/lib/legion/cli.rb CHANGED
@@ -47,6 +47,7 @@ module Legion
47
47
  autoload :Llm, 'legion/cli/llm_command'
48
48
  autoload :Tty, 'legion/cli/tty_command'
49
49
  autoload :ObserveCommand, 'legion/cli/observe_command'
50
+ autoload :Payroll, 'legion/cli/payroll_command'
50
51
  autoload :Interactive, 'legion/cli/interactive'
51
52
 
52
53
  class Main < Thor
@@ -258,6 +259,9 @@ module Legion
258
259
  desc 'observe SUBCOMMAND', 'MCP tool observation stats'
259
260
  subcommand 'observe', Legion::CLI::ObserveCommand
260
261
 
262
+ desc 'payroll SUBCOMMAND', 'Workforce cost and labor economics'
263
+ subcommand 'payroll', Legion::CLI::Payroll
264
+
261
265
  desc 'tree', 'Print a tree of all available commands'
262
266
  def tree
263
267
  legion_print_command_tree(self.class, 'legion', '')
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Legion
4
- VERSION = '1.4.85'
4
+ VERSION = '1.4.86'
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.85
4
+ version: 1.4.86
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity
@@ -513,6 +513,7 @@ files:
513
513
  - lib/legion/cli/observe_command.rb
514
514
  - lib/legion/cli/openapi_command.rb
515
515
  - lib/legion/cli/output.rb
516
+ - lib/legion/cli/payroll_command.rb
516
517
  - lib/legion/cli/plan_command.rb
517
518
  - lib/legion/cli/pr_command.rb
518
519
  - lib/legion/cli/rbac_command.rb