Skills › Scientific Agent Skills › pptx-posters › validate_manifest.py
validate_manifest.py
55 lines · skills/pptx-posters/scripts/validate_manifest.py at 5f2bc03
1#!/usr/bin/env python3
2"""Validate a fail-closed, author-approved local poster manifest."""
4from __future__ import annotations
6import argparse
7import sys
9from _common import CliError, emit_json
10from _manifest import load_and_validate_manifest
13def build_parser() -> argparse.ArgumentParser:
14 parser = argparse.ArgumentParser(
15 description=(
16 "Validate strict poster JSON, exact source IDs, local asset hashes, "
17 "layout bounds, output requirements, and approval binding. No network "
18 "is used."
19 )
20 )
21 parser.add_argument("manifest", help="local poster manifest JSON")
22 parser.add_argument(
23 "--structure-only",
24 action="store_true",
25 help="validate asset paths syntactically without reading or hashing assets",
26 )
27 parser.add_argument(
28 "--print-content-hash",
29 action="store_true",
30 help=(
31 "allow draft approval and report the hash an author must approve; "
32 "all other validation still runs"
33 ),
34 )
35 parser.add_argument("--output", help="optional new JSON report path")
36 return parser
39def main(argv: list[str] | None = None) -> int:
40 parser = build_parser()
41 try:
42 args = parser.parse_args(argv)
43 _, _, report = load_and_validate_manifest(
44 args.manifest,
45 verify_assets=not args.structure_only,
46 require_approval=not args.print_content_hash,
47 )
48 emit_json(report, output=args.output)
49 return 0
50 except CliError as exc:
51 parser.exit(2, f"error: {exc}\n")
54if __name__ == "__main__":
55 sys.exit(main())