Skip to content

fix(skills): 转义内置技能提示中的字面标签 - #640

Open
LucasIcarus wants to merge 3 commits into
deepcoldy:masterfrom
LucasIcarus:ci/initial_prompt_check
Open

fix(skills): 转义内置技能提示中的字面标签#640
LucasIcarus wants to merge 3 commits into
deepcoldy:masterfrom
LucasIcarus:ci/initial_prompt_check

Conversation

@LucasIcarus

@LucasIcarus LucasIcarus commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

背景

<botmux_builtin_skills> 的原始设计是与 <botmux_routing> 并列的独立提示块:

这里的引用本意都是普通文字,但渲染时直接拼接了 <botmux_routing><name><cmd> / <子命令>。模型最终看到的内容因此像是 <botmux_builtin_skills> 内又打开了若干未闭合子标签,偏离了原本“外层标签负责分区、内层是目录/帮助正文”的设计。

最小复现

由修复前的 opening prompt 缩成关键几行:

<botmux_builtin_skills>
<botmux_routing> 只覆盖基础通信用法。...
再用 `botmux skill show <name>` 读取完整说明...
</botmux_builtin_skills>

如果按 XML-like 标签阅读,顺序就是:打开 botmux_builtin_skills → 又打开 botmux_routing → 又打开 name → 直接关闭 botmux_builtin_skills。后两个标签从未闭合,父标签还先于子标签关闭;off 模式中的 <cmd> / <子命令> 也有同样问题。

修复后,同一段正文变为纯文本引用:

<botmux_builtin_skills>
&lt;botmux_routing&gt; 只覆盖基础通信用法。...
再用 `botmux skill show &lt;name&gt;` 读取完整说明...
</botmux_builtin_skills>

这样只有 <botmux_builtin_skills> 是结构标签,内部的标签名和命令占位符都明确是文字。

与现有 hidden-context 转义的关系

#564 加入“以下 XML/配置块是隐藏运行上下文……”时,是把 &lt;...&gt; 直接手写在中英文文案里,并没有经过统一的转义函数。它的输出是对的,但和本修复若各自维护,就会形成“手写实体 + 运行时转义”两套机制。

本 PR 因此把 prompt 块正文的 XML 文本转义收口到同一个 escapeXmlText:hidden-context 源码恢复为可读的原始 <...>,在渲染时与 builtin-skills 一样统一转义,并显式测试不会二次编码成 &amp;lt;

改动

  • 新增共享的 src/utils/xml.ts#escapeXmlText,统一 prompt XML-like 块正文的 &<> 转义;
  • <botmux_builtin_skills> 的目录正文和 off 帮助提示通过该函数渲染;
  • hidden-context 文案从手写实体改为“原始可读文案 + 同一函数渲染”;
  • 在 shared helper、hidden-context 与 builtin-skills renderer 旁写明局部 invariant:helper 只接收原始文本;只有外层 wrapper 是结构,内部目录/帮助与动态描述都是正文;
  • 保留外层结构标签和原有提示语义,不改变技能发现、注入模式或命令;
  • 补充中英文 prompt/off、未来技能描述中的字面标签/&、转义顺序与防二次编码回归测试。

影响面

  • 受影响:skillInjection=prompt/off 的中英文提示;包括 Codex、Gemini、OpenCode 等首轮内联路径,以及 Genius/Grok 的 system-prompt 路径;hidden-context 的最终输出保持不变。
  • 不受影响:global 模式、原生 session skill 通道、<identity> / <role> 与 profile 渲染、用户注册技能块、平台路径/进程逻辑、PTY/Tmux 后端及 IM 路由。
  • 共享范围刻意限定为 prompt 块正文;plist、飞书卡片、HTML 等其它渲染器还涉及属性引号或各自格式语义,不在这个修复中顺带迁移。
  • opening prompt 是 XML-like envelope,并非整体严格 XML;因此用局部 invariant 注释与行为测试防回归,不引入会误报用户/role/profile 原始内容的全局 XML-valid spec。
  • 这是提示文本序列化修复;没有改变现有运行时行为。

验证

  • pnpm exec vitest run --project unit test/xml.test.ts test/prompt-builder.test.ts test/skill-injection-mode.test.ts test/session-skill-injection.test.ts test/pi-initial-prompt.test.ts test/initial-user-turn-opening.test.ts test/cli-adapters.test.ts:7 文件、415 项通过
  • 注释落地后再次运行 pnpm exec vitest run --project unit test/xml.test.ts test/prompt-builder.test.ts test/skill-injection-mode.test.ts:3 文件、82 项通过
  • pnpm test:719 文件通过、3 文件按环境跳过;11026 项通过、35 项跳过
  • pnpm build:通过(含 domain audit、TypeScript、dashboard bundle、dist audit)
  • git diff --check:通过

按本次协作要求未执行 pnpm switch:here,也未重启 live daemon。

@LucasIcarus
LucasIcarus marked this pull request as ready for review July 28, 2026 13:05
@LucasIcarus
LucasIcarus requested a review from deepcoldy as a code owner July 28, 2026 13:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant