RY2X Ry2X.NET

par_TUI - アップデートを簡単なものに

rust ratatui arch-linux

Arch Linux のアップデートを視覚的に管理するための、Ratatui 製 TUI ツールです。 通常、Arch Linux では pacman コマンドでシステムを更新しますが、par_tui はこのプロセスを直感的に、かつ安全に制御することを目指しています。

GitHub: ry2x/par_tui

par_tui screenshot

構築の背景と動機

Arch Linux における sudo pacman -Syu は、ローリングリリースの恩恵を最大化し、システムを最新かつ一貫した状態に保つための基本コマンドです。公式にはこれ以外の手法での更新は推奨されていません。

しかし、AUR (Arch User Repository) を利用している環境では、状況が少し複雑になります。paruyay といった AUR ヘルパーを使用する場合、特定のパッケージ(開発版の -git パッケージや、ビルドに時間がかかる特定のソフトなど)を一時的にアップデートから除外したい場面が珍しくありません。

通常、これを行うには --ignore <package-name> フラグを手動で付与する必要がありますが、管理コストが高く、入力ミスも発生しやすくなります。

一方で、/etc/pacman.confIgnorePkg に恒久的に記述してしまう手法もあります。しかし、これは「除外していること自体を忘れてしまう」というリスクを孕んでおり、長期的にシステムの依存関係を壊す(部分的アップグレード状態の放置)原因になりかねません。

「今、何を除外しようとしているのか」を明確に可視化し、安全かつ柔軟に ignore を指定できるインターフェースが欲しい。 その思いが、このツールを作成した動機です。

技術スタック

  • Rust: スタンドアロンで軽量なバイナリを提供するため採用。
  • Ratatui: 描画処理を抽象化し、リッチな TUI 画面を効率的に構築するため採用。

クリーンアーキテクチャを実現する設計

このプロジェクトは、明確なスコープを持つ小規模なツールであることを活かし、徹底的な関心事の分離(SoC)を試行しました。

「ディレクトリ構造 = アーキテクチャ」の徹底

本プロジェクトでは、ディレクトリ構造そのものがアーキテクチャを定義するという制約を設けています。各レイヤーの依存関係は厳格に一方通行であり、これを破る実装は設計上の欠陥として排除しています。

レイヤー責務依存ルール
models/ドメインデータの定義(Package, Config など)。他レイヤーへの依存禁止。
io/外部コマンド実行、ファイル読み書き、ターミナル制御。ビジネスロジックの記述禁止。
parser/生の文字列をモデルへ変換(checkupdates や paru の出力解析)。I/O や UI 処理の禁止。
core/更新プランの作成、依存関係の競合検知、フィルタリング。I/O や UI への直接参照禁止(副作用の排除)。
ui/プレゼンテーション層。状態の描画と入力の受け取り。ビジネスルールの決定禁止。

この設計により、core レイヤーの意思決定ロジックは OS や外部コマンドに依存せず、静的なデータに対して決定論的に動作するため、ユニットテストが極めて容易になっています。

主な機能と安全への配慮

非破壊的なスキャン

par_tui は起動直後、バックグラウンドで checkupdatesparu -Qua を実行します。これらはシステムのパッケージデータベースを変更しない「読み取り専用」のコマンドであるため、スキャン中にシステムに影響を与えることはありません。また、スキャンは非同期で行われるため、ユーザーは待機中も TUI 上でヘルプの確認などの操作が可能です。

依存関係の競合検知

安易なパッケージの除外は、システム全体の整合性を損なうリスクがあります。 本ツールでは、ユーザーが特定のパッケージを ignore 指定した際、更新対象の他パッケージがそのパッケージに依存していないかをチェックします。もし競合が検知された場合は警告モーダルを表示し、ユーザーにリスクを承知した上での判断を促します。

リアルなターミナルへの回帰

TUI ツールにありがちな「ツール内で無理にパッケージ更新を完結させる」ことはあえて避けています。 更新内容が確定すると、ツールはターミナルの生モードを解除して終了し、実際の pacmanparu コマンドに制御を戻します。これにより、sudo のパスワード入力や、パッケージマネージャが発する重要なメッセージをユーザーが直接、確実に確認できるようになっています。

最後に:知的インターフェースとしての TUI

par_tui は、自動化のためのツールではありません。むしろ、Arch Linux ユーザーが「今、自分のシステムで何が起きようとしているのか」を正確に把握し、その場で対話的に意思決定を下すためのインターフェースです。

「スキャンは安全に、決定は対話的に、実行は透明に」。

この原則を Rust の型システムと厳格なアーキテクチャで保護することで、Arch Linux のシステムメンテナンスをより快適で、予測可能なものに変えていくことを目指しています。