> termcourse: ターミナルからDiscourseインスタンスを読み書きする

これはターミナルアプリ(TUI)です。少しの遊び心と、現時点での実験的な要素を含んでいます。

:information_source: サマリー トピック一覧、トピック全体の表示、返信、いいね、検索、組み込みエディタを備えた、Discourseフォーラムの閲覧と投稿のためのターミナルUI。
:hammer_and_wrench: リポジトリリンク GitHub - merefield/termcourse: A terminal based client to access Discourse instances, supporting API keys, username/password (and with MFA token) · GitHub
:open_book: インストールガイド リポジトリ内のREADME.md(クイックスタートセクション)
:heart: スポンサーシップ 私のオープンソース活動への継続的なスポンサーとして、あなたやあなたの組織のリソースやニーズに合ったレベルで支援を検討してください。これにより、このプロジェクトが適切なメンテナンスを受け、将来もあなたのサイトで機能し続けることが保証されます(https://github.com/sponsors/merefield)。

termcourseを楽しんでいますか?GitHubで:star:をお願いします。

概要

termcourseは、単一のGo実行ファイルとして再構築されたターミナルベースのDiscourseクライアントです。ユーザー名/メールアドレスとパスワードによる軽量なブラウザ風クッキーセッションを使用でき、TOTPおよびバックアップコードによるMFAにも対応しています。対話的なログインが不適切なサイトでは、APIキーによる認証も利用可能です。

インターフェースは現在のCharmスタックを使用し、キーボードとマウス両方で操作できます。フォルダ風のナビゲーション、コンテキストフィルタ、レスポンシブなパネル、テーマ付きコントロール、Markdownレンダリング、インライン画像は、ターミナルから離れずにフォーラムを快適に閲覧できるように設計されています。

機能

  • Latest、Hot、New、Unread、Top、Private Messageのトピック一覧を閲覧し、Top期間を切り替えられます。
  • 永続的なTopics、Search、Notifications、Composeフォルダをナビゲートし、コンテキストに応じた2階層フィルタを使用できます。
  • 全体でキーボードを使用するか、タブ、トピック行、フッターコントロール、ホバーハイライトされたボタンをクリックできます。
  • Enterキーまたは数字キー10で表示中のトピックを開きます。
  • レイジーローディング、コンパクトな抜粋、選択された投稿の展開、レスポンシブなスクロールにより、完全なトピックを読み取れます。
  • トピックの進捗トラックをクリックして、投稿ストリーム内のそのポイントに直接ジャンプできます。
  • トピックを作成し、カテゴリを選択し、トピックや個別の投稿に返信し、投稿にいいねをつけたり外したりできます。
  • 投稿を検索し、そのトピックのコンテキスト内で該当する投稿に直接ジャンプできます。
  • 未読やプライベートメッセージのバッジを含む通知を閲覧・フィルタリングできます。
  • カーソル移動、挿入、折り返し、ペーストサポート、ライブバリデーションを使用して、複数行のコンテンツを作成できます。
  • リンク、リスト、引用、コード、タスクリスト、テーブルを含むGFM Markdownをレンダリングします。
  • Kittyグラフィックスプロトコルを使用して高品質なインラインおよびフルスクリーン画像を表示し、ポータブルなフォールバックとしてカラー付きchafaシンボルまたはviuを使用します。
  • クッキーセッションを使用している場合、リアルタイムでトピック一覧、トピック、通知、プライベートメッセージの更新を受信します。
  • 環境変数またはcredentials.ymlからのサイト別認証情報を使用し、欠落したログイン項目にはプロンプトが表示されます。
  • defaultslatefairgroundrusthackerテーマから選択し、YAMLテーマを追加し、アプリ実行中にテーマを切り替えられます。
  • 自動的なターミナル機能検出により、トゥルーカラー、256色、16色の出力を使用できます。
  • インターフェースを英語、フランス語、ドイツ語、スペイン語で実行できます。
  • ターミナルを自由にリサイズできます:レイアウト、カラー、トピック一覧、Kitty画像は利用可能なスペースに反応します。
  • Discourseがアクションをレート制限した場合、サーバーが提供するリトライタイミングを表示し、オプションでHTTP、UI、画像の診断情報を表示します。

インストールと実行

LinuxまたはmacOSでは、推奨されるインストーラーは現在のOSとアーキテクチャ向けの事前構築リリースをダウンロードし、SHA-256チェックサムと報告されたバージョンを検証してからインストールします:

curl -fsSL https://raw.githubusercontent.com/merefield/termcourse/master/install-release.sh | sh
termcourse your.discourse.host

認証情報がまだ設定されていない場合、Termcourseはユーザー名とパスワードの入力を求めます。パスワード入力は非表示になります。

インストールされたセマンティックバージョンを表示するにはtermcourse --versionを使用します。同じバージョンは広いターミナルのマストヘッドにも表示されます。

sudoを必要としないユーザーローカルなインストールを行うには:

curl -fsSL https://raw.githubusercontent.com/merefield/termcourse/master/install-release.sh |
  TERMCOURSE_BIN_DIR="$HOME/.local/bin" sh

GitHubリリースには、AMD64とARM64向けのLinux、macOS、Windows用のSHA-256チェックサムと事前構築アーカイブが提供されています。Linux/macOSは.tar.gz、Windowsは.zipを使用します。事前構築リリースにはGoは不要です。

Windowsでは、インストーラーをダウンロードして検査し、マシン全体の実行ポリシーを変更せずに実行します:

Invoke-WebRequest https://raw.githubusercontent.com/merefield/termcourse/master/install-release.ps1 -OutFile install-release.ps1
powershell -NoProfile -ExecutionPolicy Bypass -File .\install-release.ps1

デフォルトでは%LOCALAPPDATA%\Programs\termcourse\binにインストールされ、同じチェックサムとバージョン検証が行われます。インストーラーは--versionまたは-Versionを使用してリリースを固定することもできます。ソースからインストールする場合のみ、Go 1.26.6以降が必要です。

代わりにチェックアウトからローカル実行ファイルをビルドするには:

git clone https://github.com/merefield/termcourse.git
cd termcourse
make build
./termcourse your.discourse.host

繰り返し使用する場合、ログイン情報をローカルの.envに格納するか、READMEで説明されているホスト別のcredentials.ymlを使用してください。

ユーザー名/パスワードログイン(推奨)

ユーザー名/パスワードログインはリアルタイム更新を有効にします:

DISCOURSE_USERNAME="you@example.com" \
DISCOURSE_PASSWORD="your_password" \
termcourse your.discourse.host

APIキーフォールバック

DISCOURSE_API_KEY="your_key" \
DISCOURSE_API_USERNAME="your_username" \
termcourse your.discourse.host

設定、テーマ、コントロール、画像バックエンド、トラブルシューティングについては、最新のREADMEを参照してください。

認証に関する注記

  • ユーザー名/パスワードログインはDiscourseのCSRFおよびクッキーフローに従い、リアルタイムのMessageBus更新を有効にします。
  • TOTPおよびバックアップコードによるMFAに対応しています。
  • APIキー認証はHTTP機能を保持しますが、リアルタイムのブラウザセッションは確立されません。
  • スクリプトによるユーザー名/パスワードログインを無効化または制限しているサイトがあります。そのようなサイトでは、API認証情報がフォールバックとなります。

セキュリティ

  • Termcourseはプロンプトされた認証情報やセッションクッキーをディスクに書き込みません。セッションクッキーはメモリ内に保持されます。
  • パスワードプロンプトにより、パスワードがシェル履歴に残るのを防ぎます。
  • 永続的な認証情報はオプションであり、環境変数またはYAMLファイル内でユーザーの管理下にあります。
  • 診断ログはオプトイン方式で、デフォルトでは無効化されており、認証情報やレスポンスボディを記録しません。

制限事項

  • リモートログインフローを禁止しているサイトでは、APIキー認証が必要になる場合があります。
  • リアルタイム更新にはユーザー名/パスワードによるクッキー認証が必要です。
  • ネイティブなインライン画像の品質はターミナルのサポートに依存します。Kittyが優先されますが、他の場所ではシンボルレンダリングが利用可能です。
  • ターミナル内に存在します。:slight_smile:

クレジット

一部はDumbcourse: old browser friendly UI at dumb/d-pad/small screensに着想を得ています。:clap:

「いいね!」 27

複数のサイトに素早くログインできるように(もちろんタブごとに1セッション)、以下の改善を行いました。

termcourse 認証と設定の改善

  • ユーザー名/パスワードがデフォルトのログインパスになりました。
  • https:// を含める必要がなくなりました(オプションです)。
  • 不足しているログインフィールドは対話形式で求められます(例:ユーザー名はわかっているがパスワードが不足している場合)。
  • CLIヘルプにコア環境変数とデバッグログファイルの位置が含まれるようになりました。

認証情報と環境変数 (ENV) の動作

  • ホストマッピングされた認証ファイルに対応し、検索順序は以下の通りです。
    1. TERMCOURSE_CREDENTIALS_FILE(設定されている場合)
    2. ./credentials.yml
    3. ~/.config/termcourse/credentials.yml
  • 認証の優先順位:
    1. CLIフラグ
    2. YAMLからのホスト認証情報
    3. 一般的な DISCOURSE_* 環境変数
    4. 対話型プロンプト
  • 認証の場合、ログイン時にユーザー名やパスワードの値が不足している場合はプロンプトが表示されます。
  • API認証の場合、APIユーザー名とキーの両方が空でない値に解決される必要があります。

デバッグ

  • HTTP/認証デバッグ: TERMCOURSE_HTTP_DEBUG=1/tmp/termcourse_http_debug.txt
  • UIレンダリングデバッグ: TERMCOURSE_DEBUG=1/tmp/termcourse_debug.txt

リポジトリの衛生管理

  • 整列された例を含む credentials.example.yml.env.example を追加しました。
  • ローカルのシークレットファイル用の .gitignore エントリを追加しました。
    • .env
    • credentials.yml
「いいね!」 3

これはかなりローファイですが、動作します。

viu または chafa をインストールする必要があります。それ自体がプロジェクトになる可能性がありますね :slight_smile:

chafa の高画質モードまたは viu では、Windows Terminal の方が MacOS terminal よりも優れています。なぜなら、サポートする色数がはるかに多いからです(Microsoft に感謝!)。

リリースノート: 画像レンダリング(ターミナル内!)

画像レンダリング

  • バックエンド選択によるインライン投稿画像プレビューの追加:
    • まず chafa を試し、次に viu を試みます。
    • TERMCOURSE_CHAFA_MODE=stable|quality
    • stable: ターミナル安定性のための控えめな出力。
    • quality: より高精細/高彩度のシンボルレンダリング。
  • プレビュー高さ制御の追加:
    • TERMCOURSE_IMAGE_LINES (デフォルト: 14)
    • プレビューの行の高さに適用され、視覚的な密度を調整するのに役立ちます。
  • viu のアスペクト動作の改善:
    • アスペクト比をより良く維持するために、行ターゲットレンダリング (-h) に切り替えました。
  • プレビュー品質フィルター制御の追加:
    • TERMCOURSE_IMAGE_QUALITY_FILTER=1 は、ノイズの多いブロックのみのプレビューをフィルターします。
    • レンダラー出力を常に表示するには、0 に設定します。
  • 画像ダウンロードの安全制限の追加:
    • TERMCOURSE_IMAGE_MAX_BYTES (デフォルト: 5242880)
    • パフォーマンスへの影響を防ぐため、大きすぎる画像ダウンロードを防止します。
  • Discourse の upload://... 画像リンクのサポート追加:
    • /uploads/short-url/... に自動的に解決されます。
  • ターミナルのサニタイズ/安定性の改善:
    • 必要な場所で有効な SGR カラーコードを保持します。
    • 不安定な制御/グラフィックシーケンスを削除します。
    • ANSI エスケープフラグメントが生のテキストとして表示されるのを防ぎます。

注:リモートのユーザー名/パスワードをブロックするサイトが1つ見つかりました。そのため、その状況ではこのクライアントは機能しません(ご自身で所有していてAPIキーを設定できる場合を除く!)。ご提案は歓迎しますが、現時点ではそのようなケースのサポートはありません。

これを実世界で使うかどうかは分かりませんし、私にとっての使い道は見えませんが、試してみたところ、とても楽しいです。ベアメタルで原始的なインターフェースから次世代のフォーラムプラットフォームと対話できるのが気に入っています。

ある意味、美的に非常に優れています。

「いいね!」 1

ええ、以下のような場合に役立つかもしれません。

  • 低いファイ環境にいるとき
  • ラズベリーパイでいじっているとき(未テスト FYI)
  • サーバーから稼働状況を確認するとき…あるいはフロントエンドのコードがクラッシュしていないか確認するとき!:smiley:
  • 非常にテキストベースのDiscourseサイトで…
  • …そして技術的な好奇心として :slight_smile:

Terminusを使って携帯電話でテストしてみようと思っていました…

「いいね!」 3

OK、おそらく今日最後のアップデートです:

  • ウィンドウサイズ変更にインターフェースが応答するようになりました :tada:
  • トップバーの指示のコンテンツが改善されました
  • キー1から(1)0でトピックリストのその番号のトピックが開きます

アップデートを取得するにはgit pullを忘れないでください。

「いいね!」 3

やれやれ、これでアスキーアートの制作に取り掛からなきゃ!
¯\_(ツ)_/¯

「いいね!」 3

完全にカスタマイズ可能なテーマシステムを追加しました。これが「fairground」(遊園地)です。

…そしてこれが「slate」(スレート)です。

詳細はREADMEをご覧ください :graduation_cap:

「いいね!」 5

さあ、皆さん、注目の :tangerine: アップデートです:

  • プライベートメッセージのサポートを追加 - fを2回タップ :tada:
  • 幅が展開されるにつれて、カテゴリ、ユーザー、ビューの追加列を追加
  • 垂直セパレーターのテーマを調整
  • READMEを更新

「いいね!」 2

これを昨日マージしました。

  • chafa または viu をインストールする努力をした場合、投稿画像の「フルウィンドウ」トグルという新しい機能で報われます。Windows では、Windows Terminal アプリの寛大な色深度サポートのおかげで、これは特に優れています。

termcourse には、トピックリストのステータスバーに未読のプライベートメッセージ (PM) ステータスのポップアップが表示されるようになり、ブラウザクライアントと同様に、カーソルを移動するにつれて投稿ごとに既読通知が投稿されます。

「いいね!」 2

macOSでのテーマに関する修正をマージしました

「いいね!」 2

いいですね…これはピップボーイで動作しますか?

「いいね!」 3

自由にPRを提出するか、カラーコードを共有していただければ、例のテーマymlに追加します :slight_smile:

「いいね!」 2

気に入りました!マージしました、ありがとうございます!

「いいね!」 2

https://github.com/merefield/termcourse/pull/2

レンダリングがひどかったので修正しました。UIは差分レンダリングになり、はるかに高速でスムーズになりました。カーソル移動のたびに画面全体を再描画することはなくなりました。

今のところWindowsでのみテストしましたが、何か問題があればフィードバックをお願いします。低速なシステムでは大幅に改善されるはずです。

テストとGitHub CIも追加しました!

MessageBusに基づいたリアルタイム通知システムを備え、トピックリストに新しい更新があった際にステータスバーで通知されるようになりました(これによりgを押して更新できます):

次はトピックの既読バッジに取り組む予定です…

それは素晴らしいですね!

Discourse と同じキーボードショートカットを使用しませんか?そうすれば、エクスペリエンスがよりシームレスになりますよ :slight_smile:

「いいね!」 1

悪くないアイデアですね…そのうち真剣に近づけることができるか試してみる価値はありますね :+1: … しかし、もちろん媒体には大きな違いがあるので、いくつかのことは異なるままかもしれません。

「いいね!」 1