Markdown 定点修改怎么避免误伤?Texio 用结构化操作守住 AI Agent 的文件边界
AI Agent 修改 README、变更日志或项目规范时,最危险的动作往往不是写错一句话,而是为了改一个小节,重写了整份 Markdown。正则表达式可能命中相似文本,整文件重写则会制造无关 diff。Texio 是一个 MIT 许可的早期预览 CLI,专门把 Markdown 编辑缩小为“按文档结构定位、预览、原子写入”三个步骤。
它解决的不是“搜索”,而是“选对修改范围”
Texio 的定位很明确:grep 负责找文本,sed 负责改文本,而 Texio 理解 Markdown 的标题层级。它可以列出标题、提取指定 section,并在标题缺失或重复时直接报错,而不是猜一个目标继续写入。
这对 AI Agent 尤其重要。Agent 只需要修改 Installation,就不应该重新生成整个 README;当仓库中有多个相同标题时,工具也应该停下来交给人判断,而不是悄悄改错位置。
安装与第一次检查
项目提供 crates.io 安装方式,命令名是 texio:
cargo install texio-cli --locked texio --version
先创建一个最小文档,再查看结构:
printf '# Demo\n\n## Installation\nold command\n\n## Usage\nkeep this\n' > demo.md texio headings demo.md --json texio section demo.md Installation
headings 返回标题层级,section 则提取目标小节。把这一步放进 Agent 的编辑流程,可以先确认文件结构,再决定后续操作,而不是凭上下文猜测标题。
先预览,再写入
Texio 的核心命令是 replace。下面的操作只替换 Installation 小节,并先用 --dry-run 查看结果:
texio replace demo.md \ --section Installation \ --text 'cargo install texio-cli --locked' \ --dry-run
确认 diff 没有超出目标范围后,再显式使用 --write:
texio replace demo.md \ --section Installation \ --text 'cargo install texio-cli --locked' \ --write
这种“两阶段提交”很适合接入 Agent。模型负责提出文本,脚本负责预览和检查;只有人类或上层自动化策略确认后,才允许落盘。工具还会保留目标文件权限,并以原子方式完成替换,降低写入中断留下半截文件的风险。
为什么不直接用正则表达式
正则适合简单文本替换,却不天然理解 Markdown 的结构。比如同一个安装命令可能同时出现在正文、代码块和历史记录中;全文替换很容易改到错误位置。Texio 当前使用 pulldown-cmark 解析 Markdown,支持 ATX 与 Setext 标题,并忽略围栏代码块中的“标题样式”文本。
不过它仍是早期预览,CommonMark 和 GitHub Flavored Markdown 的兼容工作还在进行。生产环境中,建议把它用于结构稳定、标题明确的文档,并把 --dry-run 输出纳入代码审查,而不是把它当成任意 Markdown 的万能重写器。
一个适合 Agent 的安全工作流
可以把一次文档修改拆成四个门:
- 用
texio headings README.md --json获取结构。 - 检查目标标题是否唯一,不唯一就停止。
- 用
replace --dry-run生成最小 diff。 - 通过审核后才加
--write,随后用git diff --check和测试确认。
项目仓库还提供 Agent instructions、技能文件和公开 benchmark。基准数据针对四个固定 fixture:Texio 使用 45 个 context-proxy token,整文件基线为 261 个,报告为减少 82.8%。这不是模型 tokenizer 或账单 token 测量,不能直接当作成本承诺;它更适合说明“定点编辑比整文件重写更小”的方向。
结语
Texio 的价值不在于增加一个更复杂的 Markdown 编辑器,而在于给 AI Agent 划出清晰的文件边界:先理解标题结构,再预览最小变更,最后显式写入。对于 README 自动维护、版本变更记录和 Agent 生成的项目文档,这种保守的编辑语义通常比“尽快重写成功”更值得信任。