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 +4 -4
- data/CHANGELOG.md +6 -0
- data/CLAUDE.md +3 -2
- data/Dockerfile +2 -2
- data/lib/legion/cli/payroll_command.rb +99 -0
- data/lib/legion/cli.rb +4 -0
- data/lib/legion/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c4776d93816eb13deabef22f7d9f64bb295eafc950a451f8654b2003ff3497d8
|
|
4
|
+
data.tar.gz: dcdb4ea6755f1af00d1f8a6576301d183c85fd8336b41cdf2b500bcbe967225b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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', '')
|
data/lib/legion/version.rb
CHANGED
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.
|
|
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
|