mirror of
https://github.com/addyosmani/agent-skills.git
synced 2026-10-26 23:15:04 +00:00
`parseFrontmatter` splits each line on its first colon. That is enough to read `name` and `description`, and it is forgiving by design — but it means a SKILL.md whose frontmatter is not valid YAML passes every check in the linter. The hosts that consume these skills do not share that forgiveness. Per Cursor staff in #494, attaching a skill to a message parses its frontmatter as YAML, and a parse failure fails the request with a generic server error and takes the rest of the chat's context with it. So the repo could ship frontmatter that breaks a host while CI stayed green. Three shapes pass the current linter and are rejected by a strict parser (confirmed against ruby's psych, each isolated by mutating only the frontmatter of a real SKILL.md that otherwise lints clean): description: Use this: when X colon-space: YAML reads a nested mapping \tkey: value tab indentation is invalid YAML whitespace description: "unterminated an unclosed quote All three now fail with the line number and the fix. Deliberate boundaries: a colon with no trailing space is untouched, so `https://example.com/a:b` still passes, and a duplicate key is NOT reported because `safe_load` accepts one — the rule tracks the parser, not taste. This was verified once by hand against all 25 skills in the #494 thread. This makes it a check instead of a memory. Narrow on purpose: the repo has no package.json and therefore no YAML parser to depend on, so this is a small set of rules aimed at the classes actually observed to break a host, not a YAML implementation. No current frontmatter uses block scalars or multi-line values and the check says so. All 25 skills still pass with 0 errors, every validator exits 0, and the six script suites are green (35 pass in skill-lint-test). Mutation-tested 4/4: removing the call, widening the colon rule to any colon, and dropping either the tab or the unterminated-quote rule each fail the new tests. Refs #494