问题
Deep Code v0.3.1 的主输入框中,输入 /plan 加一段计划文本后按回车,Deep Code 只会把输入切到 Plan Mode,文本不会被发送。再次按回车仍会命中 /plan 命令(缓冲仍以 /plan 开头),因此这段文本必须手动删除 /plan 前缀后才能发出——用户的输入被静默丢弃。
受影响代码:
packages/cli/src/ui/views/PromptInput.tsx 的 submitCurrentBuffer()(约 746–766 行):只取 trimmed.split(/\s+/, 1)[0] 做精确匹配,命中内置命令后直接 handleSlashSelection(exactMatch) 并 return,不再调用 onSubmit。
- 同文件
handleSlashSelection() 对 kind === "plan" 的分支(约 692–696 行):只执行 clearSlashToken() + onPlanModeChange(true)。
removeCurrentSlashToken()(约 947 行)只删除光标前的一个 token;在 /plan <文本> 场景下光标在行尾,删不到 /plan,缓冲保持原样。
复现
- 启动 Deep Code(
@vegamo/deepcode-cli v0.3.1)。
- 在主输入框输入:
/plan 重构权限模块,先梳理现状再给出方案
- 按回车。
- 观察:状态切换到 Plan Mode,但消息未发送;输入框仍显示
/plan 重构权限模块,先梳理现状再给出方案。
- 再按回车:仍然不会发送(
/plan 前缀持续命中命令)。只有手动删掉 /plan 前缀后再回车,文本才会发出。
期望
/plan <文本> 应作为一次提交:开启 Plan Mode 并立即把 <文本> 作为消息发送(one-shot),符合用户心智与其他 CLI“命令 + 参数”的惯例。
- 至少保证尾随文本不被静默丢弃。
- 推荐实现:
submitCurrentBuffer 在命中命令但输入还包含剩余文本时,对 plan 提取剩余文本并调用 onSubmit({ text: remainder, imageUrls, selectedSkills, planMode: true }),随后 resetPromptInput()。
原因与建议(点击展开)
现状
submitCurrentBuffer() 用第一个空白分隔 token 匹配命令,剩余文本全部被忽略;该问题对所有内置斜杠命令通用:/new <文本>、/model <文本>、/raw lite 等同样会静默丢弃首 token 之后的文本。
packages/cli/src/ui/core/slash-commands.ts 中只有 /raw 声明了 args,且 args 目前只用于菜单展示(ARGS_SEPARATOR 拼接),提交路径没有解析参数。
/plan 分支固定调用 onPlanModeChange(true),只会开启不会关闭(Shift+Tab 才是切换);本 issue 不要求改变该行为,仅作为上下文。
建议实现
- 在
submitCurrentBuffer 区分两种输入:
- 纯命令(
trimmed 等于命令 token):维持现状,走 handleSlashSelection。
- 命令 + 剩余文本:
plan 走 one-shot(见“期望”);其他无参命令不得静默丢弃文本,至少给出提示或保留缓冲。
- 剩余文本取
trimmed 去掉首 token 后的原文(保留内部空格与换行)。
Shift+Tab 切换 Plan Mode 的行为保持不变。
边界
- 只改变“命令带尾随文本”时的行为;
/plan 单命令回车的行为不变。
- 不改变
onSubmit 与 SessionManager 对 planMode 的既有处理(已支持 plan mode 过渡消息)。
- 图片、已选 skills 等提交字段照常携带。
Co-authored-by: deepseek-v4-pro noreply@deepseek.com
问题
Deep Code v0.3.1 的主输入框中,输入
/plan加一段计划文本后按回车,Deep Code 只会把输入切到 Plan Mode,文本不会被发送。再次按回车仍会命中/plan命令(缓冲仍以/plan开头),因此这段文本必须手动删除/plan前缀后才能发出——用户的输入被静默丢弃。受影响代码:
packages/cli/src/ui/views/PromptInput.tsx的submitCurrentBuffer()(约 746–766 行):只取trimmed.split(/\s+/, 1)[0]做精确匹配,命中内置命令后直接handleSlashSelection(exactMatch)并return,不再调用onSubmit。handleSlashSelection()对kind === "plan"的分支(约 692–696 行):只执行clearSlashToken()+onPlanModeChange(true)。removeCurrentSlashToken()(约 947 行)只删除光标前的一个 token;在/plan <文本>场景下光标在行尾,删不到/plan,缓冲保持原样。复现
@vegamo/deepcode-cliv0.3.1)。/plan 重构权限模块,先梳理现状再给出方案/plan 重构权限模块,先梳理现状再给出方案。/plan前缀持续命中命令)。只有手动删掉/plan前缀后再回车,文本才会发出。期望
/plan <文本>应作为一次提交:开启 Plan Mode 并立即把<文本>作为消息发送(one-shot),符合用户心智与其他 CLI“命令 + 参数”的惯例。submitCurrentBuffer在命中命令但输入还包含剩余文本时,对plan提取剩余文本并调用onSubmit({ text: remainder, imageUrls, selectedSkills, planMode: true }),随后resetPromptInput()。原因与建议(点击展开)
现状
submitCurrentBuffer()用第一个空白分隔 token 匹配命令,剩余文本全部被忽略;该问题对所有内置斜杠命令通用:/new <文本>、/model <文本>、/raw lite等同样会静默丢弃首 token 之后的文本。packages/cli/src/ui/core/slash-commands.ts中只有/raw声明了args,且args目前只用于菜单展示(ARGS_SEPARATOR拼接),提交路径没有解析参数。/plan分支固定调用onPlanModeChange(true),只会开启不会关闭(Shift+Tab才是切换);本 issue 不要求改变该行为,仅作为上下文。建议实现
submitCurrentBuffer区分两种输入:trimmed等于命令 token):维持现状,走handleSlashSelection。plan走 one-shot(见“期望”);其他无参命令不得静默丢弃文本,至少给出提示或保留缓冲。trimmed去掉首 token 后的原文(保留内部空格与换行)。Shift+Tab切换 Plan Mode 的行为保持不变。边界
/plan单命令回车的行为不变。onSubmit与SessionManager对planMode的既有处理(已支持 plan mode 过渡消息)。Co-authored-by: deepseek-v4-pro noreply@deepseek.com