fix installed skills discovery and improve editor UX (#1296)

* fix skills discovery from opencode

* Fix stale skill description after frontmatter removal

* fix: align vscode skill discovery parity
This commit is contained in:
jkker
2026-05-23 20:58:12 +03:00
committed by GitHub
parent fd01a0ba62
commit 1663185a75
13 changed files with 635 additions and 65 deletions
+14 -4
View File
@@ -16,6 +16,7 @@ import {
AGENT_SCOPE,
COMMAND_SCOPE,
discoverSkills,
mergeDiscoveredSkills,
getSkillSources,
createSkill,
updateSkill,
@@ -93,6 +94,15 @@ const parseSkillsCatalogSources = (settings: Record<string, unknown>): SkillsCat
.filter((value): value is SkillsCatalogSourceConfig => value !== null);
};
const resolveDiscoveredSkills = async (
deps: ConfigRuntimeDeps,
ctx: BridgeContext | undefined,
workingDirectory?: string,
): Promise<DiscoveredSkill[]> => mergeDiscoveredSkills(
(await deps.fetchOpenCodeSkillsFromApi(ctx, workingDirectory)) || [],
discoverSkills(workingDirectory),
);
export async function handleConfigBridgeMessage(
message: BridgeMessageInput,
ctx: BridgeContext | undefined,
@@ -458,7 +468,7 @@ export async function handleConfigBridgeMessage(
const normalizedMethod = typeof method === 'string' && method.trim() ? method.trim().toUpperCase() : 'GET';
if (!name && normalizedMethod === 'GET') {
const skills = (await deps.fetchOpenCodeSkillsFromApi(ctx, workingDirectory)) || discoverSkills(workingDirectory);
const skills = await resolveDiscoveredSkills(deps, ctx, workingDirectory);
return { id, type, success: true, data: { skills } };
}
@@ -468,7 +478,7 @@ export async function handleConfigBridgeMessage(
}
if (normalizedMethod === 'GET') {
const discoveredSkill = ((await deps.fetchOpenCodeSkillsFromApi(ctx, workingDirectory)) || [])
const discoveredSkill = (await resolveDiscoveredSkills(deps, ctx, workingDirectory))
.find((skill) => skill.name === skillName);
const sources = getSkillSources(skillName, workingDirectory, discoveredSkill || null);
return {
@@ -539,7 +549,7 @@ export async function handleConfigBridgeMessage(
const workingDirectory = ctx?.manager?.getWorkingDirectory() || vscode.workspace.workspaceFolders?.[0]?.uri.fsPath;
const settings = deps.readSettings(ctx);
const additionalSources = parseSkillsCatalogSources(settings);
const installedSkills = (await deps.fetchOpenCodeSkillsFromApi(ctx, workingDirectory)) || undefined;
const installedSkills = await resolveDiscoveredSkills(deps, ctx, workingDirectory);
const data = await getSkillsCatalog(workingDirectory, refresh, additionalSources, installedSkills);
return { id, type, success: true, data };
}
@@ -623,7 +633,7 @@ export async function handleConfigBridgeMessage(
return { id, type, success: false, error: 'File path is required' };
}
const discoveredSkill = ((await deps.fetchOpenCodeSkillsFromApi(ctx, workingDirectory)) || [])
const discoveredSkill = (await resolveDiscoveredSkills(deps, ctx, workingDirectory))
.find((skill) => skill.name === skillName);
const sources = getSkillSources(skillName, workingDirectory, discoveredSkill || null);
if (!sources.md.dir) {