https://github.com/basecamp/once
別ターミナルから `once teardown` を実行した際にTUIがパニックしてクラッシュするバグを修正しました。`scrollToSelection` 関数に `len(m.panels) == 0` の早期リターンガードを4行追加し、teardown後の空パネル状態でのインデックスアウトオブレンジを防ぎます。リグレッションテストも合わせて追加されています。
プロダクション向けGoビルドのLDFLAGSに `-s -w` フラグを追加し、バイナリからシンボルテーブルとDWARFデバッグ情報を除去するようになりました。バージョン埋め込みの `-X` フラグは維持されており、1行の変更でリリースバイナリとしての適切な構成が整います。
CLIがTTYに接続されていない環境では、bubbletea によるインタラクティブなプログレス表示をスキップしてタスクを直接実行するよう変更されました。新設された `runWithProgress` 関数にTTY判定ロジックを集約し、`deploy`・`update` コマンドの呼び出しを一本化しています。
`ONCE_REDUCED_MOTION=true` を指定することで、once の初回起動時に表示されるスターフィールド・ロゴアニメーションを抑制できるようになりました。`showLogo()` メソッドへの1行の条件追加という最小限の変更で実現されており、既存の挙動への影響はありません。合わせて `ONCE_INTERACTIVE` を含む環境変数が README にドキュメント化されました。
`once` CLIのアプリケーション識別子を内部名からホスト名に統一し、`deploy`・`update` コマンドに環境変数・SMTP・CPU/メモリ・バックアップ等の設定フラグを集約した `settingsFlags` 構造体を導入。旧 `update`(自己更新)は `self-update` に改名され、新 `update <host>` はフラグで指定した項目のみを既存設定に差分適用する。
環境変数 `ONCE_NO_SELF_UPDATE` を設定することで、ONCEの自動セルフアップデートを無効化できるようになりました。`internal/background/runner.go` の `checkSelfUpdate` 関数に5行を追加し、環境変数がセットされていれば後続のアップデート処理をすべてスキップするアーリーリターンを実装しています。
OnceがプライベートDockerレジストリからのイメージプルに対応しました。`go-containerregistry`の`authn.DefaultKeychain`を利用してローカルのDockerクレデンシャルを自動解決することで、`ghcr.io`・GCR・ECRなどのプライベートレジストリからも追加設定なしでデプロイできるようになります。エラー時は匿名アクセスへ安全にフォールバックするため、既存のパブリックイメージデプロイへの影響はありません。
ONCEのインストーラーに `ONCE_INTERACTIVE=false` 環境変数のサポートが追加されました。TUIの起動をスキップする非対話型モードにより、CI/CDパイプラインやAnsibleなどの構成管理ツールからの自動インストールが公式にサポートされます。
インストールスクリプトが `sudo` でバックグラウンドサービスをセットアップする際、`secure_path` によるPATH制限で `sudo: once: command not found` が発生していた問題を修正。`ONCE_BIN` 変数に `once` バイナリの絶対パスを保持させ、`sudo` 経由を含む全ての呼び出し箇所をPATH解決に依存しない形に統一しました。
ターミナルカラー検出のDA1センチネルマーカーが消費されないままターミナルに漏れ出す不具合を修正。チャネルベースの並行処理をbufio.Readerを用いた同期的なバッファ読み取りループに置き換え、sync.OnceFuncによる安全なリソース解放も導入することで、156行削除・99行追加の大幅な簡素化を実現しました。
CLIコマンドはstderrへ、TUI実行時のみファイルログへ切り替える設計に整理し、Cobraのライフサイクルフックと例外処理を削除。新設のfsutilパッケージで親ディレクトリ自動作成と所有権継承を集約し、sudo実行時にログ・バックアップファイルがrootオーナーで作成される問題を解消した。