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:
Haileyesus
2026-06-22 14:04:57 +03:00
parent e3b0416d0a
commit 333625bdab

View File

@@ -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>