diff --git a/internal/handlers/skills.go b/internal/handlers/skills.go index 1d534152..445e84e3 100644 --- a/internal/handlers/skills.go +++ b/internal/handlers/skills.go @@ -17,6 +17,7 @@ type SkillItem struct { Description string `json:"description"` Content string `json:"content"` Metadata map[string]any `json:"metadata,omitempty"` + Raw string `json:"raw"` } type SkillsResponse struct { @@ -24,7 +25,7 @@ type SkillsResponse struct { } type SkillsUpsertRequest struct { - Skills []SkillItem `json:"skills"` + Skills []string `json:"skills"` } type SkillsDeleteRequest struct { @@ -74,6 +75,7 @@ func (h *ContainerdHandler) ListSkills(c echo.Context) error { Description: parsed.Description, Content: parsed.Content, Metadata: parsed.Metadata, + Raw: raw, }) } @@ -107,21 +109,17 @@ func (h *ContainerdHandler) UpsertSkills(c echo.Context) error { if err != nil { return echo.NewHTTPError(http.StatusInternalServerError, err.Error()) } - for _, skill := range req.Skills { - name := strings.TrimSpace(skill.Name) - if !isValidSkillName(name) { - return echo.NewHTTPError(http.StatusBadRequest, "invalid skill name") + for _, raw := range req.Skills { + parsed := parseSkillFile(raw, "") + if !isValidSkillName(parsed.Name) { + return echo.NewHTTPError(http.StatusBadRequest, "skill must have a valid name in YAML frontmatter") } - content := strings.TrimSpace(skill.Content) - if content == "" { - content = buildSkillContent(name, strings.TrimSpace(skill.Description)) - } - dirPath := filepath.Join(skillsDir, name) + dirPath := filepath.Join(skillsDir, parsed.Name) if err := os.MkdirAll(dirPath, 0o755); err != nil { return echo.NewHTTPError(http.StatusInternalServerError, err.Error()) } filePath := filepath.Join(dirPath, "SKILL.md") - if err := os.WriteFile(filePath, []byte(content), 0o644); err != nil { + if err := os.WriteFile(filePath, []byte(raw), 0o644); err != nil { return echo.NewHTTPError(http.StatusInternalServerError, err.Error()) } } @@ -374,13 +372,6 @@ func normalizeParsedSkill(skill parsedSkill) parsedSkill { return skill } -func buildSkillContent(name, description string) string { - if description == "" { - description = name - } - return "---\nname: " + name + "\ndescription: " + description + "\n---\n\n# " + name + "\n\n" + description -} - func isValidSkillName(name string) bool { if name == "" { return false diff --git a/packages/sdk/src/types.gen.ts b/packages/sdk/src/types.gen.ts index b42c7054..98c92a1e 100644 --- a/packages/sdk/src/types.gen.ts +++ b/packages/sdk/src/types.gen.ts @@ -613,6 +613,7 @@ export type HandlersSkillItem = { [key: string]: unknown; }; name?: string; + raw?: string; }; export type HandlersSkillsDeleteRequest = { @@ -624,7 +625,7 @@ export type HandlersSkillsResponse = { }; export type HandlersSkillsUpsertRequest = { - skills?: Array; + skills?: Array; }; export type HandlersSnapshotInfo = { diff --git a/packages/web/src/components/file-manager/index.vue b/packages/web/src/components/file-manager/index.vue index 23417040..536da609 100644 --- a/packages/web/src/components/file-manager/index.vue +++ b/packages/web/src/components/file-manager/index.vue @@ -1,8 +1,10 @@