はじめに
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に「類似リポジトリ検索」のエンドポイントがないところを、以下のロジックで実現しています。
- 対象リポジトリの情報(トピック、言語、説明文)を取得する
- トピックから最大3つを取り出し、
topic:Xクエリを組み立てる - トピックがない場合は、説明文からストップワードを除いたキーワードを抽出する
- 言語とスター数(10以上)のフィルターを追加し、検索APIを実行する
- 元のリポジトリ自身を結果から除外する
トピックとキーワードの組み合わせで、関連リポジトリをそれなりの精度で見つけられます。
外部ライブラリなしの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の開発記事をほかにも書いています。
- Homebrewの7000パッケージを人気順・カテゴリ別に探せるCLIツールを作った
- Chrome拡張の手動アップロードをやめた — release-please + GitHub Actionsで公開を完全自動化
- ターミナルでMermaidを描画できるMarkdown CLIツール glowm
リンク
- GitHub: https://github.com/atani/github-discover

コメント