#!/usr/bin/env python3 import argparse import sys from pathlib import Path import yaml ROOT = Path(__file__).resolve().parents[1] if str(ROOT) not in sys.path: sys.path.insert(0, str(ROOT)) from src.quant_engine.prepare_upload_zip import should_include def main() -> int: parser = argparse.ArgumentParser() parser.add_argument("--manifest", default="runtime/active_artifact_manifest.yaml") parser.add_argument("--root", default=".") parser.add_argument("--strict", action="store_true") args = parser.parse_args() manifest_path = ROOT / args.manifest if not manifest_path.exists(): print(f"Manifest not found: {manifest_path}") return 1 try: manifest = yaml.safe_load(manifest_path.read_text(encoding="utf-8")) except Exception as e: print(f"Error parsing manifest: {e}") return 1 refs = set() if "canonical_source" in manifest: refs.add(manifest["canonical_source"]) if "active_aliases" in manifest and isinstance(manifest["active_aliases"], dict): for val in manifest["active_aliases"].values(): refs.add(val) if "manifest_rows" in manifest and isinstance(manifest["manifest_rows"], list): for row in manifest["manifest_rows"]: if isinstance(row, dict) and "active_artifact" in row: refs.add(row["active_artifact"]) missing_refs = [] for ref in sorted(refs): ref_path = ROOT / ref if not ref_path.exists(): missing_refs.append((ref, "file_not_found")) else: # Check if it is included in upload package mode is_included = should_include(ref_path, mode="upload", include_xlsx=False, include_backups=False) if not is_included: missing_refs.append((ref, "excluded_from_package")) if missing_refs: print("Validation FAILED! Missing packaged artifact references:") for ref, reason in missing_refs: print(f" - {ref} ({reason})") if args.strict: return 1 else: print("Validation PASSED: All active artifact manifest references are present in the package.") return 0 if __name__ == "__main__": sys.exit(main())