50 lines
1.6 KiB
YAML
50 lines
1.6 KiB
YAML
name: eval
|
|
# Structural eval: a skill package must be complete and within limits before
|
|
# it can be merged. Complements sanitize.yml (content gate).
|
|
on:
|
|
pull_request:
|
|
push:
|
|
branches: [main]
|
|
|
|
jobs:
|
|
structure:
|
|
runs-on: windows
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- name: Validate package structure
|
|
shell: python
|
|
run: |
|
|
import json, os, sys
|
|
|
|
errors = []
|
|
REQUIRED = [
|
|
"SKILL.md",
|
|
"manifest.json",
|
|
"references/profile.md",
|
|
"references/tasks.md",
|
|
"references/skills.md",
|
|
"references/tools.md",
|
|
]
|
|
for f in REQUIRED:
|
|
if not os.path.isfile(f):
|
|
errors.append(f"missing required file: {f}")
|
|
|
|
if os.path.isfile("SKILL.md"):
|
|
lines = open("SKILL.md", encoding="utf-8").read().splitlines()
|
|
if len(lines) > 300:
|
|
errors.append(f"SKILL.md too long: {len(lines)} lines (max 300)")
|
|
if not lines or lines[0].strip() != "---":
|
|
errors.append("SKILL.md missing frontmatter")
|
|
|
|
if os.path.isfile("manifest.json"):
|
|
m = json.load(open("manifest.json", encoding="utf-8"))
|
|
for key in ("name", "version", "layer", "ids", "sources", "attribution"):
|
|
if key not in m:
|
|
errors.append(f"manifest.json missing key: {key}")
|
|
|
|
if errors:
|
|
print("EVAL FAILED:")
|
|
print("\n".join(f"- {e}" for e in errors))
|
|
sys.exit(1)
|
|
print("eval: package structure OK.")
|