MemoryLake
返回全部文章
Tutorial2026 年 9 月 8 日·12 分钟阅读

如何合并您的 Windsurf 和 Devin 规则文件夹,确保正确的规则生效(2026 指南)

本周您团队中的某个人添加了一条规则,它被保存在 .devin/rules 中。而过去八个月里一直规范该行为的规则却存放在 .windsurf/rules 中。这两个文件夹都会被读取。其中一个会生效。如果不去查阅资料,团队中没人能告诉您哪一个会胜出。

这不是 bug,也不是要求您运行的迁移。这就是向后兼容性在内部的表现形式:Devin Desktop 读取新路径,同时继续读取旧路径,因此没有任何东西损坏,而规则层悄然变成了两个规则层,它们之间存在着大多数团队从未了解过的优先级关系。

在我们开始之前,先明确一个界限。如果您的疑问是关于 Cascade 自动生成的记忆,而不是您的规则文件,那是另一项工作——将 Devin 仅限 Cascade 的记忆移至技能 涵盖了记忆方面和迁移向导。如果您还没有迁移到 Devin Desktop,从 Windsurf 迁移到 Devin Desktop 是更早的步骤。如果症状仅仅是 Windsurf 总是遗忘您的项目规则,下面介绍的文件夹拆分是一个常见原因。本指南专门针对重命名后的规则文件夹。

为什么两个规则文件夹最终会产生冲突

一旦您找到文档,其中记录的优先级就非常清晰了。Devin Desktop 的规则发现章节直接指出:

"Devin Desktop 自动从多个位置发现规则,以提供灵活的组织方式。.devin/ 目录是首选位置并具有优先级,而 .windsurf/ 则作为向后兼容的备用方案保留。"

这只有一句话,却解答了标题中的核心问题。问题在于它周围的一切。

发现规则并不止于一个文件夹。它涵盖了“当前工作区及其子目录中的所有 .devin/rules(以及遗留的 .windsurf/rules)目录”,对于 git 仓库,它“还会向上搜索至 git 根目录,以查找父目录中的规则”。当同时打开多个文件夹时,“规则会被去重,并以最短的相对路径显示”。

在工作区范围内,还有第三个文件,大多数团队已经完全遗忘了它:

"工作区根目录下的遗留单文件 .windsurfrules 仍会被读取。"

在工作区之上,还有一个拥有自己规则的全局文件:~/.codeium/windsurf/memories/global_rules.md,被描述为“单文件,应用于所有工作区。始终开启。限制为 6,000 个字符。”工作区规则文件有它们自己的上限——每个 12,000 个字符。

然后是 AGENTS.md,它根本不是一个独立的系统。它的文档明确阐述了这种关系:

"当您创建 AGENTS.md 文件(或 agents.md)时,Devin Desktop 会自动发现它,并将其输入到驱动 .devin/rules/(以及遗留的 .windsurf/rules/)的同一个规则引擎中——只是激活模式是根据文件的位置推断出来的,而不是通过 frontmatter 声明。"

根目录级别意味着“始终开启”。子目录意味着“一个通配符 (glob)规则,其自动生成的模式为 <directory>/**”。

对于企业,还有一个系统层,由 IT 部门部署且对用户只读,它具有相同的新旧组合:macOS 上的 /Library/Application Support/Devin/rules/(以 Windsurf 作为遗留备用),Linux 上的 /etc/devin/rules/(以 /etc/windsurf/rules/ 作为备用),以及 Windows 上的等效组合。系统规则“与工作区和全局规则合并,为 Cascade 提供额外的上下文,而不会覆盖用户定义的规则”。

盘点一下这些层面:.devin/rules.windsurf/rules.windsurfrules、任意数量的 AGENTS.md 文件、global_rules.md 以及两个系统目录。每一个都是生效的。其中两对之所以存在,仅仅是因为发生了重命名,且不允许破坏任何现有功能。

还有一个细节使得规则很容易发生偏差。新规则并不会保存在您以为的地方:

"当您创建新规则时,它将保存在当前工作区的 .devin/rules 目录中,而不一定在 git 根目录下。"

因此,在单体仓库(monorepo)中,当您恰好在某个包(package)内创建规则时,该规则会保存在该包中,而不是在最顶层。

人们尝试的其他方法

立即删除遗留文件夹。 这很诱人,但通常为时过早。旧文件夹仍会被读取,这意味着任何仍在使用旧客户端的人,或者任何尚未拉取代码的队友,都可能依赖它。请在确认内容已在新位置中体现之后再删除它,而不是在此之前。

假设最新的文件会生效。 事实并非如此。优先级是按位置决定的,而不是按修改时间。您今天早上在 .windsurf/rules 中编写的规则,会输给 .devin/rules 中一条过时的规则。

将所有内容放入 global_rules.md 以避免文件夹问题。 这用一个问题换来了一个更糟糕的问题。全局文件始终开启,适用于每个工作区,且上限为 6,000 个字符。对于特定项目的规范来说,它是错误的容器,并且它将是第一个达到上限的东西。

假设 AGENTS.md 不受此争议影响。 它并非如此。它通过相同的规则引擎运行,并且根目录级别的 AGENTS.md 是始终开启的——因此它会与您的始终开启的规则文件竞争相同的上下文预算,其激活方式是根据其所在位置推断出来的,而不是声明出来的。

将自动生成的记忆视为持久层。 文档对此异乎寻常地直接,这值得引用,因为这是厂商在告诉您他们自己的功能是干什么用的:

"对于您希望 Cascade 可靠地重复使用的知识,请将其编写为规则或添加到仓库中的 AGENTS.md 中,而不是依赖自动生成的记忆。规则是版本控制的、可与团队共享的,并且能让您对激活进行显式控制。"

自动生成的记忆也是本地的:它们保存在 ~/.codeium/windsurf/memories/ 下,并且“在一个工作区中生成的记忆在另一个工作区中不可用,而且它们不会提交到您的仓库中”。如果导致您来到这里的原因是会话之间丢失上下文,为什么 Cascade 会丢失上下文 直接涵盖了这一方面。

解决方案:统一到 .devin/rules 并使每次激活都显式化

三个步骤。按顺序执行——盘点是确保第二步安全进行的前提。

步骤 1:在移动任何内容之前盘点每个层面

遍历所有七个层面,并记录每个层面中的内容。具体包括:工作区中以及向上至 git 根目录的父目录中的每个 .devin/rules 目录,相同位置的每个 .windsurf/rules 目录,工作区根目录下的 .windsurfrules 文件(如果存在),任何级别的每个 AGENTS.mdagents.mdglobal_rules.md,以及——如果您的组织部署了它们——系统目录(包括当前的和遗留的)。

每条规则需要记录两件事:它的激活模式以及其他地方是否已经存在等效规则。激活模式很重要,因为它是通过 trigger 字段在 frontmatter 中声明的,这四个值的使用成本差异很大。文档详细说明了这种权衡:always_on 会在每条消息的系统提示词中放入完整规则;model_decision 仅在提示词中放入 description(描述),并在 Cascade 判定该描述相关时读取完整文件;glob 在 Cascade 读取或编辑匹配该模式的文件时应用规则;manual 则将其完全排除在提示词之外,直到您输入 @rule-name

在盘点时请注意两个例外:“全局规则文件(global_rules.md)和根目录级别的 AGENTS.md 文件不使用 frontmatter——它们始终开启。”这两个文件无法限制范围。其中的任何内容都会出现在每条消息中。

步骤 2:将每条规则移动到 .devin/rules 并手动解决冲突

将每个遗留规则复制到它实际所属级别的 .devin/rules 目录中——对于大多数规范来说,这应该是 git 根目录,而不是您创建它时恰好所处的某个包。

如果您在两个文件夹中发现了相同的规则,请在选择其中一个之前阅读这两个版本。这是规则偏差变得显而易见的步骤,而且它通常不是一个干净的重复:遗留版本可能包含新版本丢失的细节,或者新版本包含遗留版本从未获得的修正。请谨慎合并,然后删除遗留副本。

.windsurfrules 需要单独做决定。它是一个没有 frontmatter 的单文件,因此其中的所有内容都表现为一个无差别的整体。在移动它时,请将其拆分为具有声明触发器的单个规则文件——这正是新格式的全部优势所在。

对于 AGENTS.md 文件,决定每一个是否真的适合作为“始终开启”的内容。根目录级别的 AGENTS.md 无法限制范围,因此其中任何仅适用于部分目录树的内容,都应该变成子目录中的 AGENTS.md(该目录会自动获取通配符)或具有显式 glob 触发器的规则文件。

⚠️ 在修改这些文件时,请注意一个跨工具警告。Devin Desktop 对名称比较宽容——“不区分大小写:AGENTS.mdagents.md 都能被识别。”其他工具则不然。Kilo Code 的文档明确指出:“文件名必须是大写(AGENTS.md),不能是小写(agents.md)。”如果您的仓库与使用其他智能体的成员共享,请使用大写。这在这里不需要任何成本,却决定了文件是被读取还是在其他地方被默默忽略。当规则在不同厂商之间迁移时,也会出现同类的不匹配问题——将 Cursor 规则移至 Windsurf 涵盖了 frontmatter 方面的内容。

步骤 3:为所有可以拥有激活模式的内容声明激活模式

统一之后,检查 .devin/rules,确保每个文件的 trigger 都是深思熟虑的选择,而不是默认值。

真正的检验是针对每条规则问一个问题:这是否需要出现在每条消息的提示词中?大多数规则不需要。关于测试文件的规范是一个 glob 规则。发布操作手册是 manual。对数据模型的冗长解释是 model_decision,其中只有其描述始终存在,而主体内容按需读取。

这一步可以收回七个重叠层面悄然上下文预算,并且只有在消除重复之后才有可能实现——当同一条规则存在三次时,您无法合理评估激活成本。

在 MemoryLake 中进行设置

统一解决了文件夹的问题。但它并没有解决您无法快速解决冲突的原因:当同一条规则以两种不同的表述存在于两个地方时,没有任何东西记录哪个版本是当前的,或者它们之间发生了什么变化。

MemoryLake 将该记录完全保存在规则层之外,并通过 MCP 或 API 提供给任何请求它的智能体。您的 .devin/rules 文件保留在原处,并继续完全按照文档工作;而这里保存了规则引擎从未被设计用来存储的部分——每条规则的用途、它替换了什么以及何时替换。

步骤 1:创建 API 密钥

生成密钥并在大约三十秒内发出您的第一次请求。在统一的步骤 2 之前执行此操作,以便在解决冲突时捕获决策。

创建 MemoryLake API 密钥,使每条规则背后的推理存在于 .devin/rules 和 .windsurf/rules 之外
创建 MemoryLake API 密钥,使每条规则背后的推理存在于 .devin/rules 和 .windsurf/rules 之外

步骤 2:上传您的第一批记忆

在合并每个重复对时,记录您保留了什么、丢弃了什么以及原因。添加源自特定事件的规则——这些规则的措辞没人敢改动,因为没人记得原因。文档和其他文件也放在同一个地方。

将分散在七个 Devin Desktop 规则层面上的决策上传到 MemoryLake
将分散在七个 Devin Desktop 规则层面上的决策上传到 MemoryLake

步骤 3:连接您的 AI 和智能体

让 Claude、Codex、OpenClaw 以及您的 Devin Desktop 会话能够通过 MCP 或 API 进行访问。连接后,规则背后的推理可以按需检索,这使得规则文件本身能够保持足够简短,从而合理使用 always_on 触发器。

通过 MCP 和 API 将 Devin Desktop、Cascade 和其他智能体连接到 MemoryLake
通过 MCP 和 API 将 Devin Desktop、Cascade 和其他智能体连接到 MemoryLake

这在实践中改变了什么

最直接的变化是,“哪条规则实际上在生效”可以在一个地方得到解答。一个文件夹,每条规则一个文件,每个文件都有声明的激活模式。

第二个变化是上下文预算。七个重叠的层面,加上未知数量的始终开启的文件,意味着大量的提示词被浪费在仅适用于一小部分工作的指导上。去重然后声明触发器是降低这一消耗的唯一方法,而且它通常能回收比人们预期更多的空间。

第三个变化是下一次重命名将变得索然无味。这种情况还会发生——厂商合并、产品重命名、路径移动,而对厂商来说,负责任的做法是继续读取旧路径。如果您的规则已经统一,且您的推理存在于文件夹之外,那么下一次路径更改只是一个复制操作,而不是另一个考古项目。

单一规则层面的最佳实践

统一到 .devin/rules,因为这是文档中记录的首选位置,也是具有优先级的路径。 不要与优先级顺序对抗;移动到胜出的一方。

将项目范围的规则放在 git 根目录下。 新规则保存在当前工作区目录中,“不一定在 git 根目录下”,这就是单体仓库最终导致规范被埋在某个包内部的原因。

拆分 .windsurfrules,而不是整体移植。 单个无差别的文件无法表达激活模式,而这正是新格式带给您的主要好处。

使用大写的 AGENTS.md Devin Desktop 接受任一种大小写;共享仓库中的其他智能体可能需要大写。

仅将 global_rules.md 用于真正的个人、跨项目偏好。 它始终开启,适用于所有地方,且上限为 6,000 个字符。

仅在验证内容已移动后删除遗留副本。 旧路径仍会被读取,这意味着半途而废的统一比任何一种极端情况都更糟糕。

不要将自动生成的记忆作为您团队的记录。 文档建议使用规则或 AGENTS.md 来存储持久、可共享的知识,并指出自动生成的记忆是工作区本地的且不会被提交。对于该拆分的后半部分——什么内容属于智能体查询的存储库,而不是规则文件——适用于 Windsurf 用户的记忆工具 涵盖了这些选择。

结论

Devin Desktop 读取七个规则层面,其中两对之所以存在,仅仅是因为发生了重命名并保留了向后兼容性。.devin/ 的优先级高于 .windsurf/,两者都会被读取,在此之上 .windsurfrules 仍会被读取,并且 AGENTS.md 文件会将内容输入到同一个引擎中,其激活方式根据位置推断。

这一切都没有损坏。但所有这些都极易导致规则偏差,尤其是因为新规则会保存到您恰好所处的工作区目录中。

盘点所有七个层面,在合适的级别统一到 .devin/rules,拆分遗留的单文件,为所有可以拥有激活模式的内容声明激活模式,并将每条规则背后的推理保存在规则引擎不拥有的地方。这样,对于“哪一个会胜出”的回答就很简单了:只有一个。

常见问题

哪个文件夹实际上具有优先级,.devin/rules 还是 .windsurf/rules

.devin/rules。文档指出,.devin/ 是首选位置并具有优先级,而 .windsurf/ 则作为向后兼容的备用方案保留。两者都会被发现和读取,因此遗留文件夹不会被忽略——只是在两者发生冲突时它会失效。

.windsurfrules 仍受支持吗?

是的。工作区范围文档指出,“工作区根目录下的遗留单文件 .windsurfrules 仍会被读取。”因为它是没有 frontmatter 的单文件,其中的所有内容都表现为一个没有激活控制的整体,这也是将其拆分为单个规则文件的主要原因。

在将所有内容复制过去后,我可以删除 .windsurf/rules 吗?

验证之后,可以。过早删除的风险在于,对于尚未拉取代码或仍在使用旧客户端的队友来说,遗留路径仍然有效,因此不完全的统一可能会导致人们使用不同的有效规则集。请先确认每条规则的内容都存在于 .devin/rules 中,然后再进行删除。

AGENTS.md 文件会与我的规则文件冲突吗?

它们与其说是冲突,不如说是竞争相同的预算。AGENTS.md 被输入到同一个规则引擎中,其激活方式根据位置推断:根目录级别是始终开启的,而子目录会获得自动生成的通配符 <directory>/**。因此,一个冗长的根目录级别 AGENTS.md 的行为就像一个大型的始终开启的规则,应该以同样的纪律来对待。

我应该围绕哪些字符限制进行规划?

全局规则文件限制为 6,000 个字符,工作区规则文件每个限制为 12,000 个字符。这些是文档中记录的上限。达到这些上限通常是一个信号,表明始终开启的内容应该移动到 model_decisionglob 触发器,而不是去设法绕过限制。

系统级企业规则会覆盖我团队编写的内容吗?

不会。文档将系统级规则描述为“与工作区和全局规则合并,为 Cascade 提供额外的上下文,而不会覆盖用户定义的规则。”它们由 IT 部门部署且对最终用户只读,并且它们具有与工作区文件夹相同的新旧目录对,因此值得将其纳入盘点。