fix(skill-context): filter dev-browser as provider-gated

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
YeonGyu-Kim
2026-04-27 17:17:19 +09:00
parent 0d3eed17a5
commit f1d4eb7846
2 changed files with 65 additions and 1 deletions
+64
View File
@@ -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<string>())
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()
}
})
})
+1 -1
View File
@@ -26,7 +26,7 @@ export type SkillContext = {
disabledSkills: Set<string>
}
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"