CLI:命令旗標在位置參數之後不被剖析(teai api --method、issues/pulls view --comments 失敗) #25

Closed
opened 2026-09-10 15:15:00 +08:00 by queena · 3 comments
Member

第二輪端對端測試(#9)發現:命令旗標放在位置參數(path/編號)之後時不被剖析,直接被當成位置參數,導致 README 記載的用法失敗。

重現步驟(main @ ffae335 建置)

teai api /repos/alterminal/test --method POST --data '{}' → exit 2「api 需要恰好一個 path」
teai issues view --repo alterminal/teai 9 --comments → exit 2「issues view 需要恰好一個編號」
teai pulls view --repo alterminal/teai 13 --comments → exit 2「pulls view 需要恰好一個編號」

旗標放在位置參數之前則正常:
teai issues view --repo alterminal/teai --comments 9 → exit 0
teai api '/repos/alterminal/teai/pulls?state=all&limit=5' → exit 0(此例旗標在前)

根因

internal/cli/cli.go 的 parseFlags 直接用 flag.FlagSet.Parse:Go 標準 flag 在遇到第一個非旗標參數後即停止剖析,其後的旗標全被當成位置參數。README「全域選項位置」一節宣稱全域選項可與命令旗標交錯,但實際上命令旗標一落在位置參數後就失效。

影響

  • README「日常操作」區塊兩個範例(teai api [--method …] [--data …]、teai issues view … [--comments])照抄即失敗。
  • 直覺用法(編號在前、旗標在後)全部誤判為用法錯誤。

建議修法

parseFlags 改為允許交錯(遇到非旗標參數先收集、繼續掃描後續旗標,最後把收集到的位置參數設回 fs.Args),或各命令改用自訂剖析;附回归測試覆蓋「位置參數在前、旗標在後」的組合。

拆自 #9(第二輪端對端測試發現)。

第二輪端對端測試(#9)發現:命令旗標放在位置參數(path/編號)**之後**時不被剖析,直接被當成位置參數,導致 README 記載的用法失敗。 ## 重現步驟(main @ ffae335 建置) teai api /repos/alterminal/test --method POST --data '{}' → exit 2「api 需要恰好一個 path」 teai issues view --repo alterminal/teai 9 --comments → exit 2「issues view 需要恰好一個編號」 teai pulls view --repo alterminal/teai 13 --comments → exit 2「pulls view 需要恰好一個編號」 旗標放在位置參數之前則正常: teai issues view --repo alterminal/teai --comments 9 → exit 0 teai api '/repos/alterminal/teai/pulls?state=all&limit=5' → exit 0(此例旗標在前) ## 根因 internal/cli/cli.go 的 parseFlags 直接用 flag.FlagSet.Parse:Go 標準 flag 在遇到第一個非旗標參數後即停止剖析,其後的旗標全被當成位置參數。README「全域選項位置」一節宣稱全域選項可與命令旗標交錯,但實際上命令旗標一落在位置參數後就失效。 ## 影響 - README「日常操作」區塊兩個範例(teai api <path> [--method …] [--data …]、teai issues view … <number> [--comments])照抄即失敗。 - 直覺用法(編號在前、旗標在後)全部誤判為用法錯誤。 ## 建議修法 parseFlags 改為允許交錯(遇到非旗標參數先收集、繼續掃描後續旗標,最後把收集到的位置參數設回 fs.Args),或各命令改用自訂剖析;附回归測試覆蓋「位置參數在前、旗標在後」的組合。 拆自 #9(第二輪端對端測試發現)。
alex was assigned by queena 2026-09-10 15:15:00 +08:00
Member

開始處理:我(alex)接手這個 issue。計畫:把 internal/cli 的 parseFlags 改為允許旗標與位置參數交錯(先分離旗標與位置參數、再剖析旗標、最後把位置參數設回),涵蓋直接用 fs.Parse 且帶位置參數的命令(login default/remove),附回歸測試。

開始處理:我(alex)接手這個 issue。計畫:把 internal/cli 的 parseFlags 改為允許旗標與位置參數交錯(先分離旗標與位置參數、再剖析旗標、最後把位置參數設回),涵蓋直接用 fs.Parse 且帶位置參數的命令(login default/remove),附回歸測試。
Member

已完成:PR #28(commit 3ed20b6,分支 fix/issue25-interleaved-flags)。

修法:parseFlags 先分離旗標與位置參數、再剖析旗標串、最後以第二次 Parse 把位置參數設回 fs.Args;Go 標準 flag「遇位置參數即停止」不再影響交錯用法。login.go/workflow_commands.go 直接呼叫 fs.Parse 的六處一併改走 parseFlags(login default/remove 的名稱也可與旗標交錯),並讓命令層 -h 的結束碼依其既有註解宣稱視為成功(0)。

驗證:go vet/go test ./... 全綠;以修復後二進位對本站複測 issue 三個重現步驟(teai api --method POST --data '{}'、teai issues view --repo alterminal/teai <編號> --comments、teai pulls view --repo alterminal/teai <編號> --comments)皆 exit 0,旗標在前用法與寫入閘門(未帶 --yes 回 2)不變。附回歸測試 interleaved_flags_test.go。已請 @queena 審核。

已完成:PR #28(commit 3ed20b6,分支 fix/issue25-interleaved-flags)。 修法:parseFlags 先分離旗標與位置參數、再剖析旗標串、最後以第二次 Parse 把位置參數設回 fs.Args;Go 標準 flag「遇位置參數即停止」不再影響交錯用法。login.go/workflow_commands.go 直接呼叫 fs.Parse 的六處一併改走 parseFlags(login default/remove 的名稱也可與旗標交錯),並讓命令層 -h 的結束碼依其既有註解宣稱視為成功(0)。 驗證:go vet/go test ./... 全綠;以修復後二進位對本站複測 issue 三個重現步驟(teai api <path> --method POST --data '{}'、teai issues view --repo alterminal/teai <編號> --comments、teai pulls view --repo alterminal/teai <編號> --comments)皆 exit 0,旗標在前用法與寫入閘門(未帶 --yes 回 2)不變。附回歸測試 interleaved_flags_test.go。已請 @queena 審核。
Author
Member

PR #28 已驗證符合本 issue 要求並合併,關閉本 issue。

驗證摘要:parseFlags 改為先分離旗標與位置參數再剖析,「位置參數在前、旗標在後」恢復正常;login/workflow 命令六處 fs.Parse 改走 parseFlags;新增 interleaved_flags_test.go 回歸測試。以 PR head(3ed20b6)建置複測重現步驟皆 exit 0,寫入命令未帶 --yes 仍 exit 2;go vet/go test 全綠。

PR #28 已驗證符合本 issue 要求並合併,關閉本 issue。 驗證摘要:parseFlags 改為先分離旗標與位置參數再剖析,「位置參數在前、旗標在後」恢復正常;login/workflow 命令六處 fs.Parse 改走 parseFlags;新增 interleaved_flags_test.go 回歸測試。以 PR head(3ed20b6)建置複測重現步驟皆 exit 0,寫入命令未帶 --yes 仍 exit 2;go vet/go test 全綠。
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: alterminal/teai#25