{"record":{"id":"a893ac89956adce1","repo":"flipped-aurora/gin-vue-admin","slug":"name-a893ac","errorCode":null,"errorMessage":"name不能为空","messagePattern":"name不能为空","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"server/service/system/sys_skills.go","lineNumber":649,"sourceCode":"\t\t\tend = i\n\t\t\tbreak\n\t\t}\n\t}\n\tif end == -1 {\n\t\treturn system.SkillMeta{}, clean, nil\n\t}\n\tyamlText := strings.Join(lines[1:end], \"\\n\")\n\tbody := strings.Join(lines[end+1:], \"\\n\")\n\tvar meta system.SkillMeta\n\tif err := yaml.Unmarshal([]byte(yamlText), &meta); err != nil {\n\t\treturn system.SkillMeta{}, body, err\n\t}\n\treturn meta, body, nil\n}\n\nfunc buildSkillContent(meta system.SkillMeta, markdown string) (string, error) {\n\tif meta.Name == \"\" {\n\t\treturn \"\", errors.New(\"name不能为空\")\n\t}\n\tdata, err := yaml.Marshal(meta)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tyamlText := strings.TrimRight(string(data), \"\\n\")\n\tbody := strings.TrimLeft(markdown, \"\\n\")\n\tif body != \"\" {\n\t\tbody = body + \"\\n\"\n\t}\n\treturn fmt.Sprintf(\"---\\n%s\\n---\\n%s\", yamlText, body), nil\n}\n\nfunc listFiles(dir string) []string {\n\tentries, err := os.ReadDir(dir)\n\tif err != nil {\n\t\treturn []string{}\n\t}","sourceCodeStart":631,"sourceCodeEnd":667,"githubUrl":"https://github.com/flipped-aurora/gin-vue-admin/blob/3136500ef380842b0eb6c4daa87c3f8a47fcf9e0/server/service/system/sys_skills.go#L631-L667","documentation":"buildSkillContent serializes SkillMeta to YAML front matter for a SKILL.md file. It returns name不能为空 when meta.Name is the empty string, because a skill file without a name cannot be identified by the loader. The check runs before yaml.Marshal in the Save flow.","triggerScenarios":"Calling Save with a request whose meta.Name (or name field) is omitted or \"\", e.g. saving a skill created without completing the name field.","commonSituations":"Frontend form allows submit with empty name; API consumer posts JSON without the 'name' key; code that copies meta but forgets to set Name after a rename.","solutions":["Set meta.Name to a non-empty value before calling Save.","Add required-field validation in the frontend form (name mandatory).","If editing an existing skill, load its current meta first and keep the existing name.","Server-side API callers: include \"name\" in the request payload."],"exampleFix":"// before\nmeta := system.SkillMeta{Description: \"demo\"}\n// after\nmeta := system.SkillMeta{Name: \"my-skill\", Description: \"demo\"}","handlingStrategy":"validation","validationCode":"if strings.TrimSpace(meta.Name) == \"\" {\n\treturn errors.New(\"skill meta.name is required before Save\")\n}","typeGuard":"func hasName(m system.SkillMeta) bool { return strings.TrimSpace(m.Name) != \"\" }","tryCatchPattern":"if _, err := svc.Save(req); err != nil {\n\tif strings.Contains(err.Error(), \"name不能为空\") {\n\t\treturn fmt.Errorf(\"request must include a non-empty skill name\")\n\t}\n\treturn err\n}","preventionTips":["Mark the name field required in frontend forms.","When reusing meta structs, always set Name explicitly.","Load existing meta before editing so Name is preserved.","Validate payloads with a schema requiring 'name'."],"tags":["validation","yaml","go","missing-field"],"backgroundTag":"missing-required-field","analyzedSha":"3136500ef380842b0eb6c4daa87c3f8a47fcf9e0","analyzedAt":"2026-08-31T13:50:02.721Z","schemaVersion":2},"datasetVersion":"2026-08-31T19:17:28.585Z"}