1. 先说结论
OMP 现在有两层控制面:
-
disabledProviders- 直接禁整个 provider
- 是更上游、更硬的总开关
- 被禁的 provider 连
load()都不会跑
-
disabledExtensions- 禁单个条目
- 不是固定枚举,而是 capability 定义出来的 extension ID
- 适合精确屏蔽某个 skill / MCP server / hook / slash command
一句话概括:
- 想整族砍掉兼容来源,用
disabledProviders - 想只砍某个具体条目,用
disabledExtensions
另外,OMP 对不同 capability 的控制粒度并不统一:
skills粒度相对最细MCP只有部分细粒度控制context files/hooks/custom tools基本还是粗粒度commands看起来想做来源级开关,但当前实现接线不完整
2. disabledProviders:整族禁用
2.1 它到底怎么生效
provider 过滤发生在:
packages/coding-agent/src/capability/index.ts
关键逻辑是:先把 disabledProviders 里的 provider ID 过滤掉,再进入 loadCapability() 后续流程。也就是说,被禁的 provider 不只是“结果不显示”,而是不会去扫描对应目录、不会去读对应配置文件、不会去产出任何 capability 条目。
这也是为什么:
- 禁
claude - 禁
claude-plugins - 禁
codex
之后,相关的 MCP、skills、context files、hooks、tools、commands 会一起消失。
2.2 当前可用的 provider ID
当前代码里注册过的 provider ID 有这些:
native对应 OMP 自己的.ompclaudeclaude-pluginscodexgeminiopencodecursorclinewindsurfvscodegithubagents-mdagentsmcp-jsonssh-json
来源:
packages/coding-agent/src/discovery/*.ts里的const PROVIDER_ID = "..."
2.3 例子
disabledProviders:
- claude
- claude-plugins
- codex
- gemini
- opencode
- cursor
- cline
- windsurf
- vscode
- github
这会直接砍掉这些 provider 提供的全部能力。
所以像:
geminiopencode
如果你的目标是“OMP 完全不要碰它们的兼容配置”,就直接放进 disabledProviders,不需要额外 patch。
3. disabledExtensions:单条目禁用
3.1 它不是固定枚举
disabledExtensions 不是预定义常量表,而是 capability 自己定义的条目 ID。
来源:
packages/coding-agent/src/capability/*.ts里的toExtensionId
当前明确支持这些形状:
skill:<name>mcp:<server-name>tool:<name>slash-command:<name>hook:<pre|post>:<tool|*>:<name>context-file:<user|project>:<basename>prompt:<name>rule:<name>instruction:<name>extension-module:<name>
对应代码例如:
skill.ts→skill:${skill.name}mcp.ts→mcp:${server.name}tool.ts→tool:${tool.name}slash-command.ts→slash-command:${cmd.name}hook.ts→hook:${hook.type}:${hook.tool}:${hook.name}context-file.ts→context-file:${file.level}:${path.basename(file.path)}
3.2 例子
disabledExtensions:
- skill:semantic-compression
- mcp:context7
- slash-command:ctx-insight
- tool:my-custom-tool
- hook:pre:bash:guard-dangerous-command
- context-file:user:CLAUDE.md
3.3 这个机制的边界
disabledExtensions 是条目级,不是来源级。
也就是说你可以禁:
mcp:context7skill:semantic-compression
但不能直接表达这种语义:
- “只禁
geminiprovider 提供的全部 MCP” - “只禁
opencodeprovider 提供的全部 skills”
这种需求当前更接近 provider 级控制,而不是 item 级控制。
4. 现在各 capability 的控制粒度到底有多粗
4.1 Skills:相对最细,但还是后置过滤
skills 现在已经有来源级开关:
skills.enableCodexUserskills.enableClaudeUserskills.enableClaudeProjectskills.enablePiUserskills.enablePiProject
相关文件:
packages/coding-agent/src/config/settings-schema.tspackages/coding-agent/src/extensibility/skills.ts
但它的实现方式不是 provider 前置禁用,而是:
- 先
loadCapability(skillCapability.id, ...) - 把各 provider 的 skill 都跑出来
- 再按 source 做过滤
所以它的粒度虽然细,但架构上仍然是先扫、后筛。
4.2 MCP:只有部分细粒度控制
upstream 当前 MCP 相关设置主要是:
mcp.enableProjectConfigmcp.discoveryModemcp.discoveryDefaultServersmcp.notificationsmcp.notificationDebounceMs
相关文件:
packages/coding-agent/src/config/settings-schema.tspackages/coding-agent/src/mcp/config.tspackages/coding-agent/src/sdk.ts
也就是说,upstream 目前没有对齐 skills 那种 mcp.enableClaudeUser / mcp.enableCodexUser 的来源级开关。
当前 upstream 能做的是:
- 控制 project root 的
mcp.json/.mcp.json - 控制 MCP discovery mode
- provider 全禁
- item 单禁
但不能原生表达:
- 只禁 Claude user MCP
- 只禁 Codex user MCP
- 同时保留这两个 provider 的其它能力
所以如果目标是:
- 保留
.claude/skills/CLAUDE.md - 但不读
~/.claude/~/.codex的 MCP
这块 upstream 粒度还是不够。
4.3 Context files:没有专门分类开关
context files 没有看到类似:
contextFiles.enableClaudeUsercontextFiles.enableCodexUser
相关定义:
packages/coding-agent/src/capability/context-file.ts
所以当前只能靠:
disabledProvidersdisabledExtensions
其中 disabledExtensions 的形状是:
context-file:<user|project>:<basename>
注意这里粒度也不算特别细,因为它是按:
- level
- basename
来区分,不带更深层的路径语义。
4.4 Commands:schema 里有开关,但当前看起来没接好线
schema 里定义了:
commands.enableClaudeUsercommands.enableClaudeProject
位置:
packages/coding-agent/src/config/settings-schema.ts
但当前在 packages/coding-agent/src 里,基本只看到它们出现在 schema 定义里,没有看到明确的 runtime 读取路径。
所以对 commands 更准确的说法是:
- 设计意图上想做来源级开关
- 但当前实现看起来没有真正接通
单个 command 仍然可以靠 disabledExtensions 禁:
slash-command:<name>
4.5 Hooks:没有专门来源开关
hooks 当前没有看到类似:
hooks.enableClaudeUserhooks.enableCodexUser
相关定义:
packages/coding-agent/src/capability/hook.ts
当前能做的是:
- provider 级:
disabledProviders - item 级:
disabledExtensions
单个 hook 的 ID 形状是:
hook:<pre|post>:<tool|*>:<name>
4.6 Tools:内置工具很细,外部 custom tools 很粗
这里要分两类。
A. 内置工具
内置工具已经有很多专门开关,例如:
todo.enabledfind.enabledgrep.enabledastGrep.enabledastEdit.enablednotebook.enableddebug.enabledgithub.enabledweb_search.enabledbrowser.enabledcheckpoint.enabled
这些都在:
packages/coding-agent/src/config/settings-schema.ts
所以内置工具这一层,OMP 粒度其实不算差。
B. 外部 / custom tools
但对 provider 带进来的外部 tool,当前没有看到:
tools.enableClaudeUsertools.enableCodexUsertools.enableGeminiUser
相关定义:
packages/coding-agent/src/capability/tool.ts
所以 custom tools 仍然主要靠:
disabledProvidersdisabledExtensions
单个 tool 的 ID 形状是:
tool:<name>
5. 这套设计的真实特点
OMP 现在不是“所有 capability 都有统一来源级控制”的设计。
更准确地说,它是一个粒度不对称的系统:
skills已经走到 capability 内部来源级控制MCP只做了一部分context files/hooks/custom tools还主要停留在 provider 级或 item 级commands则处于“schema 看起来有、runtime 看起来没完全接通”的状态
所以当前最稳定的经验法则是:
- 想切整族来源,用
disabledProviders - 想切单个具体对象,用
disabledExtensions - 想做“只禁某 provider 的某 capability、但保留同 provider 的其它 capability”
skills部分支持MCP只支持很有限的子集- 其它 capability 基本还不够细
6. 实用写法
6.1 整族兼容层直接砍掉
disabledProviders:
- claude
- claude-plugins
- codex
- gemini
- opencode
- cursor
- cline
- windsurf
- vscode
- github
6.2 只禁单个条目
disabledExtensions:
- skill:semantic-compression
- mcp:context7
- slash-command:ctx-insight
- tool:my-custom-tool
- hook:pre:bash:guard-dangerous-command
- context-file:user:CLAUDE.md
6.3 什么时候该优先用哪一个
- 我根本不想让 OMP 读这个生态的兼容配置
- 用
disabledProviders
- 用
- 我只讨厌其中一个条目,别的保留
- 用
disabledExtensions
- 用
- 我想只关某 provider 的 MCP,但保留同 provider 的 skills / context / hooks
- 当前 upstream 原生支持不完整,不能假设一定做得到