import json, subprocess, time, sys
OUT = sys.argv[1]
Q = [
 ("root-mcp", 'filename:.mcp.json size:<400'),
 ("root-mcp", 'filename:.mcp.json size:400..1000'),
 ("root-mcp", 'filename:.mcp.json size:>1000'),
 ("cursor", 'filename:mcp.json path:.cursor size:<500'),
 ("cursor", 'filename:mcp.json path:.cursor size:>=500'),
 ("plain-mcp", 'filename:mcp.json -path:.cursor -path:.vscode'),
 ("claude-desktop", 'filename:claude_desktop_config.json'),
 ("claude-settings", 'filename:settings.json path:.claude size:<600'),
 ("claude-settings", 'filename:settings.json path:.claude size:>=600'),
 ("codex", 'filename:config.toml path:.codex'),
 ("gemini", 'filename:settings.json path:.gemini'),
]
seen=set()
with open(OUT,"a") as f:
  for kind,q in Q:
    for page in range(1,11):
      for attempt in range(5):
        r = subprocess.run(["gh","api","-X","GET","search/code","-f","q="+q,"-f","per_page=100","-f",f"page={page}"],capture_output=True,text=True)
        if r.returncode==0: break
        sys.stderr.write(f"retry {kind} p{page}: {r.stderr[:120]}\n"); time.sleep(30)
      else: break
      d=json.loads(r.stdout); items=d.get("items",[])
      n=0
      for it in items:
        k=(it["repository"]["full_name"],it["path"])
        if k in seen: continue
        seen.add(k); n+=1
        f.write(json.dumps({"q":kind,"repo":it["repository"]["full_name"],"path":it["path"],"sha":it["sha"]})+"\n")
      f.flush()
      sys.stderr.write(f"{kind} [{q}] p{page}: total {d.get('total_count')} got {len(items)} new {n}\n")
      time.sleep(6.5)
      if len(items)<100: break
