skill-forge / test_skillforge.py
WhySoCodius's picture
Skill Forge: static browser app + Python/MCP port for Agent Skills
4fa5831 verified
Raw
History Blame Contribute Delete
3.4 kB
"""Self-check for skillforge.py. Run: python test_skillforge.py"""
import io
import zipfile
from skillforge import (validate_skill, lint_description, scaffold_skill,
package_skill, split_frontmatter)
GOOD = """---
name: pdf-form-filler
description: >
Fills interactive PDF forms from a data mapping and flattens the result.
Use when the user asks to complete, populate, or auto-fill a PDF form,
e.g. "fill out this application PDF" or "populate the tax form fields".
license: MIT
allowed-tools:
- Read
- Bash
---
# PDF Form Filler
## When to use this skill
- The user hands over a fillable PDF and field values.
## Instructions
1. Inspect the form fields.
2. Map data onto them and flatten.
"""
def test_split():
fm, body = split_frontmatter(GOOD)
assert fm and "pdf-form-filler" in fm
assert body.strip().startswith("# PDF Form Filler")
assert split_frontmatter("no frontmatter here")[0] is None
# BOM + CRLF tolerance
assert split_frontmatter("---\r\nname: x\r\n---\r\nbody")[0].strip() == "name: x"
def test_good_skill_passes():
r = validate_skill(GOOD)
assert r.ok, r.errors
assert not r.errors
def test_missing_frontmatter():
r = validate_skill("# just a heading\n\nsome text")
assert not r.ok and any("frontmatter" in e for e in r.errors)
def test_bad_name_and_desc():
md = "---\nname: Not_KebabCase!!\ndescription: short\n---\n\nbody text here\n"
r = validate_skill(md)
assert not r.ok
assert any("kebab-case" in e for e in r.errors)
assert any("short" in w for w in r.warnings)
def test_empty_body():
md = "---\nname: ok-name\ndescription: " + "x" * 60 + " use when needed\n---\n\n \n"
r = validate_skill(md)
assert not r.ok and any("Body is empty" in e for e in r.errors)
def test_invalid_yaml():
r = validate_skill("---\nname: [unclosed\n---\nbody\n")
assert not r.ok and any("YAML" in e for e in r.errors)
def test_lint_scores():
weak = lint_description("Does stuff.")
strong = lint_description(
"Converts Markdown notes into a styled slide deck. Use when the user asks "
"to 'turn this into slides', 'make a deck', or 'present this document', "
"e.g. a report they want rendered as shareable slides.")
ws = int(weak.info[-1].split(":")[1].split("/")[0])
ss = int(strong.info[-1].split(":")[1].split("/")[0])
assert ws < 55 <= ss, (ws, ss)
assert strong.ok and not weak.ok
def test_scaffold_roundtrips():
md = scaffold_skill("My Cool Skill",
"Reviews Terraform plans for drift.",
"the user runs terraform plan and wants a risk summary")
assert "name: my-cool-skill" in md
r = validate_skill(md)
assert r.ok, r.errors
def test_package_rejects_bad_and_zips_good():
try:
package_skill("---\nname: X\n---\n")
assert False, "should have raised"
except ValueError:
pass
blob = package_skill(GOOD, {"reference.md": "# notes"})
with zipfile.ZipFile(io.BytesIO(blob)) as z:
names = z.namelist()
assert "pdf-form-filler/SKILL.md" in names
assert "pdf-form-filler/reference.md" in names
if __name__ == "__main__":
for fn in list(globals().values()):
if callable(fn) and getattr(fn, "__name__", "").startswith("test_"):
fn()
print("all checks passed")