fix: stdin TTY 偵測改以 fd 0 實際裝置判定,escript 真終端機不再誤判(issue #19)

- 新增 BearCli.TTY:readlink /proc/self/fd/0 判定 pts/tty/console/ptmx;
  無 /proc 平台退回 :io.rows/0
- vault/self_service 的 tty_stdin?、accounts 的 tty? 改用 TTY.stdin_tty?
- 根因::io.rows/0/:io.columns/0 走 io 協定問 group leader,escript
  (noshell standard_io)不支援行列查詢,一律回 enotsup——真終端機被
  誤判成非 TTY,互動指令(vault unlock 等)無法讀 stdin 密碼
  (bear #52 驗收建議 2)
- 非 TTY(pipe/redirect)行為不變:明確提示+退出碼 2
- 新增 tty_test(4 測試);mix precommit 全綠(200 passed)
This commit is contained in:
2026-09-14 19:26:23 +08:00
parent a2edb03a0e
commit a29b976f13
5 changed files with 128 additions and 6 deletions
+4 -2
View File
@@ -25,7 +25,7 @@ defmodule BearCli.Vault do
錯誤(含非 TTY);3 未登入或 401;6 網路/伺服器錯誤;8 權限不足。
"""
alias BearCli.{Api, Config, Credentials}
alias BearCli.{Api, Config, Credentials, TTY}
alias BearCli.Vault.{BIP39, Crypto}
@session_env "BEAR_VAULT_SESSION"
@@ -932,7 +932,9 @@ defmodule BearCli.Vault do
end
end
defp tty_stdin?, do: match?({:ok, _}, :io.rows())
# stdin 是否為 TTY:優先以 fd 0 實際裝置判定(escript 環境 :io.rows/0 一律
# enotsup,真終端機會被誤判;見 BearCli.TTY,issue #19)。
defp tty_stdin?, do: TTY.stdin_tty?()
defp require_nonempty(""), do: {:error, "不可空白", 2}
defp require_nonempty(value) when is_binary(value), do: :ok