From 3e5ec7c173b28829bbf6ff06dfc1ecf7d52896ef Mon Sep 17 00:00:00 2001 From: 777genius Date: Thu, 16 Apr 2026 23:03:55 +0300 Subject: [PATCH] fix(extensions): preserve skill project context in dialogs --- .../extensions/skills/SkillDetailDialog.tsx | 20 +- .../extensions/skills/SkillEditorDialog.tsx | 23 +- .../extensions/skills/SkillImportDialog.tsx | 5 +- .../extensions/skills/skillProjectUtils.ts | 13 + .../skills/SkillDetailDialog.test.ts | 280 ++++++++++++++++++ .../skills/skillProjectUtils.test.ts | 19 ++ 6 files changed, 350 insertions(+), 10 deletions(-) create mode 100644 src/renderer/components/extensions/skills/skillProjectUtils.ts create mode 100644 test/renderer/components/extensions/skills/SkillDetailDialog.test.ts create mode 100644 test/renderer/components/extensions/skills/skillProjectUtils.test.ts diff --git a/src/renderer/components/extensions/skills/SkillDetailDialog.tsx b/src/renderer/components/extensions/skills/SkillDetailDialog.tsx index d70238d6..2b57a9ca 100644 --- a/src/renderer/components/extensions/skills/SkillDetailDialog.tsx +++ b/src/renderer/components/extensions/skills/SkillDetailDialog.tsx @@ -26,6 +26,8 @@ import { useStore } from '@renderer/store'; import { AlertTriangle, ExternalLink, FolderOpen, Pencil, Trash2 } from 'lucide-react'; import { useShallow } from 'zustand/react/shallow'; +import { resolveSkillProjectPath } from './skillProjectUtils'; + interface SkillDetailDialogProps { skillId: string | null; open: boolean; @@ -58,8 +60,13 @@ export const SkillDetailDialog = ({ useEffect(() => { if (!open || !skillId) return; - void fetchSkillDetail(skillId, projectPath ?? undefined).catch(() => undefined); - }, [fetchSkillDetail, open, projectPath, skillId]); + void fetchSkillDetail( + skillId, + detail?.item.scope + ? resolveSkillProjectPath(detail.item.scope, projectPath, detail.item.projectRoot) + : (projectPath ?? undefined) + ).catch(() => undefined); + }, [detail?.item.projectRoot, detail?.item.scope, fetchSkillDetail, open, projectPath, skillId]); useEffect(() => { if (!open) { @@ -70,6 +77,9 @@ export const SkillDetailDialog = ({ }, [open]); const item = detail?.item; + const effectiveProjectPath = item + ? resolveSkillProjectPath(item.scope, projectPath, item.projectRoot) + : (projectPath ?? undefined); function formatRootKind(rootKind: 'claude' | 'cursor' | 'agents'): string { return `.${rootKind}`; @@ -92,7 +102,7 @@ export const SkillDetailDialog = ({ try { await deleteSkill({ skillId: item.id, - projectPath: projectPath ?? undefined, + projectPath: effectiveProjectPath, }); setDeleteConfirmOpen(false); onDeleted(); @@ -125,7 +135,7 @@ export const SkillDetailDialog = ({ variant="outline" size="sm" onClick={() => { - void fetchSkillDetail(skillId, projectPath ?? undefined).catch(() => undefined); + void fetchSkillDetail(skillId, effectiveProjectPath).catch(() => undefined); }} > Retry @@ -288,7 +298,7 @@ export const SkillDetailDialog = ({