fix: apply scope filter to getSystemMcpServerNames and fix async native skill description refresh
This commit is contained in:
@@ -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")
|
||||
})
|
||||
})
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user