mirror of
https://github.com/siteboon/claudecodeui.git
synced 2026-06-24 11:15:48 +08:00
fix(skills): restrict standalone skill uploads
Only show Markdown files when selecting standalone skills. Normalize browser file paths so SKILL.md is not mistaken for a folder named dot.
This commit is contained in:
@@ -120,6 +120,7 @@ const getBrowserRelativePath = (file: File): string => {
|
|||||||
|| file.name
|
|| file.name
|
||||||
)
|
)
|
||||||
.replace(/\\/g, '/')
|
.replace(/\\/g, '/')
|
||||||
|
.replace(/^\.\/+/, '')
|
||||||
.replace(/^\/+/, '');
|
.replace(/^\/+/, '');
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -211,6 +212,7 @@ export default function ProviderSkills({ selectedProvider, currentProjects }: Pr
|
|||||||
const [submitError, setSubmitError] = useState<string | null>(null);
|
const [submitError, setSubmitError] = useState<string | null>(null);
|
||||||
const [isSubmitting, setIsSubmitting] = useState(false);
|
const [isSubmitting, setIsSubmitting] = useState(false);
|
||||||
const [searchQuery, setSearchQuery] = useState('');
|
const [searchQuery, setSearchQuery] = useState('');
|
||||||
|
const fileInputRef = useRef<HTMLInputElement>(null);
|
||||||
const folderInputRef = useRef<HTMLInputElement>(null);
|
const folderInputRef = useRef<HTMLInputElement>(null);
|
||||||
|
|
||||||
const providerName = PROVIDER_NAMES[selectedProvider];
|
const providerName = PROVIDER_NAMES[selectedProvider];
|
||||||
@@ -309,7 +311,7 @@ export default function ProviderSkills({ selectedProvider, currentProjects }: Pr
|
|||||||
}
|
}
|
||||||
}, [queueSkillFolders]);
|
}, [queueSkillFolders]);
|
||||||
|
|
||||||
const { getRootProps, getInputProps, isDragActive, open } = useDropzone({
|
const { getRootProps, isDragActive } = useDropzone({
|
||||||
maxFiles: MAX_SKILL_FOLDER_FILES,
|
maxFiles: MAX_SKILL_FOLDER_FILES,
|
||||||
noClick: true,
|
noClick: true,
|
||||||
noKeyboard: true,
|
noKeyboard: true,
|
||||||
@@ -400,7 +402,17 @@ export default function ProviderSkills({ selectedProvider, currentProjects }: Pr
|
|||||||
: 'border-border/70 bg-muted/15 hover:border-foreground/25 hover:bg-muted/25',
|
: 'border-border/70 bg-muted/15 hover:border-foreground/25 hover:bg-muted/25',
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<input {...getInputProps()} />
|
<input
|
||||||
|
ref={fileInputRef}
|
||||||
|
type="file"
|
||||||
|
accept=".md,text/markdown"
|
||||||
|
multiple
|
||||||
|
className="hidden"
|
||||||
|
onChange={(event) => {
|
||||||
|
handleDrop(Array.from(event.target.files ?? []));
|
||||||
|
event.target.value = '';
|
||||||
|
}}
|
||||||
|
/>
|
||||||
<input
|
<input
|
||||||
ref={folderInputRef}
|
ref={folderInputRef}
|
||||||
type="file"
|
type="file"
|
||||||
@@ -420,7 +432,13 @@ export default function ProviderSkills({ selectedProvider, currentProjects }: Pr
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex w-full flex-col gap-2 sm:w-auto sm:flex-row">
|
<div className="flex w-full flex-col gap-2 sm:w-auto sm:flex-row">
|
||||||
<Button type="button" variant="outline" size="sm" onClick={open} className="w-full sm:w-auto">
|
<Button
|
||||||
|
type="button"
|
||||||
|
variant="outline"
|
||||||
|
size="sm"
|
||||||
|
onClick={() => fileInputRef.current?.click()}
|
||||||
|
className="w-full sm:w-auto"
|
||||||
|
>
|
||||||
<FileUp className="h-4 w-4" />
|
<FileUp className="h-4 w-4" />
|
||||||
Choose Files
|
Choose Files
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
Reference in New Issue
Block a user