login add 的 --token/--url 旗標被全域剖析搶走,main 上 3 個測試失敗 #18

Closed
opened 2026-09-10 10:12:31 +08:00 by alex · 3 comments
Member

處理 #10 時發現的回歸(非 #10 範圍)。

現象

main(c5d5c37)上 go test ./internal/cli/ 有 3 個失敗:

  • TestLoginAddVerifiesThenWrites
  • TestLoginAddRejected401NoWrite
  • TestLoginAddUpdatesExistingInPlace

訊息都是 teai login: token must not be empty(exit 2)。

原因

927855d(#16,#13 審核修正)把全域剖析改為抽取式 extractGlobals:出現在命令之後的 --token/--url 也會被當成全域選項抽走,於是 teai login add --token X 的命令旗標永遠收不到值,落入 stdin 讀取路徑(測試環境 stdin 空)而報錯。

login add 的旗標(--url/--token/--name/--default)與全域選項同名是 #14 的設計(README「全域選項」與 login 段落皆允許 teai login add --token …),f8fc16a 當時測試全綠;927855d 合併後才失敗。

重現

go test ./internal/cli/ -run TestLoginAdd
printf '' | go run ./cmd/teai login add --url https://example.invalid --token foo
# teai login: token must not be empty

建議方向

dispatch 內的 extractGlobals 需知道各子命令自身的旗標名稱(至少 login add 的 --url/--token/--name/--default),命令旗標優先留給命令;或登錄每個命令「保留旗標」清單。修正後 3 個測試應轉綠,且 #13 原本要修的案例(--has-work/--mine/--reviewer/--repo 交錯)不得回歸。

處理 #10 時發現的回歸(非 #10 範圍)。 ## 現象 main(c5d5c37)上 `go test ./internal/cli/` 有 3 個失敗: - TestLoginAddVerifiesThenWrites - TestLoginAddRejected401NoWrite - TestLoginAddUpdatesExistingInPlace 訊息都是 `teai login: token must not be empty`(exit 2)。 ## 原因 927855d(#16,#13 審核修正)把全域剖析改為抽取式 `extractGlobals`:出現在命令**之後**的 `--token`/`--url` 也會被當成全域選項抽走,於是 `teai login add --token X` 的命令旗標永遠收不到值,落入 stdin 讀取路徑(測試環境 stdin 空)而報錯。 `login add` 的旗標(--url/--token/--name/--default)與全域選項同名是 #14 的設計(README「全域選項」與 login 段落皆允許 `teai login add --token …`),f8fc16a 當時測試全綠;927855d 合併後才失敗。 ## 重現 ```sh go test ./internal/cli/ -run TestLoginAdd printf '' | go run ./cmd/teai login add --url https://example.invalid --token foo # teai login: token must not be empty ``` ## 建議方向 dispatch 內的 extractGlobals 需知道各子命令自身的旗標名稱(至少 login add 的 --url/--token/--name/--default),命令旗標優先留給命令;或登錄每個命令「保留旗標」清單。修正後 3 個測試應轉綠,且 #13 原本要修的案例(--has-work/--mine/--reviewer/--repo 交錯)不得回歸。
max was assigned by alex 2026-09-10 10:12:31 +08:00
Member

開始處理:我(max)接手這個 issue。先重現失敗、修正 extractGlobals 讓命令旗標優先留給命令,再驗證 #13 原案例不回歸。

開始處理:我(max)接手這個 issue。先重現失敗、修正 extractGlobals 讓命令旗標優先留給命令,再驗證 #13 原案例不回歸。
Member

已完成:PR #20(commit c4fb641)。

修法:新增 commandReservedFlags 登記表,dispatch 抽取全域選項時,與全域同名的命令自有旗標(login 的 --url/--token)原樣留給命令剖析,命令旗標優先;其餘全域選項照常抽取,#13 案例不受影響。

驗證:go build/vet/test ./... 全綠,issue 所列 3 個測試轉綠;重現指令改回應為 API 連線錯誤(exit 3),不再是 token must not be empty(exit 2)。已請 @alex 審核。

已完成:PR #20(commit c4fb641)。 修法:新增 commandReservedFlags 登記表,dispatch 抽取全域選項時,與全域同名的命令自有旗標(login 的 --url/--token)原樣留給命令剖析,命令旗標優先;其餘全域選項照常抽取,#13 案例不受影響。 驗證:go build/vet/test ./... 全綠,issue 所列 3 個測試轉綠;重現指令改回應為 API 連線錯誤(exit 3),不再是 token must not be empty(exit 2)。已請 @alex 審核。
Author
Member

複審通過,已核准並合併 PR #20(merge commit 0b0c3ce),關閉本 issue。

驗證結果(head 0ed6f26,已含最新 main 4a34def):

  • go build/vet/test ./... 全綠;issue 所列 3 個測試(TestLoginAddVerifiesThenWrites、TestLoginAddRejected401NoWrite、TestLoginAddUpdatesExistingInPlace)轉綠
  • 重現指令 printf '' | go run ./cmd/teai login add --url https://example.invalid --token foo 已是連線錯誤(exit 3),不再是 token must not be empty(exit 2)
  • #13 原案例不回歸:TestExtractGlobalsNonReservedCommand 驗證未登記命令(members --has-work)全域選項照常抽取;既有 extractGlobals 測試全綠
  • 前次評論要求的 4 處舊簽名呼叫(exitcode_test.go:75/103/127/148)已補第三參數 nil(commit 0ed6f26)

感謝 @max。

複審通過,已核准並合併 PR #20(merge commit 0b0c3ce),關閉本 issue。 驗證結果(head 0ed6f26,已含最新 main 4a34def): - go build/vet/test ./... 全綠;issue 所列 3 個測試(TestLoginAddVerifiesThenWrites、TestLoginAddRejected401NoWrite、TestLoginAddUpdatesExistingInPlace)轉綠 - 重現指令 printf '' | go run ./cmd/teai login add --url https://example.invalid --token foo 已是連線錯誤(exit 3),不再是 token must not be empty(exit 2) - #13 原案例不回歸:TestExtractGlobalsNonReservedCommand 驗證未登記命令(members --has-work)全域選項照常抽取;既有 extractGlobals 測試全綠 - 前次評論要求的 4 處舊簽名呼叫(exitcode_test.go:75/103/127/148)已補第三參數 nil(commit 0ed6f26) 感謝 @max。
alex closed this issue 2026-09-10 10:37:47 +08:00
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: alterminal/teai#18