Class: Norn::ConfigLoader

Inherits:
Object
  • Object
show all
Defined in:
lib/norn/config_loader.rb

Constant Summary collapse

Schema =

Define validation schema for our configuration using dry-schema

Dry::Schema.Params do
  optional(:llm_provider).filled(:string, included_in?: ["openai", "gemini"])
  optional(:sandbox_info).maybe(:string)
  optional(:openai_model).maybe(:string)
  optional(:gemini_model).maybe(:string)
  optional(:temperature).maybe(:float)
  optional(:git_addon_enabled).maybe(:bool)
  optional(:git_addon_message).maybe(:string)
  optional(:session_cli_format).maybe(:string)
  optional(:workspace_root).maybe(:string)
  
  # New instruction structure
  optional(:instructions).hash do
    optional(:clear).array(:string)
    optional(:base).maybe(:string)
    optional(:prepend).array(:string)
    optional(:append).array(:string)
  end
end

Class Method Summary collapse

Class Method Details

.loadObject

Loads the config from XDG, Local Workspace, and Environment, in that order. Returns the validated configuration hash wrapped in a Dry::Monads::Result.



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/norn/config_loader.rb', line 33

def load
  global_config = load_first_match(global_paths) || {}
  local_config = Norn::LocalConfigReader.new.read || {}

  config_data = {}
  config_data.merge!(global_config)
  config_data.merge!(local_config)

  # Merge instructions block customly
  global_inst = global_config[:instructions] || {}
  local_inst = local_config[:instructions] || {}
  compiled_inst = compile_instructions_block(global_inst, local_inst)
  config_data[:instructions] = compiled_inst

  # 3. Load Environment Variables
  if ENV["NORN_PROVIDER"] && !ENV["NORN_PROVIDER"].strip.empty?
    config_data[:llm_provider] = ENV["NORN_PROVIDER"].strip
  end

  # Normalize keys (e.g. map alias 'provider' to 'llm_provider')
  config_data = normalize_keys(config_data)

  # 4. Validate with dry-schema
  validation = Schema.call(config_data)
  if validation.success?
    # Apply validated values to dry-configurable Config
    validation.to_h.each do |key, value|
      Norn::Config.config.send("#{key}=", value) if value
    end
  else
    # Print validation warnings to stderr
    warn "Norn Config Warning: #{validation.errors.to_h.inspect}"
  end

  Success(validation.to_h)
end