用途
本技能用于给已安装的最新版 pi 打一个临时补丁,解决「Windows Terminal / WSL 下 fullscreen 模式右键粘贴失效」的问题。属于显式触发型技能,需手动执行。
背景(根因)
pi 的 fullscreen(alt-screen)TUI 会开启鼠标捕获(SGR mouse ?1000h ?1002h ?1006h)。鼠标捕获开启时,Windows Terminal 把右键事件转发给应用、自身不再粘贴,因此 fullscreen 下的右键粘贴由 pi 自己实现。但 pi-tui 的 TuiAltScreen.handleRightClickPaste() 存在 process.platform !== "win32" 硬门禁:
- 原生 Windows(pwsh7):platform=win32 → 门禁通过 → 粘贴正常。
- WSL:platform=linux → 门禁拦截 → 右键事件被 pi 吞掉却无人处理 → 死点击。
- regular 模式:不捕获鼠标 → Windows Terminal 自行粘贴 → 两个环境都正常。
上游(earendil-works/pi,issue #10345 同根因)尚未修复,npm 1.1.0 仍有该门禁。本技能为临时方案,pi 一更新就会被覆盖,需要重跑。
修复方式
删除 process.platform !== "win32" 门禁,保留 TERM_PROGRAM === "vscode" 例外:
// 旧
if (!this.onRightClickPaste ||
process.platform !== "win32" || ...
// 新(删门禁版)
if (!this.onRightClickPaste ||
process.env.TERM_PROGRAM?.toLowerCase() === "vscode" || ...
删门禁安全且彻底的原因:handleRightClickPaste 是被动触发,只有终端把右键事件转发给应用时 pi 才收得到。终端分三类:转发右键但不自己粘(Windows Terminal、WezTerm、VTE/GNOME Terminal、kitty 默认)→ pi 粘贴(正确);不转发右键(macOS Terminal.app)→ 事件到不了 pi,无副作用;转发且自己粘 → 唯一双粘贴风险,目前实证只有 VS Code 集成终端(issue #8186),已有 TERM_PROGRAM=vscode 例外兜底。白名单方案(按 WT_SESSION/TERM_PROGRAM=wezterm 识别)救不了 SSH 远程场景,已弃用;早期打过的 WT_SESSION 版补丁会被本脚本自动收敛到删门禁版。
使用方式
bash <skill 目录>/patch.sh
patch.sh 用 BASH_SOURCE[0] 定位自身所在目录(即技能目录),不依赖 cwd;本机分发后的技能目录通常是 ~/.agents/skills/pi-rightclick-paste-patch/,仓库内为 skills/self/pi-rightclick-paste-patch/。
脚本只处理 mise 安装的最新版本(三点版本目录,排除 latest/1.x 等别名),对两个位置打补丁:
dist/bundle/chunks/chunk-*.js(用户实际运行的入口,bundle 内联 pi-tui 代码)@earendil-works/pi-tui/dist/tui-alt-screen.js(非 bundle 运行路径,缺失则跳过)
幂等行为:目标文件已含补丁标记(handleRightClickPaste 后直接是 process.env.TERM_PROGRAM 检查,即删门禁形态)则跳过;含旧 win32 门禁或早前 WT_SESSION 版补丁则收敛到删门禁版;片段匹配不到则告警并继续处理其余目标(由验证节判定失败)。
完成判据
- 脚本输出最新版本号与
already patched (skip)或patched; - 验证节输出
ok: bundle chunks clean of the old gate,无 FAIL; - 重启 pi 后在 WT 的 WSL fullscreen 模式右键,能粘贴剪贴板内容(需手动确认)。
回归驱动器:/tmp/pi-clip-probe/rightclick-loop.mjs(fake terminal + SGR 右键事件,断言非 vscode 终端收到右键即触发)。
恢复与注意事项
补丁前的原始文件备份在 backups/ 目录,命名 <basename>.orig(如 chunk-OTL6MGLJ.js.orig、tui-alt-screen.js.orig);只保留第一份 pristine 副本、不覆盖。需要时可还原,但还原后需重跑本脚本重新打补丁。
mise upgrade 后补丁丢失属预期,重跑本技能即可;脚本会按最新版本重新定位(chunk 文件名是内容哈希,更新后可能变化,脚本用内容匹配定位,不写死文件名)。上游修好后(issue #10345 或新 PR 合并、npm 发版)本技能应停用。
适用场景与限制
适用于在 Windows Terminal 或 WSL 环境中使用 pi fullscreen 模式、遭遇右键粘贴失效的用户。属于临时补丁方案,随 pi 更新失效,需重复执行;不具备长期维护性,上游修复后应停用。