Appearance
功能规格说明:Bash 模式
创建日期:2026-03-25
最近更新:2026-08-26(改名 Bang → Bash 模式;输出统一为 user 消息 bash tool block 承载,执行复用 bash 工具)
用户场景与测试 (必填)
用户故事:基本命令执行(优先级:P1)
作为用户,我希望能够通过 ! 前缀直接从聊天输入执行 shell 命令,以便我可以快速执行系统操作而无需离开 agent 界面。
为什么是这个优先级:这是功能的核心。它为用户提供了与系统交互的强大方式。
独立测试:可以通过在聊天输入中输入 !echo "hello" 等命令并验证命令被执行且输出 "hello" 显示在对话中来测试。
验收场景:
- 假设聊天输入为空,当用户输入
!ls -la并按下 Enter 时,则命令ls -la在当前工作目录中执行,对话中出现一条 user 消息(内容为ls -la),其下以 bash tool block 形态显示命令输出。 - 假设命令正在执行中,当用户输入另一个命令时,则系统应该防止并发执行并显示错误消息。
用户故事:输出全量展示(优先级:P2)
作为用户,我希望 shell 命令的输出完整显示在对话中,以便我可以随时回溯查看完整结果。
为什么是这个优先级:bash 模式输出作为 user 消息 tool block 承载,复用 bash 工具块渲染规则——result 全量展示不截断。原始 bang spec 的「20 行只显示最后 3 行」截断规则因渲染统一而移除。
独立测试:可以通过执行具有多行输出的命令(如 !seq 1 100)并验证全部 100 行都显示在消息流中来测试。
验收场景:
- 假设一个 20 行输出的命令,当输出显示在消息流中时,则全部 20 行完整展示,不截断、不折叠。
用户故事:命令中止(优先级:P2)
作为用户,我希望能够中止长时间运行的 shell 命令,如果我意识到这是一个错误或它花费太长时间。
为什么是这个优先级:这防止 agent 卡在等待可能永远不会完成或用户不再想运行的命令上。
验收场景:
- 假设长时间运行的命令如
!sleep 60正在执行,当用户触发中止操作(如 Ctrl+C)时,则进程被杀死,命令输出条目反映命令已终止(如 result 标注退出码 130)。
边界情况
- 命令不存在怎么办? 系统应该捕获 shell 的错误并在命令输出条目中显示,带有错误状态(如
[exit code: 127])。 - 命令没有产生输出怎么办? 命令输出条目仍应显示命令,但输出区域应为空或隐藏。
- 命令被信号中断(如 SIGINT)怎么办? 系统应该优雅地处理信号,在 result 中标注退出码(如 130),并显示命令已被中断。
- 命令在不存在的目录中执行怎么办? 执行层应该处理错误并向用户报告。
实现说明(开发者视角,非验收行为)
- 消息承载:bash 模式消息不再使用独立
BangBlock块类型,改为 user 消息 + bash tool block(name: "Bash"(BASH_TOOL_NAME),parameters 存命令,result 存输出)。消息文本块忠实回显命令本身。 - 执行复用:bash 模式执行复用 bash 工具执行引擎(shell 解析、CWD 追踪、超时、输出处理),不再维护独立 spawn 逻辑。执行期间通过
onShortResultUpdate/onResultUpdate回调实时流式写入 tool block(toolBlockUpdated增量通知驱动三端 UI)。 - 输出进上下文:user 消息 tool block 的 result 经
<local-command-stdout>规则进入模型上下文(convertMessagesForAPI 通用逻辑);不触发 AI 回复。 - 退出码呈现:成功(exit 0)不标注;失败在 result 文本前缀标注
[exit code: N]。 - 中止:复用 bash 工具的 abort 机制(AbortSignal,SIGINT 退出码 130)。
- 回滚检查点:bash 模式命令消息是用户真实输入,与 fork 技能命令消息一致,可作为 /rewind 检查点(系统生成的输出块不作为检查点依据)。