feat(desktop): skill management — create, edit, delete from Settings UI#2271
feat(desktop): skill management — create, edit, delete from Settings UI#2271HUQIANTAO wants to merge 9 commits into
Conversation
- Add skill_read/skill_save/skill_delete RPC commands to protocol - Handle new commands in desktop.ts (Node.js sidecar) using SkillStore - Upgrade PageSkills from read-only to full CRUD: - 'New skill' button opens editor modal - Edit (pencil) and delete (trash) action buttons on project/global skills - Editor modal with name, scope, body (markdown) fields - Delete confirmation popover (inline, like session delete) - Add incoming event for loading skill content - Add skillDetail state to App reducer - Add i18n keys (en, zh-CN; de/ja/ru auto-fallback) - Add CSS styles for editor modal, action buttons, delete confirm
| targetPath = flatPath; | ||
| } | ||
| mkdirSync(dirname(targetPath), { recursive: true }); | ||
| writeFileSync(targetPath, msg.body, "utf8"); |
|
CI is failing on biome formatter only — run |
- Add skill_read/skill_save/skill_delete to DesktopIncomingMsg union - Add SkillDetailEvent interface - Add SkillDetailEvent to EmittableEvent union
|
CI lint is now green — thanks for the quick fix. One thing before I approve: const folderPath = join(dir, msg.name, SKILL_FILE);
const flatPath = join(dir, `${msg.name}.md`);A name like Please add a guard: reject Once name validation is in I'll approve. |
- Reject names containing '..', '/', or '\' - For save/delete: verify resolved target path stays inside skills directory - Prevents rmSync/writeFileSync from operating outside the skills dir
|
Fixed. Added two layers of validation:
Applied to both |
|
The validation looks good — CI is still red on biome though — two auto-fixable issues:
Easiest path: run |
Summary
Upgrade the Skills settings page from read-only to full CRUD with a markdown editor modal.
Changes
Protocol (
desktop/src/protocol.ts)skill_read,skill_save,skill_delete$skill_detail(returns skill body for editing)SkillDetailEventtypeNode.js sidecar (
src/cli/commands/desktop.ts)skill_read: usesSkillStore.read()+readFile()to return skill contentskill_save: validates frontmatter, writes to folder or flat layout, re-emits$skillsskill_delete: removes folder or flat file, re-emits$skillsmkdir,rm,writeFilefromnode:fs/promises,homedir,dirname,SKILLS_DIRNAME,SKILL_FILE,validateSkillFrontmatterFrontend (
desktop/src/ui/settings.tsx)PageSkillsupgraded with:SettingsModalreceives new props:skillDetail,onSkillRead,onSkillSave,onSkillDeleteState (
desktop/src/App.tsx)skillDetailfield added toStatetype and initial state$skill_detailevent handler inapplyIncomingRawSettingsModalCSS (
desktop/src/styles.css).skill-create-btn— accent button with hover inversion.skill-actions— flex container for action buttons.skill-action-btn— icon button with hover states.skill-delete-confirm— inline danger popover.skill-editor-mask— modal backdrop with fade-in.skill-editor— modal panel with rise animation.skill-editor-fields,.skill-editor-body,.skill-editor-actions— form layouti18n
en.tsandzh-CN.tsde.ts/ja.ts/ru.tsauto-inherit via...enspread fallback