From 5daa638639a1d24e1cf158207a797e85e9536afd Mon Sep 17 00:00:00 2001 From: lzwjava Date: Sat, 14 Mar 2026 22:28:41 +0800 Subject: [PATCH 1/3] Simplify login: remove standalone login script and use /login command in main app --- .coverage | Bin 53248 -> 53248 bytes mini_copilot/login.py | 77 ------------------------------------------ pyproject.toml | 1 - 3 files changed, 78 deletions(-) delete mode 100644 mini_copilot/login.py diff --git a/.coverage b/.coverage index 069cfc033d236ec99e30c6fa08a84987646112cd..b82b2b2dfd031073ed24c822efd6eb2264b4d4b8 100644 GIT binary patch delta 590 zcmY*WO-vI(7@gUjncZof{i=;6L9h++Oo}GjkS5efCDd*Wc;N)aXrKud4g#7G+chyB z)l9r$+5;ZE7?A@WJc(XR40=-!5+QI>i9bn0Iq0_=YvNqqH}8Gln>RDnx>>E8caKnc zuj34r%f+R>m{daqR$&r4otMs>lT@G8q8eH`7&)bkL8;UE9Jd+q!a9>r$?|yVO83ll z*V2n_feYl7&xfX_CjueQbx*;iOjimc)WqR5Oq8xp&R!fFpDFo+1`cMO^7N(4Q@9jmiszWuMzK39WIyx5ewk8#BiRM! z#i_2lgTl%(PX(fEQb(6jE)G_vPnh%%VxG5PXEhi3@|S$TltprMTUE9Db@ z*M5F@tF8FE(SNcMU$}kK^d(#wuux5ig*T18T4xp84+tdM&F1&@?fXBwERMT~)ucAV z;t>0>9}k&W#f-UY-HnYt+wf`rX&yLbQaUtvQ&=Og4`1Ou?7%O02OIDj)-dxU(DfQW fE~S44we0|e6@V!Mu<(~rV=Mr}41ljRYa;mvlBk*$ delta 1007 zcmZuvOGs2v7`|uj`*F_iIN__zN!k^S5rmo{J_aqA8FCeY-PA-UbhKtn14~_0v@*H1 zG0F*wc0G_5mFA*VhJ^&y%ArL;Qi56xjT!y-=D-!&-0y$f@BjYuoim)|hm-vE?L-^f zQAe~Vr|wnznZCloGw6j~Y=K>50s57W(_@qxv&LnkQeT<$=FI6*0~5FrpB0PjDN3}* z6Y+rkHT&CJ&3Jpuxwg)Iy%&y9t0YoojfNO8tUIAPsYXYRY;y`+obHxr4F9gxu&LV3 zLRYh^r^D$ssQ;7eh$cGwTFsW;C=LiI)|p6<^(CTRaZKxFWKf(}ZpFf?C}CENS&cOv zRzwlA15Tz#d_=%Kj}ji~VbQaxQ|>j*Xe^pAO`H`ZSOt5xO4n{}J>A_cvD3Dg#&I0e zS2;M#%Ak~8qPN%wx@2524#9KUM49nMUq#>E>O!M{uH9|k>ptWb*O;}_JdCDMLap1) z^`cQLpl8U)cS&!0rq>B*8TQZ~{Gic=C zCwzxb@E%^n3_OJUFb-pI6=Ki?jcDC&7*d!()Lgc_Xcke74$?nsRZEY3Hv)y%3OH_1 z_Hcyba`FxAl^IhVzdhfE=GWH;M!k4B97h!0rt8Zy0a?Q+M_YcOsu*lj7t+)DvSQbi z3;`JfzdSgX{xwlNi~|)33%Sx_b3Z7e9g3L^-ViV<5;80AKHpp`)p*SE`11qlRJG*6 zn0bgw1XayjPNh>Xo!0?L4%XoZ9`XyM;3Le#EWCm#c#4O807*RJAe^wJ2xAUV>VRQ5 lpz983nggopfa2^%WZB6i$pI1Hx~(oa!1E4xCNmRK*=2.32.0", "pyperclip>=1.8.0", "beautifulsoup4>=4.12.0" [project.scripts] mini-copilot = "mini_copilot.main:main" -mini-copilot-login = "mini_copilot.login:main" From 22875c2e17d7593d7e48a58f57b053195f9c7147 Mon Sep 17 00:00:00 2001 From: lzwjava Date: Sat, 14 Mar 2026 22:30:21 +0800 Subject: [PATCH 2/3] Restore mini_copilot/login.py as it is required by auth command --- mini_copilot/login.py | 77 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 mini_copilot/login.py diff --git a/mini_copilot/login.py b/mini_copilot/login.py new file mode 100644 index 0000000..fdcfb89 --- /dev/null +++ b/mini_copilot/login.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python3 +import json +import sys +import time +from datetime import datetime, timezone +from pathlib import Path + +import requests + +CONFIG_PATH = Path.home() / ".config" / "mini-copilot" / "config.json" +GITHUB_CLIENT_ID = "01ab8ac9400c4e429b23" # VSCode's client ID + + +def get_device_code(): + resp = requests.post( + "https://github.com/login/device/code", + headers={"Accept": "application/json", "Content-Type": "application/json"}, + json={"client_id": GITHUB_CLIENT_ID, "scope": "read:user repo"}, + ) + resp.raise_for_status() + data = resp.json() + print(f"\n➡️ Visit: {data['verification_uri']}") + print(f"➡️ Enter code: {data['user_code']}\n") + return data + + +def poll_for_access_token(device_code, interval=5): + while True: + time.sleep(interval) + resp = requests.post( + "https://github.com/login/oauth/access_token", + headers={"Accept": "application/json", "Content-Type": "application/json"}, + json={ + "client_id": GITHUB_CLIENT_ID, + "device_code": device_code, + "grant_type": "urn:ietf:params:oauth:grant-type:device_code", + }, + ) + resp.raise_for_status() + data = resp.json() + + if "access_token" in data: + print("✅ GitHub OAuth token obtained.") + return data["access_token"] + elif data.get("error") == "authorization_pending": + print("⏳ Waiting for user authorization...", end="\r") + elif data.get("error") == "slow_down": + interval += 5 + elif data.get("error") == "expired_token": + raise RuntimeError("Device code expired. Please restart.") + else: + raise RuntimeError(f"OAuth error: {json.dumps(data)}") + + +def main(): + try: + device_data = get_device_code() + github_token = poll_for_access_token( + device_data["device_code"], device_data.get("interval", 5) + ) + + config = { + "github_token": github_token, + "created_at": datetime.now(timezone.utc).isoformat(), + } + + CONFIG_PATH.parent.mkdir(parents=True, exist_ok=True) + CONFIG_PATH.write_text(json.dumps(config, indent=2)) + print(f"\n✅ Saved GitHub token to {CONFIG_PATH}") + print("🚀 Now you can run 'mini-copilot' to start chatting.") + except Exception as e: + print(f"\n❌ Error: {e}", file=sys.stderr) + sys.exit(1) + + +if __name__ == "__main__": + main() From 4176a740458929d3cdaca3d28cfdd44965fbd1dc Mon Sep 17 00:00:00 2001 From: lzwjava Date: Sat, 14 Mar 2026 22:31:44 +0800 Subject: [PATCH 3/3] Clean up login.py: remove unused main() and imports --- mini_copilot/login.py | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/mini_copilot/login.py b/mini_copilot/login.py index fdcfb89..a170436 100644 --- a/mini_copilot/login.py +++ b/mini_copilot/login.py @@ -1,13 +1,9 @@ #!/usr/bin/env python3 import json -import sys import time -from datetime import datetime, timezone -from pathlib import Path import requests -CONFIG_PATH = Path.home() / ".config" / "mini-copilot" / "config.json" GITHUB_CLIENT_ID = "01ab8ac9400c4e429b23" # VSCode's client ID @@ -50,28 +46,3 @@ def poll_for_access_token(device_code, interval=5): raise RuntimeError("Device code expired. Please restart.") else: raise RuntimeError(f"OAuth error: {json.dumps(data)}") - - -def main(): - try: - device_data = get_device_code() - github_token = poll_for_access_token( - device_data["device_code"], device_data.get("interval", 5) - ) - - config = { - "github_token": github_token, - "created_at": datetime.now(timezone.utc).isoformat(), - } - - CONFIG_PATH.parent.mkdir(parents=True, exist_ok=True) - CONFIG_PATH.write_text(json.dumps(config, indent=2)) - print(f"\n✅ Saved GitHub token to {CONFIG_PATH}") - print("🚀 Now you can run 'mini-copilot' to start chatting.") - except Exception as e: - print(f"\n❌ Error: {e}", file=sys.stderr) - sys.exit(1) - - -if __name__ == "__main__": - main()