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を分離する。