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 = ({