Repository navigation
fix(terminal): Tab 交还 shell——cd 不再被隐藏参数抢占,多候选不默认填第一项 - #249
Merged
jinpy666 merged 1 commit intoOct 27, 2026
Merged
Conversation
2 of 10 tasks
Evvvvvvvan
force-pushed
the
codex/ssh/terminal-input-completion-fix
branch
from
October 27, 2026 10:21
a3754ae to
ec00643
Compare
P1 cd 的 hidden 特殊参数不再进入候选;多候选 Tab 只推进公共前缀, 显式选择(方向键/指针激活)才接受,接受前核对行/会话/信任门。 P2 generator 缓存命中后按本次 tokenEnd 重建候选与 edit(m→ma 不再 maina)。 P3 thenable source 与同步路径共用后续流程,异步请求也调度动态槽位。 P4 ssh completion 在独立 exec 通道内按绝对 POSIX 路径切目录,失败短路。 P6 Ctrl+W 保留词前分隔空白(对齐 bash),Tab/编辑键让行模型进入不可信态。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Agent handoff
implementationb19eefb(main)跟进
计划里六项输入/补全缺陷中的五项。P1/P2/P3/P6 是本地可复现的确定性缺陷,P4 是前后端源码确认的语义缺口。
改动
figCompletionSource.buildItems()跳过参数 suggestions 里的hidden: true。cd语料里就这两个 hidden 特殊参数(-/~),占满菜单后 Tab 会把\u0015cd -写进输入行,原生路径补全永远到不了 shell。现在cd解析为空 → 菜单不开 → Tab 原样到达 shell;目录生成器仍是 Fig custom 回调形态,collectGenerators照旧不产槽位,不擅自执行回调。useCommandSuggestions.ts新增显式选择锁(按候选 id)、菜单归属快照(行/会话)与接受门(输入模型可信、无命令运行或传输占用)。Tab 顺序固定为:明确选择 → 唯一候选 → 公共前缀 → 消费但不改输入(不再默认填第一项)。↑↓与模板activate统一走activateCompletion(),默认高亮第 0 项不再等于选中;App.vue只改@activate接线与解构。generatorScheduler.run()的缓存条目是「一次执行的全量产出」,edit 范围停在首次调用的tokenEnd。命中后改为按本次 slot 的tokenStart/tokenEnd生成独立候选与 edit 副本,缓存对象不被改写。git checkout m→ma接受main不再得到maina;cursorOffset语义未动。CompletionController.dispatch()的 thenable 分支此前直接deliver就返回。现在与同步路径共用新的deliverOutcome();resolve 前先校验 requestId/revision/sessionId/enabled——过期请求既不进 UI 也不启动远端查询;reject 仍降级 pass-through 且不产生动态执行副作用。completion/ssh.rs+security.rs。非空 cwd 必须是绝对 POSIX 路径,在该次独立 exec 内cd '<cwd>' 2>/dev/null && <原命令>(&&短路、只抑制 cd 自身 stderr),不向交互式 PTY 注入cd;~/相对路径/盘符报completion: cwd must be an absolute POSIX path。docs/PROTOCOL.zh-CN.md对应段落同步。applyLineEditControlChar()的 Ctrl+W 改为「删行尾空白 + 最后一个词、保留词前分隔空白」;wordEditingLineUntrusted()扩到 Tab、Ctrl+W/A/E/R、CSI/SS3 方向键/Home/End/历史序列以及被拆包的 ESC 前缀。App.vue复用既有接线,无 diff。测试:新增
useCommandSuggestions.spec.ts——驱动真实 fig 语料与真实键盘处理器,断言的是最终写入终端的字节与行缓冲,而不是候选数组;另外给 fig 语料、scheduler、controller、行模型补齐回归用例。验证
pnpm --dir frontend exec vitest run src/lib/completion src/components/CompletionMenu.spec.ts src/lib/terminalInputQueue.spec.ts src/lib/terminalLineModel.spec.ts src/lib/terminalWordEditing.spec.ts src/lib/ghostAcceptKey.spec.ts src/lib/suggestionGuard.spec.ts src/composables/useCommandSuggestions.spec.ts:301 passedpnpm --dir frontend test:202 文件 / 2181 用例全过pnpm --dir frontend typecheck:通过python3 scripts/validate_repo.py、python3 scripts/check_vendor_lockstep.py:PASSpython3 scripts/smoke_terminal_word_editing.py(本机 Bash PTY 对照):10 项 PASS,含 5 个新增 Ctrl+W 场景(abc def→abc、abc def→abc、abc→空、纯空白→空、'a b'→'a)风险与未验证
rustup官方源与 rsproxy 镜像下载都失败,cargo fmt --check/clippy/test均未执行,T4 的两个纯函数测试已写好但未编译。其 shell 语义另用本机sh手工对照过(cd '<path>' 2>/dev/null && cmd成功时执行、目录不存在时短路且不吐错误文本)。合入前请务必让 CI 或本地补跑 backend 检查。pnpm --dir frontend build:会生成ui/,按仓库约定属集成者产物。