| |
| """Push all files to GitHub via Contents API.""" |
| import os, base64, json, time |
| from pathlib import Path |
|
|
| TOKEN = os.environ.get("GITHUB_TOKEN", "") |
| OWNER = "overandor" |
| REPO = "agent-workforce" |
| BRANCH = "main" |
| HEADERS = { |
| "Authorization": f"token {TOKEN}", |
| "Accept": "application/vnd.github.v3+json", |
| } |
|
|
| import urllib.request |
|
|
| def api(method, path, data=None): |
| url = f"https://api.github.com/repos/{OWNER}/{REPO}/contents/{path}" |
| req = urllib.request.Request(url, method=method, headers=HEADERS) |
| if data: |
| req.add_header("Content-Type", "application/json") |
| req.data = json.dumps(data).encode() |
| try: |
| with urllib.request.urlopen(req) as resp: |
| return json.loads(resp.read().decode()) |
| except urllib.error.HTTPError as e: |
| return {"status": e.code, "body": e.read().decode()[:500]} |
|
|
| base = Path("/Users/alep/Downloads/agent-workforce") |
| ignore = {".git", "_push.py", "__pycache__", ".DS_Store"} |
| files = sorted(p for p in base.rglob("*") if p.is_file() and not any(part in ignore for part in p.parts)) |
|
|
| for p in files: |
| rel = str(p.relative_to(base)) |
| content = base64.b64encode(p.read_bytes()).decode() |
| |
| existing = api("GET", rel) |
| sha = existing.get("sha") |
| payload = { |
| "message": f"Add {rel}", |
| "content": content, |
| "branch": BRANCH, |
| } |
| if sha: |
| payload["sha"] = sha |
| result = api("PUT", rel, payload) |
| print(f"{'UPDATED' if sha else 'CREATED'} {rel} -> {result.get('status', 'OK')}") |
| time.sleep(0.5) |
|
|
| print("Done!") |
|
|