github-discover: GitHubのトレンドをターミナルで追えるCLIツールを作った

はじめに

GitHubで面白いリポジトリを見つけたいとき、どうしていますか。GitHub Trendingページをブラウザで開く、Awesome系リストを見る、SNSで流れてきたものをチェックする。いくつか方法はありますが、どれもブラウザへの切り替えが必要です。

ターミナルで作業中に「今週話題のリポジトリは何か」「このリポジトリに似たものはないか」をすぐに調べられるCLIツール github-discover を作りました。

この記事でわかること。

  • github-discoverの7つの機能(トレンド、カテゴリ、類似検索、ランダムなど)
  • GitHub APIだけで「類似リポジトリ検索」を実現する方法
  • ファイルベースキャッシュとマルチバイト対応の実装

作ったもの

github-discover は、GitHubのリポジトリをさまざまな切り口で探索できるCLIツールです。

機能 説明
トレンド 日・週・月単位でトレンドリポジトリを表示
カテゴリブラウズ CLI, web, ai, devopsなど7カテゴリで分類
類似検索 指定したリポジトリに似たリポジトリを提案
ランダム発見 人気リポジトリからランダムでおすすめ
強化検索 人気順ソートの検索
詳細情報 スター数や説明の詳細表示
多言語対応 日本語と英語に対応
$ github-discover trending -n 5

Trending Repositories (weekly)
────────────────────────────────────────────────────────────────────────────────
  1. freeCodeCamp/freeCodeCamp                ★ 438.7k  [TypeScript]
     freeCodeCamp.org's open-source codebase and curriculum.
  2. public-apis/public-apis                  ★ 414.4k  [Python]
     A collective list of free APIs
  3. EbookFoundation/free-programming-books   ★ 384.4k  [Python]
     Freely available programming books
  4. kamranahmedse/developer-roadmap          ★ 351.5k  [TypeScript]
     Interactive roadmaps, guides and other educational content
  5. donnemartin/system-design-primer         ★ 339.9k  [Python]
     Learn how to design large-scale systems.
────────────────────────────────────────────────────────────────────────────────

インストール

brew tap atani/tap
brew install github-discover

Go環境がある場合は go install でもインストールできます。

go install github.com/atani/github-discover@latest

使い方

トレンドを見る

# 週間トレンド(デフォルト)
github-discover trending

# Go言語の日間トレンド
github-discover trending --since daily -l go

# 月間トレンド、上位10件
github-discover trending --since monthly -n 10

GitHub Trendingページと同じ感覚で、言語と期間を指定してトレンドを確認できます。

カテゴリで探す

# カテゴリ一覧を表示
github-discover browse

# AI・機械学習カテゴリ
github-discover browse ai

# 対応カテゴリ: cli, web, ai, devops, security, data, mobile

「CLIツールで何か良いのないかな」というときに、カテゴリ指定でまとめて探せます。

類似リポジトリを探す

# golang/goに似たリポジトリを検索
github-discover similar golang/go

# 結果を5件に制限
github-discover similar denoland/deno -n 5

気に入ったリポジトリがあるとき、関連するリポジトリを芋づる式に見つけられます。

ランダムで出会う

# ランダムに1つおすすめ
github-discover random

# 5つおすすめ
github-discover random -n 5

# Rust限定でランダム
github-discover random -l rust

日本語で使う

github-discover trending --lang ja

技術的なポイント

GitHub APIだけで類似検索を実現する

similar コマンドは、GitHub APIに「類似リポジトリ検索」のエンドポイントがないところを、以下のロジックで実現しています。

  1. 対象リポジトリの情報(トピック、言語、説明文)を取得する
  2. トピックから最大3つを取り出し、topic:X クエリを組み立てる
  3. トピックがない場合は、説明文からストップワードを除いたキーワードを抽出する
  4. 言語とスター数(10以上)のフィルターを追加し、検索APIを実行する
  5. 元のリポジトリ自身を結果から除外する

トピックとキーワードの組み合わせで、関連リポジトリをそれなりの精度で見つけられます。

外部ライブラリなしのHTTPクライアント

GitHub APIの呼び出しには、go-github のようなサードパーティライブラリを使わず、標準ライブラリの net/http だけで実装しています。必要なエンドポイントは検索API(/search/repositories)とリポジトリ取得(/repos/:owner/:repo)の2つだけなので、ライブラリを入れるほどでもないと判断しました。

依存は cobra(CLI)と lipgloss(ターミナル装飾)の2つだけです。

ファイルベースキャッシュ

APIレスポンスを ~/.cache/github-discover/ にJSONファイルとして保存します。検索結果は1時間、リポジトリ情報は24時間のTTLで保持します。

# キャッシュを無視して最新データを取得
github-discover trending --refresh

キャッシュキーにはリポジトリ名(owner/repo)やクエリ文字列が含まれるため、/: などのファイル名に使えない文字をアンダースコアに変換するサニタイズ処理を入れています。

マルチバイト文字の切り詰め処理

ターミナルのテーブル表示では、列幅を固定して文字列を切り詰めます。日本語などのマルチバイト文字は1文字あたり2カラム分の幅を取るため、単純なバイト数やルーン数ではなく表示幅ベースでの切り詰め処理を実装しています。

おわりに

ブラウザを開かずにGitHubの最新トレンドや関連リポジトリを探せるツールになりました。

github-discover random で思いがけないリポジトリに出会えるので、作業の合間にぜひ試してみてください。

関連記事

CLIツールやOSSの開発記事をほかにも書いています。

リンク

  • GitHub: https://github.com/atani/github-discover

コメント

タイトルとURLをコピーしました