今日作成したPRの一覧をMarkdownでクリップボードにコピーする


## やりたいこと
Slackでの毎日の業務報告で、その日自分が作成したPRを箇条書きにしてリンクを貼っています。  
例えば以下
![スクリーンショット 2025-05-04 12.47.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361302/996388ae-caa3-4a0d-863a-4164e25f3080.png)

これを作るのが面倒なので、コマンド1発で作りたい。


## 環境
- macOS（zsh）
    - クリップボードにコピーする`pbcopy`コマンドはmac用なので、LinuxやWindowsで動かすならコマンドを変える必要があります
- GitHub
    - Enterpriseだと使えないかもしれません
- [GitHub CLI](https://github.com/cli/cli#installation)

## 設計
今は、手作業で以下のようなMarkdownを書いて、それを貼り付けています。

```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の入力欄に貼り付けて、（箇条書きの`- `だけは手入力する必要があります）
![スクリーンショット 2025-05-04 13.00.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361302/a8507855-5e95-4c94-9809-98f3f0790886.png)

Cmd + Shift + Fを押すとフォーマットされます。
![スクリーンショット 2025-05-04 13.00.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361302/e75ce4e3-814c-4e5c-b01d-6a32046420c6.png)

この元の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`として保存して、実行してみましょう。
```zsh
# 実行権限を付与
chmod +x copy_prs.sh
GitHubリポジトリのディレクトリに移動
cd ~/dev/my-repo
../../copy_prs.sh
```

`12時間以内に作成したPRをクリップボードにコピーしました。`あるいは`該当するPRがありませんでした。`と出力されれば正常終了です。
コピーできたなら、どこか適当なところに貼り付けてみましょう。
エラーになった場合、以下のことを確認してください。
- カレントディレクトリがGitHubリポジトリのディレクトリであること
- [GitHub CLI](https://github.com/cli/cli#installation)がインストールされていること
- `gh auth login`が済んでいること

## さらに使いやすくする
shファイルを直接呼び出すのは面倒なので、もっと短い`prs`コマンドで呼び出せるようにします。

```zsh
# リネーム
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サーバーがあるので自然言語でも同じことができちゃうかもしれませんね。