fix: apply scope filter to getSystemMcpServerNames and fix async native skill description refresh

This commit is contained in:
YeonGyu-Kim
2026-03-31 17:05:55 -07:00
parent 9f2c4500e8
commit 8fba90766d
4 changed files with 126 additions and 9 deletions
@@ -0,0 +1,69 @@
/// <reference types="bun-types" />
import { describe, expect, it } from "bun:test"
import { createSkillTool } from "./tools"
import type { LoadedSkill } from "../../features/opencode-skill-loader/types"
function createMockSkill(name: string): LoadedSkill {
return {
name,
path: `/test/skills/${name}/SKILL.md`,
resolvedPath: `/test/skills/${name}`,
definition: {
name,
description: `Test skill ${name}`,
template: `Test skill template for ${name}`,
},
scope: "opencode-project",
}
}
async function waitForRefresh(predicate: () => boolean): Promise<void> {
for (let attempt = 0; attempt < 20; attempt += 1) {
if (predicate()) {
return
}
await new Promise<void>((resolve) => setTimeout(resolve, 0))
}
}
describe("skill tool - async native skill description refresh", () => {
it("updates description after async native skills resolve", async () => {
//#given
let allCallCount = 0
const tool = createSkillTool({
skills: [createMockSkill("seeded-skill")],
commands: [],
nativeSkills: {
async all() {
allCallCount += 1
return [{
name: "async-native-skill",
description: "Async native skill from plugin input",
location: "/external/skills/async-native-skill/SKILL.md",
content: "Async native skill body",
}]
},
async get() {
return undefined
},
async dirs() {
return []
},
},
})
expect(tool.description).toContain("seeded-skill")
expect(tool.description).not.toContain("async-native-skill")
//#when
await waitForRefresh(() => allCallCount === 2)
//#then
expect(allCallCount).toBe(2)
expect(tool.description).toContain("seeded-skill")
expect(tool.description).toContain("async-native-skill")
})
})
+3 -3
View File
@@ -265,8 +265,8 @@ export function createSkillTool(options: SkillLoadOptions = {}): ToolDefinition
})
}
const buildDescription = async (): Promise<string> => {
if (cachedDescription) return cachedDescription
const buildDescription = async (force = false): Promise<string> => {
if (!force && cachedDescription) return cachedDescription
const skills = await getSkills()
const commands = getCommands()
const skillInfos = skills.map(loadedSkillToInfo)
@@ -294,7 +294,7 @@ export function createSkillTool(options: SkillLoadOptions = {}): ToolDefinition
cachedDescription = formatCombinedDescription(skillInfos, commandsForDescription)
if (needsAsyncRefresh) {
void buildDescription()
void buildDescription(true)
}
} else if (options.commands !== undefined) {
cachedDescription = formatCombinedDescription([], options.commands)