Commit c3ffcf1
Changed files (5)
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",