#!/usr/bin/env python3 """ cli.py — Interface de Linha de Comando do Protocolo de Auditoria Civica TecnoPopular. Permite avaliar qualquer ferramenta civica via URL e gerar laudos tecnicos em JSON e Markdown. """ import argparse import json import sys from pathlib import Path from models import AuditRubric from evaluator import CivicEvaluator def main() -> int: parser = argparse.ArgumentParser( description="Protocolo de Auditoria Civica TecnoPopular (CTP-1.0) - Inspecao Tecnica" ) parser.add_argument("--url", required=True, help="URL pública da ferramenta cívica a ser auditada") parser.add_argument("--name", required=True, help="Nome legível da iniciativa") parser.add_argument("--id", default="", help="Slug / Identificador único (opcional)") parser.add_argument("--repo", default=None, help="URL do repositório público de código (opcional)") parser.add_argument("--sources", nargs="*", default=None, help="Fontes primárias declaradas (ex: TSE IBGE CGU)") parser.add_argument("--output-json", default="", help="Caminho para salvar o laudo em JSON") parser.add_argument("--output-md", default="", help="Caminho para salvar a síntese em Markdown") args = parser.parse_args() tool_id = args.id or args.name.lower().replace(" ", "-") evaluator = CivicEvaluator() print(f"[*] Iniciando auditoria técnica de: {args.name} ({args.url})") report = evaluator.audit_target( tool_id=tool_id, tool_name=args.name, target_url=args.url, declared_repo=args.repo, declared_sources=args.sources ) print("\n" + "=" * 70) print(f"LAUDO DE AUDITORIA CIVICA: {report.tool_name}") print("=" * 70) print(f"Status: {report.status.value.upper()}") print(f"Selo/Classificacao: {report.badge_label}") print(f"Score Total: {report.total_score:.1f} / 100") print(f"Bloqueador Critico: {'SIM' if report.has_critical_blocker else 'NAO'}") print("-" * 70) print("NOTAS POR DIMENSAO:") for dim, score in report.dimension_scores.items(): st = "APROVADO" if score.is_passing else "AJUSTE RECOMENDADO" print(f" - {dim.value:25} {score.raw_score:5.1f}/100 ({score.weighted_score:4.1f} pts) [{st}]") print("=" * 70) if args.output_json: p_json = Path(args.output_json) p_json.write_text(report.model_dump_json(indent=2), encoding="utf-8") print(f"[+] Laudo estruturado salvo em: {p_json}") if args.output_md: p_md = Path(args.output_md) p_md.write_text(report.summary_markdown, encoding="utf-8") print(f"[+] Sintese Markdown salva em: {p_md}") return 0 if __name__ == "__main__": sys.exit(main())