{"record":{"id":"f817ae2f6f5a4dbb","repo":"Yeachan-Heo/oh-my-codex","slug":"filepath-is-missing-a-non-empty-frontmatter-de","errorCode":null,"errorMessage":"${filePath} is missing a non-empty frontmatter \"description\"","messagePattern":"(.+?) is missing a non-empty frontmatter \"description\"","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/cli/setup.ts","lineNumber":2286,"sourceCode":"\t\tif (!match) {\n\t\t\tthrow new Error(\n\t\t\t\t`${filePath} has invalid YAML frontmatter on line ${index + 2}: ${trimmed}`,\n\t\t\t);\n\t\t}\n\n\t\tconst [, key, rawValue] = match;\n\t\tif (!rawValue.trim()) continue;\n\n\t\tconst parsedValue = parseSkillFrontmatterScalar(rawValue, key, filePath);\n\t\tif (key === \"name\") name = parsedValue;\n\t\tif (key === \"description\") description = parsedValue;\n\t}\n\n\tif (!name) {\n\t\tthrow new Error(`${filePath} is missing a non-empty frontmatter \"name\"`);\n\t}\n\tif (!description) {\n\t\tthrow new Error(\n\t\t\t`${filePath} is missing a non-empty frontmatter \"description\"`,\n\t\t);\n\t}\n\n\treturn { name, description };\n}\n\nexport async function validateSkillFile(skillMdPath: string): Promise<void> {\n\tconst content = await readFile(skillMdPath, \"utf-8\");\n\tparseSkillFrontmatter(content, skillMdPath);\n}\n\nconst INSTALLED_SKILL_BADGE_PREFIX = \"[OMX] \";\n\n/**\n * Does this installed skill directory carry the badge OMX writes on install?\n *\n * The badge replaced a hand-maintained name list as the SIGNAL that a directory came from OMX, and it","sourceCodeStart":2268,"sourceCodeEnd":2304,"githubUrl":"https://github.com/Yeachan-Heo/oh-my-codex/blob/3ad79a8a6fe6e95fdbb8c00e40716fffe4011ce2/src/cli/setup.ts#L2268-L2304","documentation":"Skill frontmatter validation error: the required `description` field is missing or empty. Every skill must declare a description so the agent can discover and select it.","triggerScenarios":"Loading a skill file whose frontmatter has a `name` but no `description` key, or a blank/whitespace description value.","commonSituations":"Authors write the name and forget the description; automated generators emit partial headers; empty description string from templating placeholders.","solutions":["Add a non-empty `description:` line to the skill's frontmatter","Check for a description value that is only whitespace or an empty quoted string","Regenerate the skill file from a complete template if using a generator"],"exampleFix":"# before\n---\nname: code-linter\n---\n\n# after\n---\nname: code-linter\ndescription: Lints code and reports issues\n---","handlingStrategy":"validation","validationCode":"function hasSkillDescription(src: string): boolean {\n  const m = src.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n  if (!m) return false;\n  return /^description:\\s*\\S+.*$/m.test(m[1]);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Require both name and description in skill authoring guidelines","CI-check skill files with a regex or yaml parse before shipping"],"tags":["yaml","frontmatter","skill","validation"],"backgroundTag":"missing-required-frontmatter-field","analyzedSha":"3ad79a8a6fe6e95fdbb8c00e40716fffe4011ce2","analyzedAt":"2026-08-27T22:18:39.783Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}