feat: 實作 bear CLI PAT 模式 MVP(login/whoami/token/logout/status) #3

Closed
alex wants to merge 1 commits from feat/pat-mode-mvp into main
Member

實作 bear CLI 的 PAT(個人存取權杖)模式最小可用版本,對應 issue #2。

範圍

  • bear login --token <PAT>:以 PAT 驗證 GET /userinfo 後寫入憑證檔(0600),全程免瀏覽器
  • bear whoami:GET /userinfo 顯示身分 claims(支援 --json)
  • bear token:印出 access token 供 pipe(--refresh 在 PAT 模式無 refresh token,忽略並警告)
  • bear logout:清除本機憑證(PAT 需至網頁撤銷)
  • bear status:純本機判定登入狀態

技術

  • Elixir + Mix escript(單檔可執行 bear),HTTP 一律使用 Req(與 bear 主專案一致)
  • 憑證檔 ~/.local/state/bear/credentials.json:原子寫入(rename)、0600、O_CREAT|O_EXCL 防 symlink
  • 全域選項 --issuer(優先序 flag > BEAR_ISSUER > 設定檔 > 預設)、--config、--json、-v、-h、--version
  • 29 個單元測試;mix precommit(compile --warnings-as-errors + format + test)全綠

未包含

  • Device Flow(RFC 8628)登入:需 bear 倉庫伺服器端 P1(/device_authorization 等)完成後再接
  • bear apps(P3)暫緩
實作 bear CLI 的 PAT(個人存取權杖)模式最小可用版本,對應 issue #2。 ## 範圍 - `bear login --token <PAT>`:以 PAT 驗證 `GET /userinfo` 後寫入憑證檔(0600),全程免瀏覽器 - `bear whoami`:`GET /userinfo` 顯示身分 claims(支援 `--json`) - `bear token`:印出 access token 供 pipe(`--refresh` 在 PAT 模式無 refresh token,忽略並警告) - `bear logout`:清除本機憑證(PAT 需至網頁撤銷) - `bear status`:純本機判定登入狀態 ## 技術 - Elixir + Mix escript(單檔可執行 `bear`),HTTP 一律使用 `Req`(與 bear 主專案一致) - 憑證檔 `~/.local/state/bear/credentials.json`:原子寫入(rename)、0600、O_CREAT|O_EXCL 防 symlink - 全域選項 `--issuer`(優先序 flag > BEAR_ISSUER > 設定檔 > 預設)、`--config`、`--json`、`-v`、`-h`、`--version` - 29 個單元測試;`mix precommit`(compile --warnings-as-errors + format + test)全綠 ## 未包含 - Device Flow(RFC 8628)登入:需 bear 倉庫伺服器端 P1(`/device_authorization` 等)完成後再接 - `bear apps`(P3)暫緩
Owner

為甚麼PR頁面顯示There is no key available to sign this commit.?

為甚麼PR頁面顯示There is no key available to sign this commit.?
Author
Member

感謝提問,這是 Gitea 的 commit 簽章提示,不是錯誤。說明如下:

原因

此 PR 唯一的 commit 8cc8c414 沒有 GPG 簽章(驗證狀態為 not_signed_commit),而我的 Gitea 帳號 alex 目前未設定任何 GPG 簽署金鑰,因此 Gitea 在 PR 頁面顯示「There is no key available to sign this commit」(找不到可用來簽署此 commit 的金鑰)。

是否影響合併

不影響。此 repo 目前沒有啟用任何 branch protection(分支保護)要求「必須簽章提交」,所以這只是提示,不會阻擋審核或合併。

若要啟用 commit 簽章

  1. 在 Gitea 帳號設定新增 GPG 公鑰(Settings → SSH/GPG Keys)。
  2. 本機設定 git signing key(user.signingkey + commit.gpgsign=true)。
  3. 重新簽署並 push 這個 commit。

若組織希望 bear-cli 一律要求簽章提交,我可以協助設定 GPG 並補簽,再視需要請 repo 管理員開啟「Require signed commits」。需要我處理嗎?

感謝提問,這是 Gitea 的 commit 簽章提示,不是錯誤。說明如下: **原因** 此 PR 唯一的 commit `8cc8c414` 沒有 GPG 簽章(驗證狀態為 `not_signed_commit`),而我的 Gitea 帳號 `alex` 目前未設定任何 GPG 簽署金鑰,因此 Gitea 在 PR 頁面顯示「There is no key available to sign this commit」(找不到可用來簽署此 commit 的金鑰)。 **是否影響合併** 不影響。此 repo 目前沒有啟用任何 branch protection(分支保護)要求「必須簽章提交」,所以這只是提示,不會阻擋審核或合併。 **若要啟用 commit 簽章** 1. 在 Gitea 帳號設定新增 GPG 公鑰(Settings → SSH/GPG Keys)。 2. 本機設定 git signing key(`user.signingkey` + `commit.gpgsign=true`)。 3. 重新簽署並 push 這個 commit。 若組織希望 bear-cli 一律要求簽章提交,我可以協助設定 GPG 並補簽,再視需要請 repo 管理員開啟「Require signed commits」。需要我處理嗎?
Owner

請設定 GPG 並補簽

請設定 GPG 並補簽
Author
Member

收到,我來設定 GPG 簽章並補簽這個 commit。步驟:① 產生 alex 帳號專用的 GPG 金鑰(UID alex@alterminal.com);② 把公鑰加入 Gitea 帳號(Settings → SSH/GPG Keys);③ 將 commit 的 committer e-mail 由 alex@localhost 改為 alex@alterminal.com(讓簽章能對上帳號信箱)並補簽;④ 強制推送更新 PR 分支。完成後再回報。

收到,我來設定 GPG 簽章並補簽這個 commit。步驟:① 產生 alex 帳號專用的 GPG 金鑰(UID alex@alterminal.com);② 把公鑰加入 Gitea 帳號(Settings → SSH/GPG Keys);③ 將 commit 的 committer e-mail 由 alex@localhost 改為 alex@alterminal.com(讓簽章能對上帳號信箱)並補簽;④ 強制推送更新 PR 分支。完成後再回報。
alex added 1 commit 2026-08-31 11:14:17 +08:00
- 新增 Elixir + Mix escript 專案(Req 0.5+、Jason)
- login --token <PAT>:以 PAT 驗證 /userinfo 後寫入憑證檔(0600)
- whoami:GET /userinfo 顯示身分 claims(支援 --json)
- token:印出 access token 供 pipe(--refresh 在 PAT 模式忽略)
- logout:清除本機憑證;status:純本機判定
- 憑證檔採原子寫入(rename)、0600、O_CREAT|O_EXCL 防 symlink
- 全域選項:--issuer/--config/--json/-v/-h/--version
- 29 個單元測試;mix precommit(compile --warnings-as-errors + format + test)
- 更新 README.md 與 docs/commands.md 反映 PAT 模式 MVP

Device Flow 登入待伺服器端 P1(bear 倉庫)完成後再接。issue #2
alex force-pushed feat/pat-mode-mvp from 8cc8c41416 to 870011f8a7 2026-08-31 11:14:17 +08:00 Compare
Author
Member

已完成 GPG 簽章設定與補簽,PR 現在顯示 verified。

做了什麼

  1. 產生 alex 帳號專用 GPG 金鑰(ed25519,UID alex <alex@alterminal.com>):
    • 主金鑰 8D839021FEE30FA6(指紋 AB135F10783D5FC09C7770558D839021FEE30FA6)
    • 簽章子金鑰 C6A623EE5633A1D8
    • 到期日 2028-08-30(兩年)
  2. 公鑰已加入 Gitea 帳號 alex(Settings → SSH/GPG Keys)。
  3. 補簽並強制推送:commit 由 8cc8c414 改寫為 870011f8,同時把 author/committer e-mail 由 alex@localhost 更正為 alex@alterminal.com(與金鑰 UID、帳號信箱一致)。Gitea 驗證狀態為 verified(signer:alex / C6A623EE5633A1D8)。

備註

  • 私鑰因 agent 需非互動簽署而以無密碼(no-protection)存放於 ~/.gnupg,未寫入任何 commit/PR。若組織有更嚴格要求可改為密碼保護+手動輸入。
  • 已在 bear-cli 本地 git 設定 commit.gpgsign=true 與 user.signingkey,後續此倉庫的 commit 會自動簽章。
  • 若希望強制要求簽章(「Require signed commits」分支保護),需 repo 管理員開啟,我可再協助。
已完成 GPG 簽章設定與補簽,PR 現在顯示 verified。 **做了什麼** 1. 產生 alex 帳號專用 GPG 金鑰(ed25519,UID `alex <alex@alterminal.com>`): - 主金鑰 `8D839021FEE30FA6`(指紋 `AB135F10783D5FC09C7770558D839021FEE30FA6`) - 簽章子金鑰 `C6A623EE5633A1D8` - 到期日 2028-08-30(兩年) 2. 公鑰已加入 Gitea 帳號 alex(Settings → SSH/GPG Keys)。 3. 補簽並強制推送:commit 由 `8cc8c414` 改寫為 `870011f8`,同時把 author/committer e-mail 由 `alex@localhost` 更正為 `alex@alterminal.com`(與金鑰 UID、帳號信箱一致)。Gitea 驗證狀態為 verified(signer:alex / C6A623EE5633A1D8)。 **備註** - 私鑰因 agent 需非互動簽署而以無密碼(no-protection)存放於 `~/.gnupg`,未寫入任何 commit/PR。若組織有更嚴格要求可改為密碼保護+手動輸入。 - 已在 bear-cli 本地 git 設定 `commit.gpgsign=true` 與 `user.signingkey`,後續此倉庫的 commit 會自動簽章。 - 若希望強制要求簽章(「Require signed commits」分支保護),需 repo 管理員開啟,我可再協助。
chenyunda218 closed this pull request 2026-08-31 16:06:15 +08:00

Pull request closed

Please reopen this pull request to perform a merge.
Sign in to join this conversation.