やりたいこと
Slackでの毎日の業務報告で、その日自分が作成したPRを箇条書きにしてリンクを貼っています。
例えば以下
これを作るのが面倒なので、コマンド1発で作りたい。
環境
- macOS(zsh)
- クリップボードにコピーする
pbcopy
コマンドはmac用なので、LinuxやWindowsで動かすならコマンドを変える必要があります
- クリップボードにコピーする
- GitHub
- Enterpriseだと使えないかもしれません
- GitHub CLI
設計
今は、手作業で以下のようなMarkdownを書いて、それを貼り付けています。
[feat: hoge API](https://github.com/example/example/pull/1) :done:
[fix: fugaの不具合](https://github.com/example/example/pull/2) :wip:
おつかれさまです。本日の成果
の部分はClipyのスニペットに登録しているので今回は対象外。
:done:
とか:wip:
は、弊社Slackに登録されているスタンプです。
これをSlackの入力欄に貼り付けて、(箇条書きの-
だけは手入力する必要があります)
Cmd + Shift + Fを押すとフォーマットされます。
この元のMarkdownを作成するシェルスクリプトを実装していきます。
実装
#!/bin/zsh
SCRIPT_NAME=$(basename "$0")
# ヘルプメッセージ
show_help() {
cat <<EOF
Usage: $SCRIPT_NAME [<repo1> <repo2> ...]
Description:
12時間以内に作成した自分のPRを取得し、Markdown形式でクリップボードにコピーします。
- 各PRの状態を表示(マージ済み: :done:, 未マージ: :wip:)
- 引数なしの場合はカレントディレクトリのリポジトリを対象に実行
Options:
--help このヘルプを表示
Examples:
# カレントリポジトリのPRを取得
$SCRIPT_NAME
# 指定したリポジトリのPRを取得
$SCRIPT_NAME my-org/repo1 my-org/repo2
EOF
}
# ヘルプオプションのチェック
if [[ "$1" == "--help" ]]; then
show_help
exit 0
fi
# 12時間前のISO 8601形式の日時を取得
SINCE=$(date -u -v -12H +"%Y-%m-%dT%H:%M:%SZ")
# 引数がない場合はカレントディレクトリのリポジトリを取得
if [[ $# -eq 0 ]]; then
REPO=$(gh repo view --json nameWithOwner --jq '.nameWithOwner' 2>/dev/null)
if [[ -z "$REPO" ]]; then
echo "エラー: 実行ディレクトリがGitHubリポジトリではありません。"
echo "リポジトリを指定して実行してください: $SCRIPT_NAME <repo1> [repo2]..."
exit 1
fi
set -- "$REPO"
fi
# PRリストを取得し、Markdown形式に整形
RESULT=""
for REPO in "$@"; do
PRS=$(gh pr list -R "$REPO" --author @me --state all --json title,url,createdAt,mergedAt \
--jq ".[] | select(.createdAt > \"$SINCE\") | \"[\(.title)](\(.url)) \" + (if .mergedAt then \":done:\" else \":wip:\" end)")
if [[ -n "$PRS" ]]; then
RESULT+="$PRS"
fi
done
# クリップボードにコピー(macOS)
if [[ -n "$RESULT" ]]; then
echo "$RESULT" | pbcopy
echo "12時間以内に作成したPRをクリップボードにコピーしました。"
else
echo "該当するPRがありませんでした。"
fi
これを~/copy_prs.sh
として保存して、実行してみましょう。
# 実行権限を付与
chmod +x copy_prs.sh
GitHubリポジトリのディレクトリに移動
cd ~/dev/my-repo
../../copy_prs.sh
12時間以内に作成したPRをクリップボードにコピーしました。
あるいは該当するPRがありませんでした。
と出力されれば正常終了です。
コピーできたなら、どこか適当なところに貼り付けてみましょう。
エラーになった場合、以下のことを確認してください。
- カレントディレクトリがGitHubリポジトリのディレクトリであること
- GitHub CLIがインストールされていること
-
gh auth login
が済んでいること
さらに使いやすくする
shファイルを直接呼び出すのは面倒なので、もっと短いprs
コマンドで呼び出せるようにします。
# リネーム
mv ./copy_prs.sh ./prs
# ホームディレクトリにbinを作成して、prsをそこに移動
mkdir ~/bin
mv ./prs ~/bin/
# ~/binをPATHに追加
echo 'export PATH="$HOME/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
# prsを呼び出してみる
prs --help
# エラーにならなければOK
改善するなら
- PRの絞り込み条件
- 自分が作成はしてないけどレビューはしたものなどは取得できないので、取得したいなら絞り込み条件を変える必要があります
- スタンプ
-
:done:
、:wip:
は弊社Slack独自のスタンプなので、ご使用の環境に合わせて別のスタンプにしたり、不要なら消したりする必要があります
-
おわりに
今ならGitHub MCPサーバーがあるので自然言語でも同じことができちゃうかもしれませんね。