validate_walk_strategy_config.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. from __future__ import annotations
  2. import argparse
  3. import json
  4. import sys
  5. from pathlib import Path
  6. from typing import Any
  7. ROOT = Path(__file__).resolve().parents[1]
  8. if str(ROOT) not in sys.path:
  9. sys.path.insert(0, str(ROOT))
  10. from content_agent.integrations.walk_strategy_json import (
  11. RULE_PACK_PATH,
  12. WALK_STRATEGY_PATH,
  13. validate_walk_strategy_config,
  14. )
  15. def main() -> int:
  16. args = _parse_args()
  17. path = args.config_path if args.config_path.is_absolute() else _repo_root() / args.config_path
  18. strategy = json.loads(path.read_text(encoding="utf-8"))
  19. root_dir = _repo_root()
  20. findings = validate_walk_strategy_config(
  21. strategy,
  22. root_dir=root_dir,
  23. strategy_path=path.relative_to(root_dir),
  24. rule_pack_path=RULE_PACK_PATH,
  25. )
  26. result: dict[str, Any] = {
  27. "status": "fail" if any(finding["level"] == "fail" for finding in findings) else "pass",
  28. "config_path": str(path.relative_to(root_dir)),
  29. "walk_strategy_version": strategy.get("strategy_version"),
  30. "findings": findings,
  31. }
  32. print(json.dumps(result, ensure_ascii=False, indent=2))
  33. return 1 if result["status"] == "fail" else 0
  34. def _parse_args() -> argparse.Namespace:
  35. parser = argparse.ArgumentParser()
  36. parser.add_argument(
  37. "config_path",
  38. nargs="?",
  39. type=Path,
  40. default=_repo_root() / WALK_STRATEGY_PATH,
  41. )
  42. return parser.parse_args()
  43. def _repo_root() -> Path:
  44. return Path(__file__).resolve().parents[1]
  45. if __name__ == "__main__":
  46. sys.exit(main())