diff --git a/PartnerCtl/src/main/java/work/slhaf/partner/ctl/PartnerCtl.kt b/PartnerCtl/src/main/java/work/slhaf/partner/ctl/PartnerCtl.kt new file mode 100644 index 00000000..a93c4948 --- /dev/null +++ b/PartnerCtl/src/main/java/work/slhaf/partner/ctl/PartnerCtl.kt @@ -0,0 +1,33 @@ +package work.slhaf.partner.ctl + +import picocli.AutoComplete +import picocli.CommandLine +import work.slhaf.partner.ctl.commands.* +import kotlin.system.exitProcess + +@CommandLine.Command( + name = "partnerctl", + mixinStandardHelpOptions = true, + version = ["partnerctl 0.1.0"], + subcommands = [ + InitCommand::class, + RunCommand::class, + ChatCommand::class, + ConfigCommand::class, + ModuleCommand::class, + AutoComplete.GenerateCompletion::class + ], + description = ["Partner command line tool."] +) +class PartnerCtl : Runnable { + + override fun run() { + CommandLine.usage(this, System.out) + } + +} + +fun main(args: Array) { + val exitCode = CommandLine(PartnerCtl()).execute(*args) + exitProcess(exitCode) +} \ No newline at end of file diff --git a/PartnerCtl/src/main/java/work/slhaf/partner/ctl/commands/ChatCommand.kt b/PartnerCtl/src/main/java/work/slhaf/partner/ctl/commands/ChatCommand.kt new file mode 100644 index 00000000..fe26381a --- /dev/null +++ b/PartnerCtl/src/main/java/work/slhaf/partner/ctl/commands/ChatCommand.kt @@ -0,0 +1,55 @@ +package work.slhaf.partner.ctl.commands + +import org.jline.reader.EndOfFileException +import org.jline.reader.LineReaderBuilder +import org.jline.reader.UserInterruptException +import org.jline.terminal.Terminal +import org.jline.terminal.TerminalBuilder +import picocli.CommandLine + +@CommandLine.Command( + name = "chat", + description = ["Start an interactive chat demo."] +) +class ChatCommand : Runnable { + + override fun run() { + val terminal = createTerminal() + val reader = LineReaderBuilder.builder() + .terminal(terminal) + .build() + + terminal.writer().println("Partner chat demo. Type /exit to quit.") + terminal.writer().flush() + + while (true) { + val line = try { + reader.readLine("partner> ") + } catch (_: UserInterruptException) { + terminal.writer().println() + terminal.writer().flush() + continue + } catch (_: EndOfFileException) { + terminal.writer().println() + terminal.writer().flush() + break + } + + when { + line == "/exit" -> break + line.isBlank() -> continue + else -> { + terminal.writer().println("echo: $line") + terminal.writer().flush() + } + } + } + } + + private fun createTerminal(): Terminal { + return TerminalBuilder.builder() + .system(true) + .dumb(true) + .build() + } +} \ No newline at end of file diff --git a/PartnerCtl/src/main/java/work/slhaf/partner/ctl/commands/ConfigCommand.kt b/PartnerCtl/src/main/java/work/slhaf/partner/ctl/commands/ConfigCommand.kt new file mode 100644 index 00000000..7a354aab --- /dev/null +++ b/PartnerCtl/src/main/java/work/slhaf/partner/ctl/commands/ConfigCommand.kt @@ -0,0 +1,10 @@ +package work.slhaf.partner.ctl.commands + +import picocli.CommandLine + +@CommandLine.Command(name = "config") +class ConfigCommand : Runnable{ + override fun run() { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/PartnerCtl/src/main/java/work/slhaf/partner/ctl/commands/InitCommand.kt b/PartnerCtl/src/main/java/work/slhaf/partner/ctl/commands/InitCommand.kt new file mode 100644 index 00000000..0e217cda --- /dev/null +++ b/PartnerCtl/src/main/java/work/slhaf/partner/ctl/commands/InitCommand.kt @@ -0,0 +1,10 @@ +package work.slhaf.partner.ctl.commands + +import picocli.CommandLine + +@CommandLine.Command(name = "init") +class InitCommand : Runnable{ + override fun run() { + println("init ok") + } +} \ No newline at end of file diff --git a/PartnerCtl/src/main/java/work/slhaf/partner/ctl/commands/ModuleCommand.kt b/PartnerCtl/src/main/java/work/slhaf/partner/ctl/commands/ModuleCommand.kt new file mode 100644 index 00000000..6f1ecf63 --- /dev/null +++ b/PartnerCtl/src/main/java/work/slhaf/partner/ctl/commands/ModuleCommand.kt @@ -0,0 +1,10 @@ +package work.slhaf.partner.ctl.commands + +import picocli.CommandLine + +@CommandLine.Command(name = "module") +class ModuleCommand : Runnable{ + override fun run() { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/PartnerCtl/src/main/java/work/slhaf/partner/ctl/commands/RunCommand.kt b/PartnerCtl/src/main/java/work/slhaf/partner/ctl/commands/RunCommand.kt new file mode 100644 index 00000000..9576cecd --- /dev/null +++ b/PartnerCtl/src/main/java/work/slhaf/partner/ctl/commands/RunCommand.kt @@ -0,0 +1,10 @@ +package work.slhaf.partner.ctl.commands + +import picocli.CommandLine + +@CommandLine.Command(name = "run") +class RunCommand : Runnable{ + override fun run() { + TODO("Not yet implemented") + } +} \ No newline at end of file