Class: PredictabilityEngine::Cli

Inherits:
Thor
  • Object
show all
Includes:
CliBase
Defined in:
lib/predictability_engine/cli.rb

Constant Summary collapse

GENERATE_SIZE_DESC =
"Preset volume: #{DataGenerator::PRESETS.map do |n, c|
  "#{n} (#{c[:completed]}/#{c[:wip]})"
end.join(', ')}".freeze

Constants included from CliBase

PredictabilityEngine::CliBase::SIZE_DESC, PredictabilityEngine::CliBase::VALID_SIZES

Instance Method Summary collapse

Methods included from CliBase

included, #initialize

Instance Method Details

#ask_ai(source, question) ⇒ Object



325
326
327
328
329
330
331
332
333
334
335
336
337
338
# File 'lib/predictability_engine/cli.rb', line 325

def ask_ai(source, question)
  manager = DataManager.new
  manager.load(source)
  assistant = Agents::Assistant.new(manager)
  PredictabilityEngine.logger.info { 'AI Thinking...' }
  response = assistant.ask(question)
  PredictabilityEngine.logger.info { 'AI Response:' }
  PredictabilityEngine.logger.info { '------------' }
  if response.respond_to?(:content)
    PredictabilityEngine.logger.info { response.content }
  else
    PredictabilityEngine.logger.info { response }
  end
end

#batch(source) ⇒ Object



244
245
246
# File 'lib/predictability_engine/cli.rb', line 244

def batch(source)
  Viz.new([], options).all_formats(source)
end

#calibrate(source) ⇒ Object



280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
# File 'lib/predictability_engine/cli.rb', line 280

def calibrate(source)
  items = PredictabilityEngine.load_items(source)
  result = Simulators::MonteCarloValidator.calibration(
    items,
    validation_trials: options[:validation_trials],
    primary_trials: options[:primary_trials]
  )
  if result.nil?
    PredictabilityEngine.logger.info do
      'Insufficient data for hindcast calibration (need 10+ completed items with historical WIP).'
    end
    return
  end
  print_calibration_results(result)
end

#forecast(source, backlog_count) ⇒ Object



266
267
268
269
270
271
272
273
# File 'lib/predictability_engine/cli.rb', line 266

def forecast(source, backlog_count)
  items = PredictabilityEngine.load_items(source)

  historical = Calculators::Throughput.daily(items).values
  results = Simulators::MonteCarlo.when_will_it_be_done(backlog_count.to_i, historical)

  print_forecast_results(backlog_count, results)
end

#generate(output) ⇒ Object



306
307
308
309
310
311
312
313
314
# File 'lib/predictability_engine/cli.rb', line 306

def generate(output)
  path = DataGenerator.generate(
    output: output,
    size: options[:size].to_sym,
    completed: options[:completed],
    wip: options[:wip]
  )
  PredictabilityEngine.logger.info { "Synthetic #{options[:size]} dataset written to #{path}" }
end

#report(input_source, format = 'terminal', output = nil) ⇒ Object



251
252
253
254
255
256
# File 'lib/predictability_engine/cli.rb', line 251

def report(input_source, format = 'terminal', output = nil)
  if format.to_sym != :terminal && output.nil? && options[:clean]
    ReportGenerator.clean_report_dir(input_source, **options)
  end
  PredictabilityEngine.run_and_print_report(input_source, format, options, output: output)
end

#setupObject



320
321
322
# File 'lib/predictability_engine/cli.rb', line 320

def setup
  SetupManager.new.run
end

#summary(source) ⇒ Object



260
261
262
263
# File 'lib/predictability_engine/cli.rb', line 260

def summary(source)
  items = PredictabilityEngine.load_items(source)
  PredictabilityEngine.logger.info { SummaryVisualizer.metrics_terminal(items, color: options[:color]) }
end

#versionObject



344
345
346
# File 'lib/predictability_engine/cli.rb', line 344

def version
  say VERSION
end