From f1d4eb7846d1d25309cfd88ce21f40e9d9ea7c16 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Mon, 27 Apr 2026 17:17:19 +0900 Subject: [PATCH] fix(skill-context): filter dev-browser as provider-gated Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- src/plugin/skill-context.test.ts | 64 ++++++++++++++++++++++++++++++++ src/plugin/skill-context.ts | 2 +- 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/src/plugin/skill-context.test.ts b/src/plugin/skill-context.test.ts index 4c80b2b61..75397fb0b 100644 --- a/src/plugin/skill-context.test.ts +++ b/src/plugin/skill-context.test.ts @@ -85,4 +85,68 @@ describe("createSkillContext", () => { getSystemMcpServerNamesSpy.mockRestore() } }) + + it("excludes discovered dev-browser skill when browser provider is playwright", async () => { + // given + const discoveredDevBrowserSkill = { + name: "dev-browser", + definition: { description: "Discovered dev-browser skill" }, + scope: "user" as const, + } + + const discoverConfigSourceSkillsSpy = spyOn( + skillLoader, + "discoverConfigSourceSkills", + ).mockResolvedValue([]) + const discoverUserClaudeSkillsSpy = spyOn( + skillLoader, + "discoverUserClaudeSkills", + ).mockResolvedValue([discoveredDevBrowserSkill]) + const discoverProjectClaudeSkillsSpy = spyOn( + skillLoader, + "discoverProjectClaudeSkills", + ).mockResolvedValue([]) + const discoverOpencodeGlobalSkillsSpy = spyOn( + skillLoader, + "discoverOpencodeGlobalSkills", + ).mockResolvedValue([]) + const discoverProjectAgentsSkillsSpy = spyOn( + skillLoader, + "discoverProjectAgentsSkills", + ).mockResolvedValue([]) + const discoverGlobalAgentsSkillsSpy = spyOn( + skillLoader, + "discoverGlobalAgentsSkills", + ).mockResolvedValue([]) + const getSystemMcpServerNamesSpy = spyOn( + mcpLoader, + "getSystemMcpServerNames", + ).mockReturnValue(new Set()) + + const pluginConfig = OhMyOpenCodeConfigSchema.parse({ + browser_automation_engine: { provider: "playwright" }, + }) + + try { + // when + const result = await createSkillContext({ + directory: testDirectory, + pluginConfig, + }) + + // then + expect(result.browserProvider).toBe("playwright") + expect(result.mergedSkills.some((skill) => skill.name === "playwright")).toBe(true) + expect(result.mergedSkills.some((skill) => skill.name === "dev-browser")).toBe(false) + expect(result.availableSkills.some((skill) => skill.name === "dev-browser")).toBe(false) + } finally { + discoverConfigSourceSkillsSpy.mockRestore() + discoverUserClaudeSkillsSpy.mockRestore() + discoverProjectClaudeSkillsSpy.mockRestore() + discoverOpencodeGlobalSkillsSpy.mockRestore() + discoverProjectAgentsSkillsSpy.mockRestore() + discoverGlobalAgentsSkillsSpy.mockRestore() + getSystemMcpServerNamesSpy.mockRestore() + } + }) }) diff --git a/src/plugin/skill-context.ts b/src/plugin/skill-context.ts index 05a72d688..6af00117a 100644 --- a/src/plugin/skill-context.ts +++ b/src/plugin/skill-context.ts @@ -26,7 +26,7 @@ export type SkillContext = { disabledSkills: Set } -const PROVIDER_GATED_SKILL_NAMES = new Set(["agent-browser", "playwright"]) +const PROVIDER_GATED_SKILL_NAMES = new Set(["agent-browser", "dev-browser", "playwright"]) function mapScopeToLocation(scope: SkillScope): AvailableSkill["location"] { if (scope === "user" || scope === "opencode") return "user"