fix(gear): pexpect 実行のコマンド文字列連結と SSH ホスト鍵確認プロンプト未対応

問題

1. コマンドの文字列連結

gear.py:83-84, 150" ".join(cmd) した文字列を pexpect.spawn() に渡している。パスに空白や特殊文字が含まれると壊れる。subprocess.run 経路はリスト渡しで安全なのと非対称。

2. 初回接続のホスト鍵確認に未対応

gear.py:153[Pp]assword: しか expect していないため、known_hosts 未登録ホストでは Are you sure you want to continue connecting (yes/no)? で停止し TIMEOUT になる。

3. タイムアウトが 30 秒固定

run_rsync(timeout=30) は呼び出し側から変更できない。大容量転送で expect(EOF, timeout=timeout) が途中で切れる懸念。テンプレートが示唆する FNB_TIMEOUT も未実装。

修正方針

  • pexpect.spawn("rsync", args=[...]) の形にしてリスト渡しに統一
  • expect パターンにホスト鍵確認プロンプトを追加(自動 yes はせず、ユーザーへ案内して中断)
  • タイムアウトを環境変数 FNB_TIMEOUT または設定ファイルから指定可能にする
  • 転送中の EOF 待ちはプロンプト待ちと別のタイムアウト(無制限 or 長め)にする

該当箇所

  • src/fnb/gear.py:83-84, 109-223
  • src/fnb/env.py(FNB_TIMEOUT 読み取り追加)