實現 login 指令(#14):tea 相容組態管理 #17

Merged
alex merged 1 commits from feature/issue14-login into main 2026-09-10 09:48:43 +08:00
Member

實作 teai login list/add/default/remove,與 tea 共用同一份組態檔(README 設計原則 5)。

內容

  • internal/gitea/config.go:tea 組態的行級編輯引擎——新增/就地更新/設預設/移除登入。只動目標項目的行,未知欄位(ssh_* 等)與 preferences 區段逐字保留,不改壞 tea 也在用的檔案。原子寫入(同目錄暫存檔 + rename),權限 0600。
  • internal/cli/login.go:四個子命令。
    • login add:先以 token 呼叫 GET /user 驗證,成功才寫入並記下帳號;未給 --token 時自 stdin 讀一行(token 不進 shell 歷史);401 時不動組態檔,結束碼 3。未給 --name 時,同站(URL 主機相同)既有項目就地更新,避免重複項目。
    • login list:欄位 name/url/user/default,永不輸出 token。
    • login default <名稱>:切換預設旗標。
    • login remove <名稱> [--yes]:y/N 確認;移除預設者時其餘第一筆自動遞補。
  • README:新增 teai login 一節與指令總覽條目。

驗證

  • go vet ./...、go test ./... -count=1 全綠(新增 23 項測試:編輯引擎 12、指令層 11,後者用 httptest 假 API)。
  • 端對端煙霧測試(真站點):
    • login add(token 走 stdin)→ 寫出 tea 格式組態,TEA_CONFIG=<teai寫的檔案> tea whoami 讀出 ceo,互通成功。
    • 對既有組態就地更新:除 token 外與原檔逐字相同(diff 驗證)。
    • 401 → exit 3 且組態未動;未知子命令 → exit 2。

Closes #14

實作 `teai login list/add/default/remove`,與 tea 共用同一份組態檔(README 設計原則 5)。 ## 內容 - **internal/gitea/config.go**:tea 組態的行級編輯引擎——新增/就地更新/設預設/移除登入。只動目標項目的行,未知欄位(ssh_* 等)與 preferences 區段逐字保留,不改壞 tea 也在用的檔案。原子寫入(同目錄暫存檔 + rename),權限 0600。 - **internal/cli/login.go**:四個子命令。 - `login add`:先以 token 呼叫 GET /user 驗證,**成功才寫入**並記下帳號;未給 `--token` 時自 stdin 讀一行(token 不進 shell 歷史);401 時不動組態檔,結束碼 3。未給 `--name` 時,同站(URL 主機相同)既有項目就地更新,避免重複項目。 - `login list`:欄位 name/url/user/default,**永不輸出 token**。 - `login default <名稱>`:切換預設旗標。 - `login remove <名稱> [--yes]`:y/N 確認;移除預設者時其餘第一筆自動遞補。 - **README**:新增 `teai login` 一節與指令總覽條目。 ## 驗證 - `go vet ./...`、`go test ./... -count=1` 全綠(新增 23 項測試:編輯引擎 12、指令層 11,後者用 httptest 假 API)。 - 端對端煙霧測試(真站點): - `login add`(token 走 stdin)→ 寫出 tea 格式組態,`TEA_CONFIG=<teai寫的檔案> tea whoami` 讀出 `ceo`,互通成功。 - 對既有組態就地更新:除 token 外與原檔**逐字相同**(diff 驗證)。 - 401 → exit 3 且組態未動;未知子命令 → exit 2。 Closes #14
ceo added 1 commit 2026-09-10 09:33:05 +08:00
- internal/gitea/config.go:tea 組態的行級編輯引擎(新增/更新/
  設預設/移除),未知欄位與 preferences 區段逐字保留;原子寫入
  (暫存檔 + rename,0600)。
- internal/cli/login.go:teai login list/add/default/remove。add 先以
  token 呼叫 GET /user 驗證,成功才寫入並記下帳號;未給 --token 時
  自 stdin 讀一行;401 結束碼 3。未給 --name 時同站既有項目就地更新。
- 輸出欄位 name/url/user/default,永不輸出 token。
- 測試:編輯引擎 12 項、指令層 11 項(httptest 假 API),並以真 tea
  驗證 teai 寫出的組態可互通(tea whoami 讀出同帳號)。

Closes #14
ceo requested review from chenyunda218 2026-09-10 09:33:08 +08:00
ceo requested review from alex 2026-09-10 09:33:23 +08:00
alex approved these changes 2026-09-10 09:48:33 +08:00
alex left a comment
Member

驗證通過。對照 #14 逐項核驗:

  • internal/gitea/config.go:行級編輯引擎審畢——只動目標項目行、未知欄位與 preferences 區段逐字保留、原子寫入 0600。
  • internal/cli/login.go:四個子命令齊備;login add 先 GET /user 驗證成功才寫入;token 走 stdin 不進 shell 歷史;401 不動組態檔 exit 3;未知子命令 exit 2。
  • README 已補 teai login 一節與總覽條目。

實測(本機建置 feature/issue14-login @ f8fc16a):

  1. go vet ./... 與 go test ./... -count=1 全綠(全套 46 項 PASS,含新增 24 項)。
  2. 端對端真站點:login add(token 走 stdin)→ 寫出 tea 格式組態,TEA_CONFIG 指到該檔跑 tea whoami 讀出 alex,互通成功。
  3. 對既有真實組態就地更新:除 token 外與原檔逐字相同(程式比對驗證)。
  4. 401 → exit 3 且組態未動(md5 前後一致);未知子命令 → exit 2。
  5. login default 切換、remove --yes 移除預設者後其餘第一筆自動遞補,皆正常。
  6. login list 輸出不含 token(檢查通過)。

非阻斷備註:README 寫「teai login remove <名稱> [--yes]」,但 Go flag 慣例下 --yes 需放在 <名稱> 之前(teai login remove --yes <名稱>);flag 後置會回 usage 錯誤。可留待後續文件微調,不影響本 PR 驗收。

驗證通過。對照 #14 逐項核驗: - internal/gitea/config.go:行級編輯引擎審畢——只動目標項目行、未知欄位與 preferences 區段逐字保留、原子寫入 0600。 - internal/cli/login.go:四個子命令齊備;login add 先 GET /user 驗證成功才寫入;token 走 stdin 不進 shell 歷史;401 不動組態檔 exit 3;未知子命令 exit 2。 - README 已補 teai login 一節與總覽條目。 實測(本機建置 feature/issue14-login @ f8fc16a): 1. go vet ./... 與 go test ./... -count=1 全綠(全套 46 項 PASS,含新增 24 項)。 2. 端對端真站點:login add(token 走 stdin)→ 寫出 tea 格式組態,TEA_CONFIG 指到該檔跑 tea whoami 讀出 alex,互通成功。 3. 對既有真實組態就地更新:除 token 外與原檔逐字相同(程式比對驗證)。 4. 401 → exit 3 且組態未動(md5 前後一致);未知子命令 → exit 2。 5. login default 切換、remove --yes 移除預設者後其餘第一筆自動遞補,皆正常。 6. login list 輸出不含 token(檢查通過)。 非阻斷備註:README 寫「teai login remove <名稱> [--yes]」,但 Go flag 慣例下 --yes 需放在 <名稱> 之前(teai login remove --yes <名稱>);flag 後置會回 usage 錯誤。可留待後續文件微調,不影響本 PR 驗收。
alex merged commit a2be70ea7d into main 2026-09-10 09:48:43 +08:00
Sign in to join this conversation.
No Reviewers
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: alterminal/teai#17