muhammadbinmurtza
Restructure: clauseguard as package subfolder, app_file: clauseguard/app.py
913a064
"""ClauseGuard CLI β€” run the 5-agent pipeline from the command line."""
import argparse
import asyncio
import logging
import sys
from pathlib import Path
# Ensure parent directory is in path so `clauseguard` package is importable
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
from clauseguard.agents.orchestrator import run_pipeline
from clauseguard.config.settings import validate_config
from clauseguard.tools.file_tools import extract_text
logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s")
logger = logging.getLogger(__name__)
def main() -> None:
"""Entry point for the ClauseGuard CLI."""
parser = argparse.ArgumentParser(
description="ClauseGuard β€” AI-Powered Contract Clause Risk Analyzer"
)
parser.add_argument(
"--file",
type=str,
required=True,
help="Path to the contract file (PDF, TXT, or DOCX)",
)
parser.add_argument(
"--output",
type=str,
default="report.md",
help="Path for the output markdown report (default: report.md)",
)
args = parser.parse_args()
try:
validate_config()
except ValueError as e:
logger.error("Configuration error: %s", e)
print(f"Error: {e}")
print("Create a .env file with your model endpoint settings or set them as environment variables.")
sys.exit(1)
file_path = Path(args.file)
if not file_path.exists():
logger.error("File not found: %s", file_path)
print(f"Error: File not found β€” {file_path}")
sys.exit(1)
try:
file_bytes = file_path.read_bytes()
except Exception as e:
logger.error("Failed to read file: %s", e)
print(f"Error: Could not read file β€” {e}")
sys.exit(1)
try:
raw_text = extract_text(file_bytes, file_path.name)
except ValueError as e:
logger.error("File parsing error: %s", e)
print(f"Error: {e}")
sys.exit(1)
print(f"Analyzing {file_path.name}...")
print()
try:
report = asyncio.run(run_pipeline(raw_text, file_path.name))
except Exception as e:
logger.error("Pipeline failed: %s", e)
print(f"Error: Analysis failed β€” {e}")
sys.exit(1)
output_path = Path(args.output)
try:
output_path.write_text(report.markdown_report, encoding="utf-8")
except Exception as e:
logger.error("Failed to write report: %s", e)
print(f"Error: Could not write report β€” {e}")
sys.exit(1)
print("=" * 60)
print(f"Report saved to: {output_path}")
print(f"Overall Risk Score: {report.summary.overall_score}/10")
print(f"Critical: {report.summary.critical_count} | High: {report.summary.high_count} | "
f"Medium: {report.summary.medium_count} | Low: {report.summary.low_count}")
print()
print("Top 3 Actions Before Signing:")
for i, action in enumerate(report.top_3_actions, 1):
print(f" {i}. {action}")
print("=" * 60)
if __name__ == "__main__":
main()