Align skill package checks and include notices in archives
Check instruction packages / check (push) Successful in 2s
Check instruction packages / check (push) Successful in 2s
This commit is contained in:
1 parent
6e6a691b68
commit
370416b87b
3 files changed
+42
-7
No files matched your search
+15
-6
@@ -117,9 +117,17 @@ def check_package(path):
|
||||
_fail(f"{path}: unsupported skill metadata")
|
||||
if len(top_keys) != len(set(top_keys)) or set(top_keys) - {"name", "description", "metadata", "disable-model-invocation"} or len(nested_keys) != len(set(nested_keys)) or set(nested_keys) != {"relayview-display-name", "relayview-version"}:
|
||||
_fail(f"{path}: unsupported skill metadata")
|
||||
values = dict(line.split(": ", 1) for line in frontmatter.splitlines() if not line.startswith(" ") and ": " in line)
|
||||
if "disable-model-invocation" in values and values["disable-model-invocation"] not in ("true", "false"):
|
||||
_fail(f"{path}: disable-model-invocation must be a boolean")
|
||||
expected_name = path.name
|
||||
if not re.search(rf"(?m)^name: {re.escape(expected_name)}$", frontmatter) or not re.search(r"(?m)^description: .+$", frontmatter) or not re.search(r"(?m)^ relayview-display-name: .+$", frontmatter) or not re.search(r"(?m)^ relayview-version: [0-9]+\.[0-9]+\.[0-9]+$", frontmatter):
|
||||
_fail(f"{path}: missing or incompatible skill metadata")
|
||||
if not re.fullmatch(r"[a-z0-9]+(?:-[a-z0-9]+)*", expected_name) or len(expected_name) > 64 or len(values["description"]) > 1024:
|
||||
_fail(f"{path}: skill name or description exceeds owner bounds")
|
||||
display_name = next(line.split(": ", 1)[1] for line in frontmatter.splitlines() if line.startswith(" relayview-display-name: "))
|
||||
if len(display_name) > 128:
|
||||
_fail(f"{path}: display name exceeds owner bounds")
|
||||
digest = hashlib.sha256(b"relayview-instruction-package-v1\0" + _frame(raw_manifest))
|
||||
for name in sorted(declared):
|
||||
digest.update(_frame(name.encode("utf-8")))
|
||||
@@ -132,12 +140,13 @@ def package_archive(path, destination):
|
||||
check_package(path)
|
||||
destination.parent.mkdir(parents=True, exist_ok=True)
|
||||
with zipfile.ZipFile(destination, "w", compression=zipfile.ZIP_STORED) as archive:
|
||||
for file in sorted(path.rglob("*")):
|
||||
if file.is_file():
|
||||
name = f"{path.name}/{file.relative_to(path).as_posix()}"
|
||||
info = zipfile.ZipInfo(name, date_time=(1980, 1, 1, 0, 0, 0))
|
||||
info.external_attr = 0o100644 << 16
|
||||
archive.writestr(info, file.read_bytes())
|
||||
root = Path(__file__).resolve().parents[1]
|
||||
files = [(name, root / name) for name in ("LICENSE", "NOTICE.md")]
|
||||
files += [(f"{path.name}/{file.relative_to(path).as_posix()}", file) for file in sorted(path.rglob("*")) if file.is_file()]
|
||||
for name, file in files:
|
||||
info = zipfile.ZipInfo(name, date_time=(1980, 1, 1, 0, 0, 0))
|
||||
info.external_attr = 0o100644 << 16
|
||||
archive.writestr(info, file.read_bytes())
|
||||
return hashlib.sha256(destination.read_bytes()).hexdigest()
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user