agentsclimarketplace

Cua browser github oauth

Skill ChrisLamDev/cua-desktop-automation-skills/skills/cua-browser-github-oauth

Complete GitHub OAuth/Device Code Flow via Cua Driver browser automation — bypasses Chrome URL bar search issue when authenticating from headless agentsFrom its SKILL.md

Install
npx -y skills add ChrisLamDev/cua-desktop-automation-skills --skill cua-browser-github-oauth

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

3 things to look at

  • 3 stars3 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
  • runs commandsInstructs the agent to run 8 commands, including `open -a "Google Chrome" "https://github.com/login/device"` and 7 more.
  • fetches URLsInstructs the agent to fetch 5 URLs, including https://github.com/login/device and 4 more.

SKILL.md

15.3 KB, ~5.2k tokens by cl100k_base, as published. Nobody here has run it

Cua Browser GitHub OAuth 流程

適用場景

需要用 browser 完成 GitHub OAuth(device code flow、create token、授權 gh CLI),但 Cua 嘅 type_text + Enter 喺 Chrome URL bar 會觸發 Google Search 而唔係 navigate。

核心問題

Chrome URL bar 嘅預設行為係:打 github.com/xxx → Google Search,唔係直接 navigate。呢個令到用 Cua 嘅 type_text()press_key('enter') 去 navigate 唔 work。

重要前提:用戶角色判斷

Device code flow 有幾種用戶場景,做法大不同:

場景 A:用戶正用電腦打字(標準) → 用 terminal 開 gh auth login,用戶自己輸入 code 最直接。

場景 B:用戶喺手機上(如 Telegram),電腦冇人操作 → gh CLI timeout(~120s)係主要問題,用戶手機操作嘅 timing 難以配合。 → 解決: 叫用戶手機開 browser 去 https://github.com/login/device 自己貼 code,佢填完授權就得。agent 喺 terminal 等住 gh auth status

場景 C:用戶想 agent 喺電腦上全自動搞 → 先確定 Safari/Chrome 嘅 AX tree 深度。Safari 可以深達 2000+ nodes,Cua 嘅 get_window_state 會被截斷。 → 如果 vision mode 截圖唔 work(background app screenshot limitation),需要用 AppleScript。

可靠方法

方法 A:用 open command(最 reliable)

open -a "Google Chrome" "https://github.com/login/device"
# 或者用 skip_account_picker 跳過 Google account picker
open -a "Safari" "https://github.com/login/device?skip_account_picker=1"

呢個會直接開新 tab/window navigate 去目標 URL。然後用 Cua 嘅 list_windows 睇新開嘅 window。

方法 B:Cua hotkey + URL(次選)

# Cmd+L focus URL bar
cua_call('hotkey', {'pid': chrome_pid, 'window_id': wid, 'keys': ['command', 'l']})
# 必須用完整 https:// 開頭(但依然可能被 search)
cua_call('type_text', {'pid': chrome_pid, 'window_id': wid, 'text': 'https://github.com/login/device'})
cua_call('press_key', {'pid': chrome_pid, 'window_id': wid, 'key': 'enter'})

方法 C:AppleScript(最直接,需事前 Enable 設定)

Step 0:確保 Safari Developer 設定已開 Safari > Settings > Developer > 「Allow JavaScript from Apple Events」 可以一開機就叫用戶開咗佢,之後永久可用。

Step 1:Terminal 開 gh auth login 攞 code

gh auth login --git-protocol https --web

輸出:! First copy your one-time code: XXXX-XXXX

Step 2:用 open command 開 Safari 去 device login page

open -a "Safari" "https://github.com/login/device?skip_account_picker=1"

?skip_account_picker=1 可以跳過 Google account picker,直接去 code input page。

Step 3:AppleScript 檢查當前 URL + 填 code

# Check which page we're on
osascript -e 'tell app "Safari" to return URL of current tab of window 1'

# If on account picker page, click the desired account
osascript -e '
tell application "Safari"
    do JavaScript "..." in current tab of window 1
end tell'

# Fill device code into inputs
osascript -e '
tell application "Safari"
    do JavaScript "
        document.getElementById(\"otp_0\").value = \"B\";
        document.getElementById(\"otp_1\").value = \"C\";
        ...
    " in current tab of window 1
end tell'

Step 4:授權確認頁面處理 填完 code 後,GitHub 會顯示 account name 同「Continue」button。

osascript -e '
tell application "Safari"
    do JavaScript "
        document.querySelector(\"button\").click();
    " in current tab of window 1
end tell'

Step 5:Terminal check

gh auth status
# 成功: Logged in as <username>

GitHub Token Copy 問題

經典 token create 後,GH 嘅 UI 用 CSS text-overflow: ellipsis truncate 顯示。Cua 嘅 Accessibility API 同 clipboard 都只拎到 truncated version(例如 ghp_go...Pyjy)。

解決方法: 直接用 open command 開 token 頁面,叫用戶手動 copy token,或者用 device code flow 代替。

經典 Token Create(備用方案)

如果 device code flow 持續失敗,可以用 classic token:

  1. open -a "Google Chrome" "https://github.com/settings/tokens/new"
  2. Cua fill Note + 揀 repo scope + workflow
  3. Scroll down + click "產生令牌"
  4. Success page 出現。Token value truncated — 需要用戶手動 copy

Device Code Flow vs Token 對比

方法適合場景風險
Device code flow(手機授權)用戶喺手機/另一部機操作gh CLI timeout 問題;用戶手機 browser 可能 redirect 到主頁而非 /login/device
Token method(PAT)用戶肯俾 token 時Token 用完要 delete;agent 唔應該儲存 token 在任何地方
Cua Driver 自動填 code電腦 Chrome/Safari 可用Safari AX 2000+ nodes 易截斷;Chrome 相對穩定

Token method 安全操作 SOP

  1. 只用一次:agent 收完 token 後,用 gh auth login --with-token login,唔好 save 落任何檔案
  2. 用完即棄:叫用戶去 https://github.com/settings/tokens delete 個 token。gh CLI 喺 macOS 會自動轉用 Keychain credential,唔再依賴 token
  3. Keychain 自動接管:login 成功後 macOS Keychain 會存 credential。如果後續 delete token,gh CLI 會顯示 invalid token error,要 gh auth logout 再重新 login
  4. Fine-grained token vs Classic token:Fine-grained 嘅 scopes 比 Classic 精準,但兩者都只暴露 GitHub account 本身,唔會洩漏 iMac/system info
  5. 唔好將 token 寫入任何 config file:gh CLI 嘅 hosts.yml 只存 username,token 喺 keychain

手機操作嘅死循環陷阱

用戶手機成功喺 browser 授權後,gh CLI session 已 timeout:

  1. Agent 再開新 code → 用戶手機 browser 直接 redirect 到 GitHub 主頁(因為已授權)
  2. 用戶永遠去唔到 /login/device 重新輸入 — 手機 browser(尤其係內置 browser)可能 cache 咗 redirect,之後永遠 show 404
  3. 解決: logout 先 (gh auth logout) 再重新開 flow,或者直接轉用 Token method

macOS 環境下的 GitHub CLI 認證路徑

macOS Keychain token 失效後的處理

當用戶 delete 咗 PAT token 後,gh CLI 嘅 keyring 入面仍然存有舊 token 記錄,顯示:

X Failed to log in to github.com account (keyring)
- The token in keyring is invalid.

必須先 logout 再重新 login,唔可以直接再 gh auth login

gh auth logout -h github.com -u <username>   # 先清除舊記錄
gh auth login --hostname github.com --git-protocol https --web   # 再重新 login

多種認證方式嘅優先級策略

嘗試順序方法時機
1Device code flow(手機)用戶容易操作時先試
2Cua Driver + Chrome 自動填 code用戶想全自動、Chrome 可用時
3Fine-grained PAT token(使用一次)1-2 次 device flow 失敗後立即轉用
4AppleScript + Safari(需預先 enable JS)Safari 用戶、需自動化時

實戰建議: 如果 device code flow 試咗 2 次都唔得,直接 skip 去 Token method。每次 device flow 大約要 3-5 分鐘來回溝通,仲未計 troubleshooting。

Cua 實戰 Chrome 完整操作流程(2026-06-22 實測有效)

  1. 確定 Chrome 嘅 window_idlist_windows(pid=chrome_pid) → 揀 on_screen=true 嘅 window
  2. open -a "Google Chrome" "https://github.com/login/device?skip_account_picker=1" navigate
  3. 攞 codegh auth login --git-protocol https --web(呢邊開住先唔等)
  4. 快啲填 code:用 AX tree 嘅 element_index
    • 使用者代碼 0-3:[21]-[24] → click + type_text 逐格填
    • element [25] 係 dash,skip
    • 使用者代碼 5-8:[26]-[29] → click + type_text 逐格填
  5. Click 「繼續」click(element_index=30, pid, window_id)
  6. 等待 confirmation page load → URL 變 github.com/login/device/confirmation
  7. Click 「授權 GitHub」:喺新 AX tree 搵 AXButton "授權 GitHub"(通常 element [37] 或 [436] — Chrome 有 duplicate tree)
  8. Checkgh auth status

重要 timing note: 填 code 同 click 授權嘅動作要快,因為 gh auth login 嘅 session 只有 ~120s 有效期。如果中間 vision_analyze 或 AX query 花太多時間,可能未 click 完授權就已經 timeout。

Chrome AX tree duplicate 問題: Chrome 經常有 2 個 AXWindow(一個 active、一個 stale),同樣嘅 button 會出現喺兩個位置。click 邊個都得,效果一樣。

GitHub Primer React 組件自動化(2026-07-04 實戰發現)

GitHub 使用 Primer React Components,輸入組件需要特殊處理:

Create Repository 頁面 (/new)

  • Repository name input: id="repository-name-input" (input type="text")
  • Description input: id="_r_d_" (input,React controlled)
  • Create repository button: document.querySelectorAll('button')[21] — text "Create repository"

可靠填寫方法:execCommand('insertText')

// 填 repo name
var el = document.querySelector('#repository-name-input');
el.focus();
document.execCommand('insertText', false, 'cocos-creator-debug-skills');

// 填 description
var desc = document.querySelector('#_r_d_');
desc.focus();
document.execCommand('insertText', false, '17 executable AI agent skills...');

// Click Create repository
document.querySelectorAll('button')[21].click();

注意: 使用 nativeSetter + inputEvent dispatch 會 fail(React Primer 組件 reject programmatic value set)。execCommand('insertText') 係唯一成功方法。使用前要先 focus() + click() 確保 element 已被 React focus。

Create Token 頁面 (/settings/tokens/new)

  • Token note input: id="token_description"
  • Scopes checkboxes: 用 input[value="repo"] selector
  • 同樣可以用 execCommand('insertText') 填 note

已知元素位置

頁面元素Selector方法
/newRepo name#repository-name-inputexecCommand('insertText')
/newDescription#_r_d_execCommand('insertText')
/newCreate buttonbutton:contains("Create repository").click()
/settings/tokens/newToken note#token_descriptionexecCommand('insertText')
/settings/tokens/newrepo scopeinput[value="repo"].click()

實戰發現:GitHub Sudo Mode & 2FA(2026-07-04 更新)

Sudo Mode 觸發條件

  • 唔會觸發/settings/tokens (token list page)、/settings/emails/new
  • 會觸發/settings/tokens/N (individual token page)、/settings/tokens/new (new token page)、any settings page that needs confirmation

Sudo Mode 頁面結構

GitHub Sudo Mode 用 <sudo-credential-options> web component,有兩個選項:

Option 1: GitHub Mobile(優先)

<button class="...">Use GitHub Mobile</button>

Click 後 GitHub send push notification 到手機 GitHub App。同時頁面顯示一組驗證數字

We sent you a verification request on your GitHub Mobile app.
Enter the digits shown below to enter sudo mode.

42

你唔需要入呢個 code — GitHub Mobile app 會 show 呢個 code,你喺 app 入面確認就得。

Option 2: Send a code via email

呢個係一個 <button> 包喺 <li> 入面(唔係 <a> link):

<li><button><span>Send a code via email</span></button></li>

位置大約喺 (689, 352)(window-local coordinates)。可以用 Cua pixel click 觸發。

實戰策略

由於 Sudo Mode 需要用戶手機參與,以下係最有效率嘅做法:

  1. 直接 navigate 到 https://github.com/settings/tokens(list page,唔使 sudo)
  2. 如果可以 regenerate existing token,呢個頁面冇 2FA block
  3. 如果要 generate 新 token → 㩒「Generate new token」→ sudo mode → 通知用戶手機 approve
  4. 用戶 approve 後頁面自動 reload → agent 可以繼續填 form

Key Insight:Token List Page ≠ Token Edit Page

Token list page (/settings/tokens) 完全唔使 sudo mode。但任何操作去 token detail 或 creation page 都需要。策略係:

  • 如果可以 reuse existing token → 直接喺 list page 用已知 token ID 操作
  • 如果一定要新 token → 用 GitHub Mobile 最快,email code 可能 delay

Generate PAT 時,GitHub 會卡一個「Confirm access」頁面要求手機 GitHub App 輸入驗證碼。Cua Driver 無法繞過呢個 macOS 安全邊界。

協作模式:

  1. Cua 導航到 https://github.com/settings/tokens/new
  2. GitHub 彈出 sudo mode 頁面 → 需要 user 用手機 GitHub App 確認
  3. User 確認後返到 token 頁面 → Cua 可以繼續填 Note、tick scopes、Generate

經驗教訓:

  • Cmd+L → type URL → Return 係最可靠嘅導航方法(AX path)
  • Edge/Chromium 嘅 keyboard tab/return 有時會觸發 Google 搜尋而非 dropdown — 唔好用 tab 做 form 操作
  • type_text 落 focused element 仍然可靠
  • 如果頁面跳咗,重新 Cmd+L → type URL → Return 導航就得

已知 Pitfalls

  • gh CLI timeout ~120s — 用戶喺手機操作一定唔夠快。最好係 agent 開 flow 先,唔好等 gh auth login 個 process 一路等,而係開咗 flow 就 let it background,等用戶搞掂先 check
  • 手機操作嘅死循環:用戶成功喺手機授權後,gh CLI session 已 timeout,再開新 code → 用戶手機 browser 被 redirect 到 GitHub 主頁 → 永遠去唔到 /login/device。解決: 唔好靠用戶手機做多次。改用電腦 Chrome 直接操作,或者用 Token method 一了百了
  • Cua 填 8 格 code input fields 可行:Chrome 嘅 AX tree 對 /login/device 頁面支援良好,element_index [21]~[29] (使用者代碼 0-8) 可以用 click + type_text 逐格填。但記住中間 element [25] 係 dash(skip)。
  • 授權確認頁面嘅「授權 GitHub」button:填完 code 後嘅 /login/device/confirmation 頁面嘅「授權 GitHub」button 係 element [37](AXButton)。click 完後 gh CLI 要見到先 sync 到
  • Cua 對同一 window 嘅 snapshot 有 2 個 duplicate tree:Chrome 經常有 2 個 AXWindow(一個 active、一個 stale),同樣嘅 button 會出現喺兩個位置(e.g. [37] 同 [436])。click 邊個都得
  • 最穩陣係直接放棄 device code flow 改用 Token:如果試咗 2-3 次 device flow 都搞唔掂,直接叫用戶開 github.com/settings/tokens generate fine-grained token 畀 agent,用 gh auth login --with-token 秒搞掂
  • Chrome 嘅 open command 會開新 tab,唔係新 window:如果 Chrome 已經有 login session,新 tab 會自動跳過 account picker
  • Cua vision mode 對 background apps 唔一定 work — 試到唔得就轉 method,唔好死試
  • Chrome URL bar 唔可以用嚟 navigate — 一定用 open command
  • Safari AX tree 極深(2000+ nodes) — query filter 都救唔到,AppleScript 係更可靠嘅路
  • AppleScript 需要事前 enable JS from Apple Events — 呢個係一次性設定
  • Token copy truncated — 唔好依賴 Cua copy token
  • Cua hotkey 用 arraykeys: ['command', 'l'] 唔係 key: 'l' + modifiers

What ships with it

Read from the repository

Just SKILL.md. No reference files, no scripts.

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.