"""Adapter: jscpd JSON output → Finding[].""" from __future__ import annotations import json from scripts.manifest import Finding def parse_jscpd_output(stdout: str) -> list[Finding]: try: payload = json.loads(stdout) except json.JSONDecodeError: return [] if not isinstance(payload, dict): return [] out: list[Finding] = [] for dup in payload.get("duplicates", []): first = dup.get("firstFile", {}) second = dup.get("secondFile", {}) lines = dup.get("lines", 0) severity = "medium" if lines >= 30 else "low" out.append(Finding( tool="jscpd", rule_id=f"jscpd:clone-{lines}lines", severity=severity, file=first.get("name", ""), line=first.get("start", 0), end_line=first.get("end", 0), message=( f"duplicate of {second.get('name', '')}:" f"{second.get('start', 0)}-{second.get('end', 0)} ({lines} lines)" ), )) return out