Cline插件中clinerules的选择机制
Cline插件中clinerules的选择机制
规则选择的核心逻辑
Cline通过一个多层次的规则选择系统来决定使用哪些rules,主要基于以下几个关键机制:
1. 规则层级优先级
Cline按照以下优先级顺序加载规则:
- 全局规则 (
~/Documents/Cline/Rules/Hooks/) - 项目规则 (
.clinerules/目录) - 外部规则 (Cursor、Windsurf等兼容规则)
2. 规则开关机制 (Toggles)
每个规则文件都有一个对应的开关状态,存储在VSCode的全局状态中:
// 规则开关数据结构
type ClineRulesToggles = Record<string, boolean> // filepath -> enabled/disabled
关键选择逻辑 (getRuleFilesTotalContent 函数):
if (ruleFilePath in toggles && toggles[ruleFilePath] === false) {return null // 跳过被禁用的规则文件
}
3. 规则同步流程
每次API请求前,Cline都会执行以下步骤:
步骤1: 刷新规则开关 (refreshClineRulesToggles)
- 扫描规则目录中的所有文件
- 自动为新文件创建开关(默认启用)
- 清理不存在的文件的开关
- 更新状态管理器中的开关状态
步骤2: 读取规则内容
- 遍历所有规则文件路径
- 检查每个文件的开关状态
- 只读取启用状态为
true的文件 - 将内容格式化为系统提示词
步骤3: 集成到系统提示词
通过 buildUserInstructions 函数将所有启用的规则内容合并:
if (globalClineRulesFileInstructions) {customInstructions.push(globalClineRulesFileInstructions)
}
if (localClineRulesFileInstructions) {customInstructions.push(localClineRulesFileInstructions)
}
4. 具体选择算法
对于目录规则:
- 读取目录中的所有文件
- 为每个文件路径创建开关(如果不存在)
- 检查开关状态,只处理启用状态为
true的文件 - 读取文件内容并格式化
对于文件规则:
- 检查单个文件的开关状态
- 如果启用,读取文件内容
- 如果禁用,跳过该文件
5. 用户控制机制
用户可以通过以下方式控制规则选择:
启用/禁用特定规则:
- 通过UI界面切换单个规则文件的开关
- 开关状态持久化到VSCode全局状态
规则文件管理:
- 自动检测新增/删除的规则文件
- 支持
.clinerules目录和单个文件格式 - 自动转换旧格式到新格式
6. 实际使用场景示例
假设有以下规则结构:
~/Documents/Cline/Rules/Hooks/
├── company-guidelines.md (启用)
└── security-rules.md (禁用)project/.clinerules/
├── typescript-rules.md (启用)
└── react-rules.md (启用)
Cline将选择使用:
company-guidelines.md(全局启用)typescript-rules.md(项目启用)react-rules.md(项目启用)
而跳过:
security-rules.md(全局禁用)
7. 性能优化
- 懒加载: 只在API请求前刷新规则
- 缓存: 规则开关状态缓存到VSCode状态
- 增量更新: 只处理变化的规则文件
- 并行处理: 同时处理全局和项目规则
总结
Cline的规则选择机制是一个智能的、基于开关的多层次系统:
- 自动发现所有可用的规则文件
- 用户控制通过开关选择启用哪些规则
- 优先级排序全局规则优先于项目规则
- 实时更新每次请求前重新评估规则状态
- 性能优化避免不必要的文件读取
这种设计既保证了灵活性(用户可以精确控制使用的规则),又确保了性能(只加载必要的规则内容)。
