From 9048cc8b74230f00b9185f7abedd054a5626a399 Mon Sep 17 00:00:00 2001 From: liuzh Date: Wed, 1 Apr 2026 20:25:51 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=94=B9=E8=BF=9B=E7=BB=88=E7=AB=AF?= =?UTF-8?q?=E5=85=BC=E5=AE=B9=E6=80=A7=20-=20FFM=E5=8E=9F=E7=94=9F?= =?UTF-8?q?=E7=BB=88=E7=AB=AF=E6=94=AF=E6=8C=81=E3=80=81dumb=E7=BB=88?= =?UTF-8?q?=E7=AB=AF=E6=8F=90=E7=A4=BA=E3=80=81=E5=8F=8C=E9=87=8DGoodbye?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加jline-terminal-ffm依赖(JDK22+ FFM API原生终端) - JVM参数增加--enable-native-access=ALL-UNNAMED - dumb终端模式下显示黄色警告和建议 - 终端尺寸为0时不显示尺寸信息 - ExitCommand不再输出Goodbye(避免与ReplSession重复) - TerminalBuilder增加streams(System.in, System.out) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- pom.xml | 9 ++++++- .../claudecode/command/impl/ExitCommand.java | 2 +- .../java/com/claudecode/repl/ReplSession.java | 26 ++++++++++++++++--- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index b11bc9b..b5394e5 100644 --- a/pom.xml +++ b/pom.xml @@ -63,6 +63,13 @@ ${jline.version} + + + org.jline + jline-terminal-ffm + ${jline.version} + + info.picocli @@ -90,7 +97,7 @@ org.springframework.boot spring-boot-maven-plugin - -Xmx512m -Xms256m + -Xmx512m -Xms256m --enable-native-access=ALL-UNNAMED diff --git a/src/main/java/com/claudecode/command/impl/ExitCommand.java b/src/main/java/com/claudecode/command/impl/ExitCommand.java index 11e7b5d..fcd21cf 100644 --- a/src/main/java/com/claudecode/command/impl/ExitCommand.java +++ b/src/main/java/com/claudecode/command/impl/ExitCommand.java @@ -30,6 +30,6 @@ public class ExitCommand implements SlashCommand { if (context.exitCallback() != null) { context.exitCallback().run(); } - return "Goodbye!"; + return ""; } } diff --git a/src/main/java/com/claudecode/repl/ReplSession.java b/src/main/java/com/claudecode/repl/ReplSession.java index 0a76aa0..4198531 100644 --- a/src/main/java/com/claudecode/repl/ReplSession.java +++ b/src/main/java/com/claudecode/repl/ReplSession.java @@ -97,8 +97,15 @@ public class ReplSession { try (Terminal terminal = TerminalBuilder.builder() .system(true) + .streams(System.in, System.out) .build()) { + // 检测是否为 dumb 终端并提示 + boolean isDumb = "dumb".equals(terminal.getType()); + if (isDumb) { + log.info("当前为 dumb 终端模式,建议使用 Windows Terminal / PowerShell / cmd 获得完整体验"); + } + LineReader reader = LineReaderBuilder.builder() .terminal(terminal) .parser(new DefaultParser()) @@ -156,9 +163,22 @@ public class ReplSession { BannerPrinter.printCompact(out); out.println(AnsiStyle.dim(" Working directory: " + System.getProperty("user.dir"))); out.println(AnsiStyle.dim(" Tools: " + toolRegistry.size() + " registered")); - out.println(AnsiStyle.dim(" Terminal: " + terminal.getType() - + " (" + terminal.getWidth() + "×" + terminal.getHeight() + ")")); - out.println(AnsiStyle.dim(" Tip: Tab to complete commands, ↑↓ to browse history, Ctrl+D to exit")); + + boolean isDumb = "dumb".equals(terminal.getType()); + int w = terminal.getWidth(); + int h = terminal.getHeight(); + String termInfo = terminal.getType(); + if (w > 0 && h > 0) { + termInfo += " (" + w + "×" + h + ")"; + } + out.println(AnsiStyle.dim(" Terminal: " + termInfo)); + + if (isDumb) { + out.println(AnsiStyle.yellow(" ⚠ Dumb 终端模式:Tab补全和行编辑可能受限")); + out.println(AnsiStyle.yellow(" 建议在 Windows Terminal / PowerShell / cmd.exe 中运行")); + } else { + out.println(AnsiStyle.dim(" Tip: Tab to complete commands, ↑↓ to browse history, Ctrl+D to exit")); + } out.println(); }