Class: Aiko::CLI

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

Constant Summary collapse

REPL_HELP =
<<~HELP
  /exit, /quit  終了 (Ctrl-D も同様)
  /clear        会話履歴をクリア
  /help         このヘルプを表示
HELP

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.parse(argv) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/aiko/cli.rb', line 17

def self.parse(argv)
  options = {}
  parser = OptionParser.new do |opts|
    opts.banner = "Usage: aiko [options] [prompt]"
    opts.on("-w", "--workdir DIR", "Working directory (default: current directory)") { |v| options[:workdir] = v }
    opts.on("-m", "--model MODEL", "Override model name") { |v| options[:model] = v }
    opts.on("--base-url URL", "Override API endpoint") { |v| options[:base_url] = v }
    opts.on("-y", "--yes", "Auto-approve all tool executions") { options[:yes] = true }
    opts.on("--max-iterations N", Integer, "Max agent loop iterations (default: 20)") { |v| options[:max_iterations] = v }
    opts.on("-v", "--version", "Show version") { options[:version] = true }
    opts.on("-h", "--help", "Show help") { options[:help] = true }
  end
  rest = parser.parse(argv)
  options[:help_text] = parser.to_s
  prompt = rest.empty? ? nil : rest.join(" ")
  [options, prompt]
end

.start(argv) ⇒ Object



13
14
15
# File 'lib/aiko/cli.rb', line 13

def self.start(argv)
  new.start(argv)
end

Instance Method Details

#start(argv) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/aiko/cli.rb', line 35

def start(argv)
  options, prompt = self.class.parse(argv)
  return show_version if options[:version]
  return show_help(options) if options[:help]

  config = Config.load(config_options(options))
  ui = UI.new(auto_approve: options.fetch(:yes, false))
  agent = build_agent(config, ui)
  prompt ? run_oneshot(agent, ui, prompt) : run_repl(agent, ui, config)
rescue OptionParser::ParseError, ConfigError => e
  warn "Error: #{e.message}"
  2
end