Skip to content

[Bug] /plan 后跟文本回车时仅切换 Plan Mode,文本被静默丢弃 #328

Description

@cmp0xff

问题

Deep Code v0.3.1 的主输入框中,输入 /plan 加一段计划文本后按回车,Deep Code 只会把输入切到 Plan Mode,文本不会被发送。再次按回车仍会命中 /plan 命令(缓冲仍以 /plan 开头),因此这段文本必须手动删除 /plan 前缀后才能发出——用户的输入被静默丢弃。

受影响代码:

  • packages/cli/src/ui/views/PromptInput.tsxsubmitCurrentBuffer()(约 746–766 行):只取 trimmed.split(/\s+/, 1)[0] 做精确匹配,命中内置命令后直接 handleSlashSelection(exactMatch)return,不再调用 onSubmit
  • 同文件 handleSlashSelection()kind === "plan" 的分支(约 692–696 行):只执行 clearSlashToken() + onPlanModeChange(true)
  • removeCurrentSlashToken()(约 947 行)只删除光标前的一个 token;在 /plan <文本> 场景下光标在行尾,删不到 /plan,缓冲保持原样。

复现

  1. 启动 Deep Code(@vegamo/deepcode-cli v0.3.1)。
  2. 在主输入框输入:/plan 重构权限模块,先梳理现状再给出方案
  3. 按回车。
  4. 观察:状态切换到 Plan Mode,但消息未发送;输入框仍显示 /plan 重构权限模块,先梳理现状再给出方案
  5. 再按回车:仍然不会发送(/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 单命令回车的行为不变。
  • 不改变 onSubmitSessionManagerplanMode 的既有处理(已支持 plan mode 过渡消息)。
  • 图片、已选 skills 等提交字段照常携带。

Co-authored-by: deepseek-v4-pro noreply@deepseek.com

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions