Commit c3ffcf1

mo khan <mo@mokhan.ca>
2026-03-11 18:07:21
refactor: move CLI class to a separate file
1 parent 3f34b45
exe/elelem
@@ -1,7 +1,7 @@
 #!/usr/bin/env -S ruby -W0
 # frozen_string_literal: true
 
-require "elelem"
+require "elelem/cli"
 
 Signal.trap("INT") { exit 1 }
 
lib/elelem/cli.rb
@@ -0,0 +1,62 @@
+# frozen_string_literal: true
+
+require "elelem"
+
+module Elelem
+  class CLI
+    def initialize(args)
+      @provider = "ollama"
+      @args = parse(args)
+    end
+
+    def run
+      command = @args.shift || "chat"
+      send(command.tr("-", "_"))
+    rescue NoMethodError
+      abort "Unknown command: #{command}"
+    end
+
+    private
+
+    def parse(args)
+      @parser = OptionParser.new do |o|
+        o.banner = "Usage: elelem [command] [options] [args]"
+        o.separator "\nCommands:"
+        o.separator "  chat              Interactive REPL (default)"
+        o.separator "  ask <prompt>      One-shot query (reads stdin if piped)"
+        o.separator "  files             Output files as XML (no options)"
+        o.separator "  help              Show this help"
+        o.separator "\nOptions:"
+        o.on("-p", "--provider NAME", "ollama, anthropic, vertex, openai") { |p| @provider = p }
+        o.on("-h", "--help") { puts o; exit }
+      end
+      @parser.parse!(args)
+    end
+
+    def help
+      puts @parser
+    end
+
+    def chat
+      Elelem.start(provider: @provider)
+    end
+
+    def ask
+      abort "Usage: elelem ask <prompt>" if @args.empty?
+      prompt = @args.join(" ")
+      prompt = "#{prompt}\n\n```\n#{$stdin.read}\n```" if $stdin.stat.pipe?
+      Elelem::Terminal.new.markdown Elelem.ask(prompt, provider: @provider)
+    end
+
+    def files
+      files = $stdin.stat.pipe? ? $stdin.readlines : `git ls-files`.lines
+      puts "<documents>"
+      files.each_with_index do |line, i|
+        path = line.strip
+        next if path.empty? || !File.file?(path)
+        puts %Q{<document index="#{i + 1}"><source>#{path}</source><document_content><![CDATA[#{File.read(path)}]]></document_content></document>}
+      end
+      puts "</documents>"
+    end
+  end
+end
lib/elelem/version.rb
@@ -2,4 +2,4 @@
 
 module Elelem
   VERSION = "0.10.0"
-end
\ No newline at end of file
+end
lib/elelem.rb
@@ -63,61 +63,4 @@ module Elelem
     agent.turn(prompt)
     agent.conversation.last[:content]
   end
-
-  class CLI
-    def initialize(args)
-      @provider = "ollama"
-      @args = parse(args)
-    end
-
-    def run
-      command = @args.shift || "chat"
-      send(command.tr("-", "_"))
-    rescue NoMethodError
-      abort "Unknown command: #{command}"
-    end
-
-    private
-
-    def parse(args)
-      @parser = OptionParser.new do |o|
-        o.banner = "Usage: elelem [command] [options] [args]"
-        o.separator "\nCommands:"
-        o.separator "  chat              Interactive REPL (default)"
-        o.separator "  ask <prompt>      One-shot query (reads stdin if piped)"
-        o.separator "  files             Output files as XML (no options)"
-        o.separator "  help              Show this help"
-        o.separator "\nOptions:"
-        o.on("-p", "--provider NAME", "ollama, anthropic, vertex, openai") { |p| @provider = p }
-        o.on("-h", "--help") { puts o; exit }
-      end
-      @parser.parse!(args)
-    end
-
-    def help
-      puts @parser
-    end
-
-    def chat
-      Elelem.start(provider: @provider)
-    end
-
-    def ask
-      abort "Usage: elelem ask <prompt>" if @args.empty?
-      prompt = @args.join(" ")
-      prompt = "#{prompt}\n\n```\n#{$stdin.read}\n```" if $stdin.stat.pipe?
-      Elelem::Terminal.new.markdown Elelem.ask(prompt, provider: @provider)
-    end
-
-    def files
-      files = $stdin.stat.pipe? ? $stdin.readlines : `git ls-files`.lines
-      puts "<documents>"
-      files.each_with_index do |line, i|
-        path = line.strip
-        next if path.empty? || !File.file?(path)
-        puts %Q{<document index="#{i + 1}"><source>#{path}</source><document_content><![CDATA[#{File.read(path)}]]></document_content></document>}
-      end
-      puts "</documents>"
-    end
-  end
 end
elelem.gemspec
@@ -27,6 +27,7 @@ Gem::Specification.new do |spec|
     "exe/elelem",
     "lib/elelem.rb",
     "lib/elelem/agent.rb",
+    "lib/elelem/cli.rb",
     "lib/elelem/commands.rb",
     "lib/elelem/conversation.rb",
     "lib/elelem/mcp.rb",