fix: use opencode skills as source of truth
This commit is contained in:
@@ -468,6 +468,7 @@ export const settingsDict = {
|
||||
'settings.skills.sidebar.empty.description': 'Use the + button above to create one',
|
||||
'settings.skills.sidebar.badge.claude': 'claude',
|
||||
'settings.skills.sidebar.badge.agents': 'agents',
|
||||
'settings.skills.sidebar.badge.opencode': 'opencode',
|
||||
'settings.skills.sidebar.toast.skillDeleted': 'Skill "{name}" deleted successfully',
|
||||
'settings.skills.sidebar.toast.deleteSkillFailed': 'Failed to delete skill',
|
||||
'settings.skills.sidebar.toast.duplicateLoadFailed': 'Failed to load skill details for duplication',
|
||||
@@ -537,6 +538,10 @@ export const settingsDict = {
|
||||
'settings.skills.location.option.userOpencode.description': 'Global OpenCode config location',
|
||||
'settings.skills.location.option.projectOpencode.label': 'Project / OpenCode',
|
||||
'settings.skills.location.option.projectOpencode.description': 'Current project .opencode location',
|
||||
'settings.skills.location.option.userClaude.label': 'User / Claude',
|
||||
'settings.skills.location.option.userClaude.description': 'Global Claude skills location',
|
||||
'settings.skills.location.option.projectClaude.label': 'Project / Claude',
|
||||
'settings.skills.location.option.projectClaude.description': 'Current project .claude location',
|
||||
'settings.skills.location.option.userAgents.label': 'User / Agents',
|
||||
'settings.skills.location.option.userAgents.description': 'Global .agents compatibility location',
|
||||
'settings.skills.location.option.projectAgents.label': 'Project / Agents',
|
||||
|
||||
@@ -468,6 +468,7 @@ export const settingsDict = {
|
||||
"settings.skills.sidebar.empty.description": "Usa el botón + arriba para crear una",
|
||||
"settings.skills.sidebar.badge.claude": "claude",
|
||||
"settings.skills.sidebar.badge.agents": "agentes",
|
||||
"settings.skills.sidebar.badge.opencode": "opencode",
|
||||
"settings.skills.sidebar.toast.skillDeleted": "Habilidad \"{name}\" eliminada con éxito",
|
||||
"settings.skills.sidebar.toast.deleteSkillFailed": "No se pudo eliminar la habilidad",
|
||||
"settings.skills.sidebar.toast.duplicateLoadFailed": "No se pudo cargar la información de la habilidad para duplicarla",
|
||||
@@ -537,6 +538,10 @@ export const settingsDict = {
|
||||
"settings.skills.location.option.userOpencode.description": "Ubicación global de la configuración de OpenCode",
|
||||
"settings.skills.location.option.projectOpencode.label": "Proyecto / OpenCode",
|
||||
"settings.skills.location.option.projectOpencode.description": "Ubicación del .opencode del proyecto actual",
|
||||
"settings.skills.location.option.userClaude.label": "Usuario / Claude",
|
||||
"settings.skills.location.option.userClaude.description": "Ubicación global de skills de Claude",
|
||||
"settings.skills.location.option.projectClaude.label": "Proyecto / Claude",
|
||||
"settings.skills.location.option.projectClaude.description": "Ubicación .claude del proyecto actual",
|
||||
"settings.skills.location.option.userAgents.label": "Usuario / Agentes",
|
||||
"settings.skills.location.option.userAgents.description": "Ubicación global de compatibilidad con .agents",
|
||||
"settings.skills.location.option.projectAgents.label": "Proyecto / Agentes",
|
||||
|
||||
@@ -468,6 +468,7 @@ export const settingsDict = {
|
||||
'settings.skills.sidebar.empty.description': '위의 + 버튼으로 새로 생성하세요',
|
||||
'settings.skills.sidebar.badge.claude': 'claude',
|
||||
'settings.skills.sidebar.badge.agents': 'agents',
|
||||
'settings.skills.sidebar.badge.opencode': 'opencode',
|
||||
'settings.skills.sidebar.toast.skillDeleted': '스킬 "{name}"을 삭제했습니다',
|
||||
'settings.skills.sidebar.toast.deleteSkillFailed': '스킬을 삭제하지 못했습니다',
|
||||
'settings.skills.sidebar.toast.duplicateLoadFailed': '복제를 위한 스킬 세부 정보를 로드하지 못했습니다',
|
||||
@@ -537,6 +538,10 @@ export const settingsDict = {
|
||||
'settings.skills.location.option.userOpencode.description': '전역 OpenCode 설정 위치',
|
||||
'settings.skills.location.option.projectOpencode.label': '프로젝트 / OpenCode',
|
||||
'settings.skills.location.option.projectOpencode.description': '현재 프로젝트 .opencode 위치',
|
||||
'settings.skills.location.option.userClaude.label': '사용자 / Claude',
|
||||
'settings.skills.location.option.userClaude.description': '전역 Claude skills 위치',
|
||||
'settings.skills.location.option.projectClaude.label': '프로젝트 / Claude',
|
||||
'settings.skills.location.option.projectClaude.description': '현재 프로젝트 .claude 위치',
|
||||
'settings.skills.location.option.userAgents.label': '사용자 / 에이전트',
|
||||
'settings.skills.location.option.userAgents.description': '전역 .agents 호환 위치',
|
||||
'settings.skills.location.option.projectAgents.label': '프로젝트 / 에이전트',
|
||||
|
||||
@@ -1352,6 +1352,10 @@ export const settingsDict = {
|
||||
'settings.skills.location.option.projectAgents.label': 'Projekt / Agents',
|
||||
'settings.skills.location.option.projectOpencode.description': 'Bieżąca lokalizacja .opencode projektu',
|
||||
'settings.skills.location.option.projectOpencode.label': 'Projekt / OpenCode',
|
||||
'settings.skills.location.option.projectClaude.description': 'Bieżąca lokalizacja .claude projektu',
|
||||
'settings.skills.location.option.projectClaude.label': 'Projekt / Claude',
|
||||
'settings.skills.location.option.userClaude.description': 'Globalna lokalizacja Claude skills',
|
||||
'settings.skills.location.option.userClaude.label': 'Użytkownik / Claude',
|
||||
'settings.skills.location.option.userAgents.description': 'Globalna lokalizacja zgodna z .agents',
|
||||
'settings.skills.location.option.userAgents.label': 'Użytkownik / Agents',
|
||||
'settings.skills.location.option.userOpencode.description': 'Globalna lokalizacja konfiguracji OpenCode',
|
||||
@@ -1412,6 +1416,7 @@ export const settingsDict = {
|
||||
'settings.skills.page.toast.updateSkillFailed': 'Nie udało się zaktualizować umiejętności',
|
||||
'settings.skills.sidebar.badge.agents': 'agents',
|
||||
'settings.skills.sidebar.badge.claude': 'claude',
|
||||
'settings.skills.sidebar.badge.opencode': 'opencode',
|
||||
'settings.skills.sidebar.deleteDialog.description': 'Czy na pewno chcesz usunąć umiejętność „{name}”?',
|
||||
'settings.skills.sidebar.deleteDialog.title': 'Usuń umiejętność',
|
||||
'settings.skills.sidebar.empty.description': 'Użyj przycisku + powyżej, aby utworzyć nową',
|
||||
|
||||
@@ -468,6 +468,7 @@ export const settingsDict = {
|
||||
"settings.skills.sidebar.empty.description": "Use o botão + acima para criar uma",
|
||||
"settings.skills.sidebar.badge.claude": "claude",
|
||||
"settings.skills.sidebar.badge.agents": "agentes",
|
||||
"settings.skills.sidebar.badge.opencode": "opencode",
|
||||
"settings.skills.sidebar.toast.skillDeleted": "Habilidade \"{name}\" excluída com sucesso",
|
||||
"settings.skills.sidebar.toast.deleteSkillFailed": "Não foi possível excluir a habilidade",
|
||||
"settings.skills.sidebar.toast.duplicateLoadFailed": "Não foi possível carregar as informações da habilidade para duplicá-la",
|
||||
@@ -537,6 +538,10 @@ export const settingsDict = {
|
||||
"settings.skills.location.option.userOpencode.description": "Localização global das configurações do OpenCode",
|
||||
"settings.skills.location.option.projectOpencode.label": "Projeto / OpenCode",
|
||||
"settings.skills.location.option.projectOpencode.description": "Localização .opencode do projeto atual",
|
||||
"settings.skills.location.option.userClaude.label": "Usuário / Claude",
|
||||
"settings.skills.location.option.userClaude.description": "Localização global de skills do Claude",
|
||||
"settings.skills.location.option.projectClaude.label": "Projeto / Claude",
|
||||
"settings.skills.location.option.projectClaude.description": "Localização .claude do projeto atual",
|
||||
"settings.skills.location.option.userAgents.label": "Usuário / Agentes",
|
||||
"settings.skills.location.option.userAgents.description": "Localização global compatível com .agents",
|
||||
"settings.skills.location.option.projectAgents.label": "Projeto / Agentes",
|
||||
|
||||
@@ -468,6 +468,7 @@ export const settingsDict = {
|
||||
"settings.skills.sidebar.empty.description": "Скористайтеся кнопкою + вище, щоб створити його",
|
||||
"settings.skills.sidebar.badge.claude": "Claude",
|
||||
"settings.skills.sidebar.badge.agents": "агентів",
|
||||
"settings.skills.sidebar.badge.opencode": "opencode",
|
||||
"settings.skills.sidebar.toast.skillDeleted": "Навичку \"{name}\" успішно видалено",
|
||||
"settings.skills.sidebar.toast.deleteSkillFailed": "Не вдалося видалити навичку",
|
||||
"settings.skills.sidebar.toast.duplicateLoadFailed": "Не вдалося завантажити деталі навичок для дублювання",
|
||||
@@ -537,6 +538,10 @@ export const settingsDict = {
|
||||
"settings.skills.location.option.userOpencode.description": "Розташування глобальної конфігурації OpenCode",
|
||||
"settings.skills.location.option.projectOpencode.label": "Проєкт / OpenCode",
|
||||
"settings.skills.location.option.projectOpencode.description": "Розташування поточного проєкту .opencode",
|
||||
"settings.skills.location.option.userClaude.label": "Користувач / Claude",
|
||||
"settings.skills.location.option.userClaude.description": "Глобальне розташування Claude skills",
|
||||
"settings.skills.location.option.projectClaude.label": "Проєкт / Claude",
|
||||
"settings.skills.location.option.projectClaude.description": "Розташування поточного проєкту .claude",
|
||||
"settings.skills.location.option.userAgents.label": "Користувач / Агенти",
|
||||
"settings.skills.location.option.userAgents.description": "Глобальне розташування сумісності .agents",
|
||||
"settings.skills.location.option.projectAgents.label": "Проєкт / Агенти",
|
||||
|
||||
@@ -468,6 +468,7 @@ export const settingsDict = {
|
||||
'settings.skills.sidebar.empty.description': '使用上方 + 按钮创建一个',
|
||||
'settings.skills.sidebar.badge.claude': 'claude',
|
||||
'settings.skills.sidebar.badge.agents': 'agents',
|
||||
'settings.skills.sidebar.badge.opencode': 'opencode',
|
||||
'settings.skills.sidebar.toast.skillDeleted': '技能“{name}”已删除',
|
||||
'settings.skills.sidebar.toast.deleteSkillFailed': '删除技能失败',
|
||||
'settings.skills.sidebar.toast.duplicateLoadFailed': '加载技能详情以复制失败',
|
||||
@@ -537,6 +538,10 @@ export const settingsDict = {
|
||||
'settings.skills.location.option.userOpencode.description': '全局 OpenCode 配置位置',
|
||||
'settings.skills.location.option.projectOpencode.label': '项目 / OpenCode',
|
||||
'settings.skills.location.option.projectOpencode.description': '当前项目 .opencode 位置',
|
||||
'settings.skills.location.option.userClaude.label': '用户 / Claude',
|
||||
'settings.skills.location.option.userClaude.description': '全局 Claude skills 位置',
|
||||
'settings.skills.location.option.projectClaude.label': '项目 / Claude',
|
||||
'settings.skills.location.option.projectClaude.description': '当前项目 .claude 位置',
|
||||
'settings.skills.location.option.userAgents.label': '用户 / Agents',
|
||||
'settings.skills.location.option.userAgents.description': '全局 .agents 兼容位置',
|
||||
'settings.skills.location.option.projectAgents.label': '项目 / Agents',
|
||||
|
||||
@@ -1323,7 +1323,7 @@ class OpencodeService {
|
||||
}
|
||||
|
||||
// Command Management
|
||||
async listCommands(): Promise<Array<{ name: string; description?: string; agent?: string; model?: string }>> {
|
||||
async listCommands(): Promise<Array<{ name: string; description?: string; agent?: string; model?: string; source?: string }>> {
|
||||
try {
|
||||
const response = await this.client.command.list(
|
||||
this.currentDirectory ? { directory: this.currentDirectory } : undefined
|
||||
@@ -1333,7 +1333,8 @@ class OpencodeService {
|
||||
name: cmd.name as string,
|
||||
description: cmd.description as string | undefined,
|
||||
agent: cmd.agent as string | undefined,
|
||||
model: cmd.model as string | undefined
|
||||
model: cmd.model as string | undefined,
|
||||
source: cmd.source as string | undefined,
|
||||
// Intentionally excluding template to keep memory usage low
|
||||
}));
|
||||
} catch {
|
||||
@@ -1341,7 +1342,7 @@ class OpencodeService {
|
||||
}
|
||||
}
|
||||
|
||||
async listCommandsWithDetails(): Promise<Array<{ name: string; description?: string; agent?: string; model?: string; template?: string }>> {
|
||||
async listCommandsWithDetails(): Promise<Array<{ name: string; description?: string; agent?: string; model?: string; source?: string; template?: string }>> {
|
||||
try {
|
||||
const response = await this.client.command.list(
|
||||
this.currentDirectory ? { directory: this.currentDirectory } : undefined
|
||||
@@ -1352,6 +1353,7 @@ class OpencodeService {
|
||||
description: cmd.description as string | undefined,
|
||||
agent: cmd.agent as string | undefined,
|
||||
model: cmd.model as string | undefined,
|
||||
source: cmd.source as string | undefined,
|
||||
template: cmd.template as string | undefined,
|
||||
}));
|
||||
} catch {
|
||||
@@ -1359,6 +1361,34 @@ class OpencodeService {
|
||||
}
|
||||
}
|
||||
|
||||
async listSkillsWithDetails(): Promise<Array<{ name: string; description?: string; location: string; content?: string }>> {
|
||||
try {
|
||||
const response = await this.client.app.skills(
|
||||
this.currentDirectory ? { directory: this.currentDirectory } : undefined,
|
||||
);
|
||||
const data = response.data;
|
||||
if (!Array.isArray(data)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const skills: Array<{ name: string; description?: string; location: string; content?: string }> = [];
|
||||
for (const item of data as Array<Record<string, unknown>>) {
|
||||
const name = typeof item.name === 'string' ? item.name.trim() : '';
|
||||
const location = typeof item.location === 'string' ? item.location : '';
|
||||
if (!name || !location || location === '<built-in>') {
|
||||
continue;
|
||||
}
|
||||
const skill: { name: string; description?: string; location: string; content?: string } = { name, location };
|
||||
if (typeof item.description === 'string') skill.description = item.description;
|
||||
if (typeof item.content === 'string') skill.content = item.content;
|
||||
skills.push(skill);
|
||||
}
|
||||
return skills;
|
||||
} catch {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
async getCommandDetails(name: string): Promise<{ name: string; template: string; description?: string; agent?: string; model?: string } | null> {
|
||||
try {
|
||||
const response = await this.client.command.list(
|
||||
|
||||
Reference in New Issue
Block a user