一条命令带出整个会话:hermes chat -q 在终端里"续上"了

你是一个喜欢把 Hermes 嵌进各种启动器的人:按个快捷键弹出一个终端,里面已经预设好一句提示词,回车就开始干活。以前这条路走不通——hermes chat -q "整理这个目录" 会老老实实答完一句话然后退出,你要的“答完还能继续追问”根本没戏。想要交互式,只能先跑一遍 -q 把会话存下来,再 hermes chat -r 恢复,两步走,还经常丢上下文。8 月 28 日合并的 PR #97121 把这条老路彻底铲平:在真实终端(TTY)里,-q 现在会种下一个实时交互会话,首条消息原样提交,答完不退出,你直接接着聊。
以前为什么那么别扭
-q/--query 的定位原本是“一次性查询”:传一句提示词,Hermes 回答,退出。这让它天然适合脚本和自动化——hermes chat -q "总结今天的 commit" 输出完就结束,不占终端。
但代价是:想在启动器里“带着预设问题进入交互模式”(其他编程代理早就有的体验),只能手工拼两步:
# 第一步:跑一次,拿到会话文件
hermes chat -q "整理这个目录" > /tmp/usage.txt
# 第二步:恢复那个会话,才能继续对话
hermes chat -r /tmp/usage.txt
又绕又脆:中间的 usage 文件容易丢,恢复的会话还未必带着你要的上下文。Omarchy 这类“提示词驱动的代理终端”项目甚至准备为此专门写 workaround(basecamp/omarchy#8705),结果官方直接把这个模式做进了 CLI。
新行为:-q 在 TTY 下种下实时会话
改动后,在真实 TTY 上执行:
hermes chat -q "修复 parser 里的这个 bug"
首条消息会按字面提交为会话的第一轮(_SeededQueryMessage 哨兵消息),然后进入正常的交互循环——你可以继续输入、追问、用斜杠命令,跟平时打开 hermes chat 完全一样。
“按字面”是重点:这条种子消息不会被解析。不会当成斜杠命令执行,不会触发 ! shell 转义,不会做 $(...) 命令替换,也不会被当作文件拖放。它跟 --oneshot 的既有语义一致:给模型什么就传什么,干净利落。
经典 CLI 和 TUI 两条路径都支持:TUI 侧通过 STARTUP_QUERY 走 submitLite 提交流程,行为一致。
想要旧行为?--oneshot 明说
如果你就是想要“答完即退”的一次性语义,新加的 hermes chat --oneshot 标志(内部名 oneshot_exit)就是旧行为的正式名字:
hermes chat --oneshot -q "只回答这一个问题"
不传 --oneshot 时:
- 真实 TTY +
-q→ 种下交互会话(新行为); - 非 TTY(管道、脚本)→ 自动退化为“答完即退”,不会卡住自动化流程;
- 加了
-Q/--quiet→ 也是答完即退,安静模式不受影响。
也就是说:脚本和自动化完全不受影响,只有真人坐在终端前时行为才变——这正是这个改动想达到的效果。
典型用法
启动器 / 快捷键:把 hermes chat -q "打开昨天的会话,继续昨天没做完的事" 绑到快捷键上,弹出的就是可以直接接着干活的交互终端。
预置工作流:写一个 wrapper 脚本,接受目录参数并生成问题,然后 exec 进 hermes chat -q "$PROMPT"——用户得到的是一个“已经知道该干嘛”的会话,而不是冷冰冰的空白提示符。
自动化不受影响:cron 脚本、CI 里照旧用 hermes chat -q ... | grep ... 或 -Q,行为跟以前一模一样。
升级与验证
这个改动 8 月 28 日合并,目前在上游 main 分支上,尚未进入正式发布 tag——想立刻用需要从源码或 main 构建安装。等它随下一个版本发布后,hermes update 即可。
验证方法很简单:在终端里跑 hermes chat -q "1+1等于几?",如果答完之后提示符还在、你能继续输入,说明新行为已生效;如果直接退出回到 shell,说明你还在旧版本。
延伸阅读
- 想了解 Hermes chat 的完整命令面,看我们的 hermes-chat 命令参考;
- 对会话的保存、恢复、导出感兴趣,读 会话导出指南;
- 想系统规划你的自动化工作流,参考 cron 自动化完全指南。