From e4a5973b16f00d19620e243bae8c81aff797fe89 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Thu, 26 Mar 2026 12:15:47 +0900 Subject: [PATCH] fix(agents): include .agents skills in agent awareness Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- .../agent-config-handler.test.ts | 54 +++++++++++++++++++ src/plugin-handlers/agent-config-handler.ts | 10 ++++ 2 files changed, 64 insertions(+) diff --git a/src/plugin-handlers/agent-config-handler.test.ts b/src/plugin-handlers/agent-config-handler.test.ts index bacc3fa24..6cb7514ed 100644 --- a/src/plugin-handlers/agent-config-handler.test.ts +++ b/src/plugin-handlers/agent-config-handler.test.ts @@ -8,6 +8,7 @@ import * as sisyphusJunior from "../agents/sisyphus-junior" import type { OhMyOpenCodeConfig } from "../config" import * as agentLoader from "../features/claude-code-agent-loader" import * as skillLoader from "../features/opencode-skill-loader" +import type { LoadedSkill } from "../features/opencode-skill-loader" import { getAgentDisplayName } from "../shared/agent-display-names" import { applyAgentConfig } from "./agent-config-handler" import type { PluginComponents } from "./plugin-components-loader" @@ -51,6 +52,8 @@ describe("applyAgentConfig builtin override protection", () => { let discoverProjectClaudeSkillsSpy: ReturnType let discoverOpencodeGlobalSkillsSpy: ReturnType let discoverOpencodeProjectSkillsSpy: ReturnType + let discoverProjectAgentsSkillsSpy: ReturnType + let discoverGlobalAgentsSkillsSpy: ReturnType let loadUserAgentsSpy: ReturnType let loadProjectAgentsSpy: ReturnType let migrateAgentConfigSpy: ReturnType @@ -121,6 +124,14 @@ describe("applyAgentConfig builtin override protection", () => { skillLoader, "discoverOpencodeProjectSkills", ).mockResolvedValue([]) + discoverProjectAgentsSkillsSpy = spyOn( + skillLoader, + "discoverProjectAgentsSkills", + ).mockResolvedValue([]) + discoverGlobalAgentsSkillsSpy = spyOn( + skillLoader, + "discoverGlobalAgentsSkills", + ).mockResolvedValue([]) loadUserAgentsSpy = spyOn(agentLoader, "loadUserAgents").mockReturnValue({}) loadProjectAgentsSpy = spyOn(agentLoader, "loadProjectAgents").mockReturnValue({}) @@ -139,6 +150,8 @@ describe("applyAgentConfig builtin override protection", () => { discoverProjectClaudeSkillsSpy.mockRestore() discoverOpencodeGlobalSkillsSpy.mockRestore() discoverOpencodeProjectSkillsSpy.mockRestore() + discoverProjectAgentsSkillsSpy.mockRestore() + discoverGlobalAgentsSkillsSpy.mockRestore() loadUserAgentsSpy.mockRestore() loadProjectAgentsSpy.mockRestore() migrateAgentConfigSpy.mockRestore() @@ -279,4 +292,45 @@ describe("applyAgentConfig builtin override protection", () => { // then expect(createSisyphusJuniorAgentSpy).toHaveBeenCalledWith(undefined, "openai/gpt-5.4", false) }) + + test("includes project and global .agents skills in builtin agent awareness", async () => { + // given + const projectAgentsSkill = { + name: "project-agent-skill", + definition: { + name: "project-agent-skill", + description: "Project agent skill", + template: "template", + }, + scope: "project", + } satisfies LoadedSkill + const globalAgentsSkill = { + name: "global-agent-skill", + definition: { + name: "global-agent-skill", + description: "Global agent skill", + template: "template", + }, + scope: "user", + } satisfies LoadedSkill + discoverProjectAgentsSkillsSpy.mockResolvedValue([projectAgentsSkill]) + discoverGlobalAgentsSkillsSpy.mockResolvedValue([globalAgentsSkill]) + + // when + await applyAgentConfig({ + config: createBaseConfig(), + pluginConfig: createPluginConfig(), + ctx: { directory: "/tmp" }, + pluginComponents: createPluginComponents(), + }) + + // then + const discoveredSkills = createBuiltinAgentsSpy.mock.calls[0]?.[6] + expect(discoveredSkills).toEqual( + expect.arrayContaining([ + expect.objectContaining({ name: "project-agent-skill" }), + expect.objectContaining({ name: "global-agent-skill" }), + ]), + ) + }) }) diff --git a/src/plugin-handlers/agent-config-handler.ts b/src/plugin-handlers/agent-config-handler.ts index 33f15f233..539fa6bb0 100644 --- a/src/plugin-handlers/agent-config-handler.ts +++ b/src/plugin-handlers/agent-config-handler.ts @@ -6,8 +6,10 @@ import { AGENT_NAME_MAP } from "../shared/migration"; import { getAgentDisplayName } from "../shared/agent-display-names"; import { discoverConfigSourceSkills, + discoverGlobalAgentsSkills, discoverOpencodeGlobalSkills, discoverOpencodeProjectSkills, + discoverProjectAgentsSkills, discoverProjectClaudeSkills, discoverUserClaudeSkills, } from "../features/opencode-skill-loader"; @@ -52,8 +54,10 @@ export async function applyAgentConfig(params: { discoveredConfigSourceSkills, discoveredUserSkills, discoveredProjectSkills, + discoveredProjectAgentsSkills, discoveredOpencodeGlobalSkills, discoveredOpencodeProjectSkills, + discoveredGlobalAgentsSkills, ] = await Promise.all([ discoverConfigSourceSkills({ config: params.pluginConfig.skills, @@ -63,16 +67,22 @@ export async function applyAgentConfig(params: { includeClaudeSkillsForAwareness ? discoverProjectClaudeSkills(params.ctx.directory) : Promise.resolve([]), + includeClaudeSkillsForAwareness + ? discoverProjectAgentsSkills(params.ctx.directory) + : Promise.resolve([]), discoverOpencodeGlobalSkills(), discoverOpencodeProjectSkills(params.ctx.directory), + includeClaudeSkillsForAwareness ? discoverGlobalAgentsSkills() : Promise.resolve([]), ]); const allDiscoveredSkills = [ ...discoveredConfigSourceSkills, ...discoveredOpencodeProjectSkills, ...discoveredProjectSkills, + ...discoveredProjectAgentsSkills, ...discoveredOpencodeGlobalSkills, ...discoveredUserSkills, + ...discoveredGlobalAgentsSkills, ]; const browserProvider =