refactor: env.py を keychain.py / gpg.py に分割

概要

env.py(472行)にKeychain(#41 (closed))・GPG(#42 (closed))対応が追加され、3つの異なる関心事が同居する状態になっている。責務ごとにファイルを分割する。

分割方針

  • src/fnb/env.py: load_env_files(), get_ssh_password()(オーケストレーター), get_timeout()
  • src/fnb/keychain.py(新規): _is_macos(), get_keychain_password()
  • src/fnb/gpg.py(新規): _gpg_passwords_dir(), _gpg_password_filename(), _warn_if_permissive(), _decrypt_gpg_file(), get_gpg_password()

外部からの参照はget_ssh_password()/get_timeout()のみ(fetcher.py/uploader.py)であることを確認済み。keychain/gpgの内部関数はtest_env.py自身のテストからしか参照されていないため、分割による影響範囲はenv.py内部のimport文のみ。

サブパッケージ化(src/fnb/env/等)は現状の規模には過剰と判断し、既存のfetcher.py/backuper.py/uploader.pyと同じフラットな兄弟モジュールパターンを採用する。

テストもtests/unit/test_env.py(606行)からtest_keychain.py/test_gpg.pyを分離する。