mirror of
https://github.com/bdbrown4/peltier.io.git
synced 2026-11-07 10:58:28 +00:00
skill: fix unloadable SKILL.md frontmatter, and test it in CI
The description was an unquoted YAML scalar containing "trust layer: equivalence" — a colon-space inside a plain scalar makes YAML parse it as a nested mapping, so the frontmatter raised "mapping values are not allowed in this context" and the skill would not load at all. Quoted the scalar and replaced the colon with an em dash. The real defect is that CI asserted the preflight script's behavior but never checked that the skill it ships is loadable. Added a step that parses the frontmatter, requires name/description to be non-empty strings, and requires name to match the directory — so an unloadable skill fails the build instead of failing the user. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -105,6 +105,23 @@ jobs:
|
||||
- uses: dtolnay/rust-toolchain@stable
|
||||
- uses: Swatinem/rust-cache@v2
|
||||
|
||||
- name: SKILL.md frontmatter is loadable
|
||||
run: |
|
||||
python3 - <<'PY'
|
||||
import sys, yaml, pathlib
|
||||
p = pathlib.Path(".claude/skills/peltier/SKILL.md")
|
||||
text = p.read_text(encoding="utf-8")
|
||||
if not text.startswith("---\n"):
|
||||
sys.exit("SKILL.md must open with a --- frontmatter block")
|
||||
fm = yaml.safe_load(text.split("---", 2)[1]) # raises on malformed YAML
|
||||
for key in ("name", "description"):
|
||||
if not isinstance(fm.get(key), str) or not fm[key].strip():
|
||||
sys.exit(f"frontmatter '{key}' must be a non-empty string")
|
||||
if fm["name"] != p.parent.name:
|
||||
sys.exit(f"frontmatter name '{fm['name']}' != directory '{p.parent.name}'")
|
||||
print(f"frontmatter OK: name={fm['name']}, description={len(fm['description'])} chars")
|
||||
PY
|
||||
|
||||
- name: Preflight resolves inside a peltier checkout
|
||||
run: |
|
||||
sh .claude/skills/peltier/scripts/preflight.sh | tee /tmp/pf.txt
|
||||
|
||||
Reference in New Issue
Block a user