"""repo_reader.py — Legge struttura e file di un repository locale.""" from pathlib import Path SKIP={'.git','node_modules','__pycache__','.venv','dist','build'} TEXT={'.py','.ts','.tsx','.js','.jsx','.html','.css','.md','.json','.yaml','.yml','.toml','.txt','.sh'} def read_tree(root:str,max_files:int=80)->dict: rp=Path(root) if not rp.exists(): return {"error":f"Path non trovato: {root}","files":[]} files=[] for p in sorted(rp.rglob("*")): if len(files)>=max_files: break if any(s in p.parts for s in SKIP): continue if p.is_file(): rel=str(p.relative_to(rp)); sz=p.stat().st_size files.append({"path":rel,"size":sz,"type":"text" if p.suffix.lower() in TEXT else "binary","ext":p.suffix}) return {"root":root,"total_files":len(files),"files":files} def read_file(root:str,filepath:str)->dict: full=Path(root)/filepath if not full.exists(): return {"error":f"Non trovato: {filepath}","content":""} if full.stat().st_size>50000: return {"error":"File troppo grande","content":""} if full.suffix.lower() not in TEXT and full.suffix!="": return {"error":"File binario","content":""} try: c=full.read_text(encoding="utf-8",errors="replace") return {"path":filepath,"content":c,"lines":c.count("\n")+1,"size":len(c)} except Exception as e: return {"error":str(e),"content":""} def read_files_batch(root:str,paths:list[str])->list[dict]: return [read_file(root,p) for p in paths[:10]]