fix(gen-skill-docs): quote YAML inline scalars containing '...' (Bun strict parser breaks on bare ellipsis)

A bare ... inside a plain YAML scalar is a document-end marker that strict
YAML parsers (Bun.YAML among them) reject mid-scalar. catalog-trim truncation
appends '...' to any description whose lead exceeds 200 chars, so any
truncated description would generate a SKILL.md with unparseable frontmatter.
Add the ellipsis test to toYamlInlineScalar's needsQuote so such scalars are
emitted double-quoted, plus unit coverage for the quoting rules.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Stefan Andrei
2026-08-16 08:33:43 -07:00
committed by Garry Tan
co-authored by Claude Fable 5
parent cb8c79ac77
commit ba979dbd6f
2 changed files with 30 additions and 0 deletions
+29
View File
@@ -23,8 +23,37 @@ import {
buildTrimmedDescription,
buildWhenToInvokeSection,
applyCatalogTrim,
toYamlInlineScalar,
} from '../scripts/gen-skill-docs';
describe('toYamlInlineScalar', () => {
const parses = (out: string) => Bun.YAML.parse(`d: ${out}`);
test("scalar containing '...' (YAML document-end marker) is quoted and round-trips", () => {
const out = toYamlInlineScalar('Truncated lead ends with... more (gstack)');
expect(out.startsWith('"')).toBe(true);
expect((parses(out) as { d: string }).d).toContain('...');
});
test("interior ': ' is quoted (nested-mapping ambiguity, #1778)", () => {
const out = toYamlInlineScalar('Ship workflow: detect and merge');
expect(out.startsWith('"')).toBe(true);
expect((parses(out) as { d: string }).d).toBe('Ship workflow: detect and merge');
});
test('plain safe scalar passes through unquoted', () => {
expect(toYamlInlineScalar('Simple description here')).toBe('Simple description here');
});
test('leading YAML indicator char is quoted', () => {
expect(toYamlInlineScalar('- leading dash').startsWith('"')).toBe(true);
});
test('trailing whitespace is quoted', () => {
expect(toYamlInlineScalar('has trailing space ').startsWith('"')).toBe(true);
});
});
describe('splitCatalogDescription', () => {
test('extracts lead sentence + routing prose from simple multi-line description', () => {
const desc =