From 1de59cb84f85e12dfe7fce1533800caf7e47233a Mon Sep 17 00:00:00 2001 From: 777genius Date: Thu, 16 Apr 2026 23:18:02 +0300 Subject: [PATCH] fix(extensions): validate skill import source paths locally --- .../extensions/skills/SkillImportDialog.tsx | 25 ++++++++--- .../extensions/skills/skillValidationUtils.ts | 8 ++++ .../skills/SkillImportDialog.test.ts | 45 +++++++++++++++++++ .../skills/skillValidationUtils.test.ts | 13 +++++- 4 files changed, 83 insertions(+), 8 deletions(-) diff --git a/src/renderer/components/extensions/skills/SkillImportDialog.tsx b/src/renderer/components/extensions/skills/SkillImportDialog.tsx index 2dc73c4b..b49bdc2e 100644 --- a/src/renderer/components/extensions/skills/SkillImportDialog.tsx +++ b/src/renderer/components/extensions/skills/SkillImportDialog.tsx @@ -25,7 +25,7 @@ import { FileSearch, FolderOpen, X } from 'lucide-react'; import { getSuggestedSkillFolderNameFromPath } from './skillFolderNameUtils'; import { SkillReviewDialog } from './SkillReviewDialog'; import { resolveSkillProjectPath } from './skillProjectUtils'; -import { validateSkillFolderName } from './skillValidationUtils'; +import { validateSkillFolderName, validateSkillImportSourceDir } from './skillValidationUtils'; import type { SkillReviewPreview } from '@shared/types/extensions'; @@ -127,8 +127,16 @@ export const SkillImportDialog = ({ } async function handleReview(): Promise { + const normalizedSourceDir = sourceDir.trim(); + const normalizedFolderName = folderName.trim(); + const sourceDirError = validateSkillImportSourceDir(sourceDir); + if (sourceDirError) { + setMutationError(sourceDirError); + return; + } + const folderNameError = - folderName.trim().length > 0 ? validateSkillFolderName(folderName) : null; + normalizedFolderName.length > 0 ? validateSkillFolderName(normalizedFolderName) : null; if (folderNameError) { setMutationError(folderNameError); return; @@ -138,8 +146,8 @@ export const SkillImportDialog = ({ setMutationError(null); try { const nextPreview = await previewSkillImport({ - sourceDir, - folderName: folderName || undefined, + sourceDir: normalizedSourceDir, + folderName: normalizedFolderName || undefined, scope, rootKind, projectPath: resolveSkillProjectPath(scope, projectPath), @@ -158,12 +166,15 @@ export const SkillImportDialog = ({ } async function handleConfirmImport(): Promise { + const normalizedSourceDir = sourceDir.trim(); + const normalizedFolderName = folderName.trim(); + setImportLoading(true); setMutationError(null); try { const detail = await applySkillImport({ - sourceDir, - folderName: folderName || undefined, + sourceDir: normalizedSourceDir, + folderName: normalizedFolderName || undefined, scope, rootKind, projectPath: resolveSkillProjectPath(scope, projectPath), @@ -296,7 +307,7 @@ export const SkillImportDialog = ({