This commit is contained in:
Timothy Jaeryang Baek
2026-02-19 16:09:54 -06:00
parent 12bea8cd88
commit 6ac593209c
+58 -21
View File
@@ -13,6 +13,7 @@
getSkillById,
getSkillItems,
exportSkills,
createNewSkill,
deleteSkillById,
toggleSkillById
} from '$lib/apis/skills';
@@ -198,30 +199,66 @@
bind:this={importInputElement}
bind:files={importFiles}
type="file"
accept=".md"
accept=".md,.json"
hidden
on:change={() => {
if (importFiles && importFiles.length > 0) {
const reader = new FileReader();
reader.onload = (event) => {
const mdContent = event.target?.result;
if (typeof mdContent === 'string') {
const fm = parseFrontmatter(mdContent);
const fileName = importFiles[0].name.replace(/\.md$/, '');
const rawName = fm.name || fileName;
const displayName = formatSkillName(rawName);
sessionStorage.skill = JSON.stringify({
name: displayName,
id: fm.name || '', // Use raw frontmatter name as ID if available
description: fm.description || '',
content: mdContent,
is_active: true,
access_grants: []
});
goto('/workspace/skills/create');
}
};
reader.readAsText(importFiles[0]);
const file = importFiles[0];
const ext = file.name.split('.').pop()?.toLowerCase();
if (ext === 'json') {
// JSON import: create skills via API
const reader = new FileReader();
reader.onload = async (event) => {
try {
const content = event.target?.result;
if (typeof content !== 'string') return;
const parsedSkills = JSON.parse(content);
const items = Array.isArray(parsedSkills) ? parsedSkills : [parsedSkills];
for (const skill of items) {
await createNewSkill(localStorage.token, skill).catch(
(error) => {
toast.error(`${error}`);
}
);
}
toast.success($i18n.t('Skill imported successfully'));
page = 1;
loadSkillItems();
_skills.set(await getSkills(localStorage.token));
} catch (e) {
toast.error($i18n.t('Invalid JSON file'));
}
};
reader.readAsText(file);
} else {
// Markdown import: parse frontmatter and open in editor
const reader = new FileReader();
reader.onload = (event) => {
const mdContent = event.target?.result;
if (typeof mdContent === 'string') {
const fm = parseFrontmatter(mdContent);
const fileName = file.name.replace(/\.md$/, '');
const rawName = fm.name || fileName;
const displayName = formatSkillName(rawName);
sessionStorage.skill = JSON.stringify({
name: displayName,
id: fm.name || '',
description: fm.description || '',
content: mdContent,
is_active: true,
access_grants: []
});
goto('/workspace/skills/create');
}
};
reader.readAsText(file);
}
importInputElement.value = '';
}
}}
/>