Class: Legion::CLI::FleetSetup

Inherits:
Object
  • Object
show all
Defined in:
lib/legion/cli/fleet_setup.rb

Constant Summary collapse

FLEET_GEMS =
%w[
  lex-assessor lex-planner lex-developer lex-validator
  lex-codegen lex-eval lex-exec
  lex-tasker lex-conditioner lex-transformer
  lex-audit lex-governance lex-agentic-social
].freeze
MANIFEST_PATH =
File.expand_path('../fleet/manifest.yml', __dir__)

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(formatter:, options:) ⇒ FleetSetup

Returns a new instance of FleetSetup.



20
21
22
23
# File 'lib/legion/cli/fleet_setup.rb', line 20

def initialize(formatter:, options:)
  @formatter = formatter
  @options = options
end

Instance Attribute Details

#formatterObject (readonly)

Returns the value of attribute formatter.



18
19
20
# File 'lib/legion/cli/fleet_setup.rb', line 18

def formatter
  @formatter
end

#optionsObject (readonly)

Returns the value of attribute options.



18
19
20
# File 'lib/legion/cli/fleet_setup.rb', line 18

def options
  @options
end

Class Method Details

.fleet_gemsObject



25
26
27
# File 'lib/legion/cli/fleet_setup.rb', line 25

def self.fleet_gems
  FLEET_GEMS
end

.manifest_pathObject



29
30
31
# File 'lib/legion/cli/fleet_setup.rb', line 29

def self.manifest_path
  MANIFEST_PATH
end

Instance Method Details

#phase1_installObject

Phase 1: Install gems. Extensions register themselves on next LegionIO start.



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/legion/cli/fleet_setup.rb', line 34

def phase1_install
  formatter.header('Fleet Setup - Phase 1: Install') unless options[:json]

  installed, missing = partition_gems
  if missing.empty?
    formatter.success('All fleet gems already installed') unless options[:json]
    return { success: true, installed: installed.size, skipped: 0 }
  end

  result = install_gems(missing)
  if result[:failed].positive?
    formatter.error("#{result[:failed]} gem(s) failed to install") unless options[:json]
    return { success: false, error: :install_failed, **result }
  end

  formatter.success("Phase 1 complete: #{result[:installed]} gem(s) installed") unless options[:json]
  { success: true, **result }
end

#phase2_wireObject

Phase 2: Wire relationships, seed rules, register settings. Requires that extensions have been loaded and registered (LexRegister).



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/legion/cli/fleet_setup.rb', line 55

def phase2_wire
  formatter.header('Fleet Setup - Phase 2: Wire') unless options[:json]

  require 'legion/workflow/manifest'
  require 'legion/workflow/loader'

  manifest = Legion::Workflow::Manifest.new(path: MANIFEST_PATH)
  unless manifest.valid?
    formatter.error("Invalid manifest: #{manifest.errors.join(', ')}") unless options[:json]
    return { success: false, error: :invalid_manifest, errors: manifest.errors }
  end

  loader_result = Legion::Workflow::Loader.new.install(manifest)
  unless loader_result[:success]
    formatter.error("Relationship install failed: #{loader_result[:error]}") unless options[:json]
    return { success: false, error: :relationship_install_failed, detail: loader_result }
  end

  apply_planner_timeout_policy
  rules_result = seed_conditioner_rules
  settings_result = register_settings

  unless options[:json]
    formatter.success(
      "Phase 2 complete: chain_id=#{loader_result[:chain_id]}, " \
      "#{loader_result[:relationship_ids].size} relationships"
    )
  end

  {
    success:       true,
    chain_id:      loader_result[:chain_id],
    relationships: loader_result[:relationship_ids].size,
    rules:         rules_result,
    settings:      settings_result
  }
end