跨环境的约定收敛
尽管厂商配置格式与执行面各不相同,Apothem 如何让一套操作者工作流在十七个环境中保持一致。
十七个环境,对配置存放在哪里、采用何种形态有十七种各自的主张。Apothem 的任务, 是让操作者的工作流在所有环境中感觉完全一致——你只编写一次约定,无论是使用 Claude Code、Cursor 还是 Gemini CLI,它们的行为都相同。本文介绍 Apothem 所 调和的两类分歧:配置格式与执行面。
格式分歧
每个环境从不同的文件形态读取规则。Apothem 的配置档案以一种中立的单一形式持有 操作者的意图;每个适配器再把这份意图渲染成其环境所期望的形态。
| 形态 | 环境(示例) | Apothem 输出的内容 |
|---|---|---|
目录中的扁平 .md 规则文件 | claude-code、windsurf、trae | 原样复制到环境规则树中的规则文件 |
Cursor .mdc 规则 | cursor | 一套携带 Cursor 所期望的元数据头部的 .mdc 规则 |
| 单文件指令文档 | codex、gemini-cli、github-copilot、zed | 一份拼接而成的文档——AGENTS.md、GEMINI.md、copilot-instructions.md、.rules——由配置档案的规则集组装而来 |
扁平 .md 环境逐字接收规则。.mdc 环境需要在每条规则外包裹 Cursor 元数据头部。
单文件环境需要把整个规则集压平进一份文档,并保持稳定的段落顺序,使操作者无论
目标为何,都以相同的顺序读到相同的约定。中立的配置档案是唯一的事实来源;分歧
完全存在于每个适配器的渲染步骤中。
段落顺序是收敛的锚点
把许多规则压平进一份文档,存在在不同环境间被打乱顺序的风险,于是同样的约定在
AGENTS.md 中的落位顺序会与在 GEMINI.md 中不同。Apothem 在配置档案层面固定
顺序:规则集有一个声明好的序列,每个单文件适配器都按该顺序遍历它。在一个环境中
记住「命名约定排在提交约定之前」的操作者,会在其他每个环境中找到相同的序列。
收敛不是渲染的偶然产物——它是配置档案钉定的一项属性。
执行分歧
配置格式是可见的那一半。更难的那一半是执行:在操作者(或代理工具)行动的那一刻, 一项约定如何被追究落实。
原生的 PreToolUse 钩子
claude-code、codex 和 qwen-code 暴露了原生钩子面。PreToolUse 钩子会在工具调用 执行之前触发,对其进行检查,并阻止或改写它。这是实时执行:一条「禁止把规划产物 写入全局位置」的规则,会变成一个在写入触及磁盘之前就将其拒绝的钩子。Apothem 直接把这些钩子物化进环境的钩子配置中,于是约定由环境运行时来执行。
其他环境基于包装的纪律
其余环境并未暴露 Apothem 可掌控的等效预执行钩子面。在环境不提供任何接口的地方, Apothem 无法安装运行时闸门。取而代之的是,约定以指令文本的形式承载在物化后的 配置中——工具读取规则并受其约束,但没有任何运行时机制拦截违规动作。Apothem 明确地揭示这种差别,而非假装存在对等:钩子支撑的约定与指令支撑的约定并不是同一种 保证,操作者能看清哪些环境在运行时执行、哪些依赖指令纪律。
收敛在实践中意味着什么
操作者编写一条约定。Apothem 把它渲染成十七种格式,并为其附加每个环境所支持的 最强执行——存在该面时用原生钩子,不存在时用指令文本。工作流收敛了;保证则按 环境如实陈述。
这正是为什么 apothem verify 在所有环境中都很重要:在没有运行时钩子能捕获漂移的
地方,操作者运行 verify 来检测已偏离配置档案的环境配置。verify 命令是每个缺乏
原生执行能力的环境的收敛兜底。