Module: AIA::ConfigModules::Validator

Defined in:
lib/aia/config/validator.rb

Class Method Summary collapse

Class Method Details

.configure_prompt_manager(config) ⇒ Object



151
152
153
154
155
# File 'lib/aia/config/validator.rb', line 151

def configure_prompt_manager(config)
  return unless config.parameter_regex

  PromptManager::Prompt.parameter_regex = Regexp.new(config.parameter_regex)
end

.handle_completion_script(config) ⇒ Object



133
134
135
136
137
138
# File 'lib/aia/config/validator.rb', line 133

def handle_completion_script(config)
  return unless config.completion

  FileLoader.generate_completion_script(config.completion)
  exit
end

.handle_executable_prompt(config) ⇒ Object



71
72
73
74
75
# File 'lib/aia/config/validator.rb', line 71

def handle_executable_prompt(config)
  return unless config.executable_prompt && config.context_files && !config.context_files.empty?

  config.executable_prompt_file = config.context_files.pop
end

.handle_fuzzy_search_prompt_id(config) ⇒ Object



104
105
106
107
108
109
110
111
# File 'lib/aia/config/validator.rb', line 104

def handle_fuzzy_search_prompt_id(config)
  return unless config.fuzzy && config.prompt_id.empty?

  # When fuzzy search is enabled but no prompt ID is provided,
  # set a special value to trigger fuzzy search without an initial query
  # SMELL: This feels like a cludge
  config.prompt_id = '__FUZZY_SEARCH__'
end

.normalize_boolean_flag(config, flag) ⇒ Object



119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/aia/config/validator.rb', line 119

def normalize_boolean_flag(config, flag)
  return if [TrueClass, FalseClass].include?(config[flag].class)

  config[flag] = case config[flag]
                 when nil, '', 'false', false
                   false
                 when 'true', true
                   true
                 else
                   # For any other non-empty string value, treat as true
                   true
                 end
end

.normalize_boolean_flags(config) ⇒ Object



113
114
115
116
117
# File 'lib/aia/config/validator.rb', line 113

def normalize_boolean_flags(config)
  normalize_boolean_flag(config, :chat)
  normalize_boolean_flag(config, :fuzzy)
  normalize_boolean_flag(config, :consensus)
end

.prepare_pipeline(config) ⇒ Object



157
158
159
160
161
# File 'lib/aia/config/validator.rb', line 157

def prepare_pipeline(config)
  return if config.prompt_id.nil? || config.prompt_id.empty? || config.prompt_id == config.pipeline.first

  config.pipeline.prepend config.prompt_id
end

.process_prompt_id_from_args(config, remaining_args) ⇒ Object



47
48
49
50
51
52
53
54
55
56
# File 'lib/aia/config/validator.rb', line 47

def process_prompt_id_from_args(config, remaining_args)
  return if remaining_args.empty?

  maybe_id = remaining_args.first
  maybe_id_plus = File.join(config.prompts_dir, maybe_id + config.prompt_extname)

  if AIA.bad_file?(maybe_id) && AIA.good_file?(maybe_id_plus)
    config.prompt_id = remaining_args.shift
  end
end

.process_role_configuration(config) ⇒ Object



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/aia/config/validator.rb', line 84

def process_role_configuration(config)
  return if config.role.empty?

  unless config.roles_prefix.empty?
    unless config.role.start_with?(config.roles_prefix)
      config.role.prepend "#{config.roles_prefix}/"
    end
  end

  config.roles_dir ||= File.join(config.prompts_dir, config.roles_prefix)

  if config.prompt_id.nil? || config.prompt_id.empty?
    if !config.role.nil? && !config.role.empty?
      config.prompt_id = config.role
      config.pipeline.prepend config.prompt_id
      config.role = ''
    end
  end
end

.process_stdin_contentObject



32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/aia/config/validator.rb', line 32

def process_stdin_content
  stdin_content = ''

  if !STDIN.tty? && !STDIN.closed?
    begin
      stdin_content << "\n" + STDIN.read
      STDIN.reopen('/dev/tty')  # Reopen STDIN for interactive use
    rescue => _
      # If we can't reopen, continue without error
    end
  end

  stdin_content
end

.tailor_the_config(config) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/aia/config/validator.rb', line 9

def tailor_the_config(config)
  remaining_args = config.remaining_args.dup
  config.remaining_args = nil

  stdin_content = process_stdin_content
  config.stdin_content = stdin_content if stdin_content && !stdin_content.strip.empty?

  process_prompt_id_from_args(config, remaining_args)
  validate_and_set_context_files(config, remaining_args)
  handle_executable_prompt(config)
  validate_required_prompt_id(config)
  process_role_configuration(config)
  handle_fuzzy_search_prompt_id(config)
  normalize_boolean_flags(config)
  handle_completion_script(config)
  validate_final_prompt_requirements(config)
  configure_prompt_manager(config)
  prepare_pipeline(config)
  validate_pipeline_prompts(config)

  config
end

.validate_and_set_context_files(config, remaining_args) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/aia/config/validator.rb', line 58

def validate_and_set_context_files(config, remaining_args)
  return if remaining_args.empty?

  bad_files = remaining_args.reject { |filename| AIA.good_file?(filename) }
  if bad_files.any?
    STDERR.puts "Error: The following files do not exist: #{bad_files.join(', ')}"
    exit 1
  end

  config.context_files ||= []
  config.context_files += remaining_args
end

.validate_final_prompt_requirements(config) ⇒ Object



140
141
142
143
144
145
146
147
148
149
# File 'lib/aia/config/validator.rb', line 140

def validate_final_prompt_requirements(config)
  # Only require a prompt_id if we're not in chat mode, not using fuzzy search, and no context files
  if !config.chat && !config.fuzzy && (config.prompt_id.nil? || config.prompt_id.empty?) && (!config.context_files || config.context_files.empty?)
    STDERR.puts "Error: A prompt ID is required unless using --chat, --fuzzy, or providing context files. Use -h or --help for help."
    exit 1
  end

  # If we're in chat mode with context files but no prompt_id, that's valid
  # This is handled implicitly - no action needed
end

.validate_pipeline_prompts(config) ⇒ Object



163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
# File 'lib/aia/config/validator.rb', line 163

def validate_pipeline_prompts(config)
  return if config.pipeline.empty?

  and_exit = false

  config.pipeline.each do |prompt_id|
    # Skip empty prompt IDs (can happen in chat-only mode)
    next if prompt_id.nil? || prompt_id.empty?

    prompt_file_path = File.join(config.prompts_dir, "#{prompt_id}.txt")
    unless File.exist?(prompt_file_path)
      STDERR.puts "Error: Prompt ID '#{prompt_id}' does not exist at #{prompt_file_path}"
      and_exit = true
    end
  end

  exit(1) if and_exit
end

.validate_required_prompt_id(config) ⇒ Object



77
78
79
80
81
82
# File 'lib/aia/config/validator.rb', line 77

def validate_required_prompt_id(config)
  return unless config.prompt_id.nil? && !config.chat && !config.fuzzy

  STDERR.puts "Error: A prompt ID is required unless using --chat, --fuzzy, or providing context files. Use -h or --help for help."
  exit 1
end