環境変数でアニメーションを無効化できる `ONCE_REDUCED_MOTION` オプションを追加

basecamp/once

ONCE_REDUCED_MOTION=true を指定することで、初回起動時のスターフィールド・ロゴアニメーションを抑制できるようになりました。スクリプトによる自動インストールや、アニメーションが問題となる環境への対応が容易になります。

背景

once は初回起動時にアニメーション付きのロゴと背景を表示します。この演出は通常の対話的な利用では問題ありませんが、一部の環境では動作に支障をきたしたり、視覚的に煩わしいと感じるケースがありました。このPRは、そうした状況を環境変数ひとつで制御できるようにするものです。

合わせて、既存の ONCE_INTERACTIVE=false を含むツールの環境変数が README に初めてドキュメント化されました。

技術的な変更

変更の核心は internal/ui/install.goshowLogo() メソッドへの条件追加です。

変更前:

func (m Install) showLogo() bool {
    return len(m.namespace.Applications()) == 0
}

変更後:

func (m Install) showLogo() bool {
    return len(m.namespace.Applications()) == 0 && os.Getenv("ONCE_REDUCED_MOTION") != "true"
}

元々 showLogo() は「アプリケーションが1件も登録されていない場合(=初回起動時)にロゴを表示する」というロジックでした。今回の変更では、この条件に &&ONCE_REDUCED_MOTION の確認を追加しています。既存のアプリ存在チェックのロジックは一切変わらず、環境変数が "true" のときだけ表示を抑制するという最小限の修正です。

テストは internal/ui/install_test.goTestInstall_ShowLogo として追加されました。t.Setenv を使って環境変数の有無・アプリの有無の4つの組み合わせをすべて検証しており、環境変数を設定するとアプリの有無にかかわらず showLogo()false を返すことが確認されています。

設計判断

環境変数での制御 という方式が採用されています。

アニメーション抑制のような「実行環境への適応」は、CLIフラグよりも環境変数のほうが自動化スクリプトや CI/CD パイプラインとの親和性が高く、コマンドラインのインターフェースを変えずに挙動を変更できます。値の判定を != "true" とすることで、"false" や未設定の場合はすべてデフォルト動作(アニメーションあり)となるため、既存の利用者への影響がありません。

また、ONCE_INTERACTIVE(非対話インストール)と ONCE_REDUCED_MOTION(アニメーション抑制)という命名は、ONCE_ プレフィックスで統一されており、ツール固有の環境変数として識別しやすい設計です。今回 README にまとめてドキュメント化されたことで、他の環境変数の追加にも一貫したガイドラインが示されました。

まとめ

showLogo() への1行の条件追加という最小限の変更で、アニメーションが問題となる環境向けの逃げ道を提供しています。ONCE_ プレフィックスによる命名規則の確立とドキュメント化も同時に行われており、今後の環境変数追加の土台となる変更です。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
aa9c0fcb

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

「リード文(総論)→背景・技術詳細・設計判断(各論)→まとめ(結論)」という3部構成が明確に守られています。各セクションの役割がはっきりしており、読者が情報を理解しやすい構成です。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きのコードブロック記法(```go:internal/ui/install.go)やPR番号のリンク記法([PR #36](URL))が正しく使用されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

Goのコードや環境変数に関する具体的な解説が含まれており、専門知識を持つエンジニアという対象読者に適した技術レベルと表現で書かれています。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクション内が総論→各論で構成され、各段落はトピックセンテンスで始まっています。1段落1トピックの原則が守られ、段落長も適切で可読性が高いです。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内で引用されているコード(変更前・変更後)は、提供されたDiff情報と完全に一致しています。テストコードに関する説明も、Diffの内容を正確に反映しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「環境変数」「CLIフラグ」「CI/CD」といった技術用語が文脈に応じて正確に使用されています。PRで使われている固有名詞(`ONCE_REDUCED_MOTION`など)も正しく記載されています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

コード変更のロジック(`!= "true"`の評価)や、それがもたらす挙動についての説明は技術的に正確で、論理的です。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内のすべての主張は、PRのDescriptionやDiff内のコードで裏付けられています。「設計判断」セクションの解説も、PRの文脈から逸脱しない妥当な内容であり、ハルシネーションは検出されませんでした。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#36)や環境変数名、ファイルパスといった固有名詞がすべて正確に記載されています。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事のタイトルは、PRのタイトル(Allow turning off starfield/logo animation)の内容をより具体的に、かつ正確に表現しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

PR情報に記載のないバージョンサポート状況やリリース日程などの外部知識の捏造は見られませんでした。設計判断に関する一般的な解説も、PRの文脈に沿ったものでした。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

「できるようになりました」という表現は、PRの変更が既にマージされた事実と一致しており、時間表現に歪曲はありません。