先々週あたりから、ポストの下に"Related Posts"という見出しを設定した。MarkdownのFrontmatterに

related:
- ../04/03_show_thumbnail
- ../05/07_ogp_to_card.md

と設定しておくと以下のように表示される。

PaperModテンプレートの使っていないpost_nav_links.htmlを流用した。

で、ここからが本題。

この related をちまちま足していたんだけど、2,3個やってすぐに飽きた。自動化すべき。

  1. ポスト同士の類似度を計算する
  2. 類似度が高いポストをFrontmatterの related に挿入する

1つ目については、ちょっと前に作った類似度グラフから流用すれば良い1。2つ目も、スクリプト書けばいい。問題はいつこの計算をやるのか

  1. メモの保存時に計算する
  2. メモの投稿直前に計算する
  3. メモがマージされた後計算される

1.はメモのトークン計算時にやっているが(参考メモ)、類似度の計算はそんな頻度で実行したくない。2.は単純に忘れそう2。というわけで3.を採用。Github ActionsでPull Requestを作成するbot、以下PR botを設定する。

まずは更新ファイルがあるかどうかをチェックする。

- name: Check for changes
    id: git-check
    run: |
        git diff --exit-code || echo "changes=true" >> $GITHUB_OUTPUT

一応、Hugoでビルドできるかチェックしておく。このチェックは、PR botじゃなくて、PR毎のテストでやるべきかもしれない3

- name: Verify Hugo build
    if: steps.git-check.outputs.changes == 'true'
    id: hugo-build
    run: |
        npm ci
        echo "Building Hugo site to verify changes..."
        if hugo --minify; then
            echo "Hugo build successful"
            echo "build_success=true" >> $GITHUB_OUTPUT
        else
            echo "Hugo build failed"
            echo "build_success=false" >> $GITHUB_OUTPUT
            exit 1
        fi

PRは peter-evans/create-pull-request を使うのが簡単。PRテンプレート本文はCopilotが生成した。

- name: Create Pull Request
    if: steps.git-check.outputs.changes == 'true' && steps.hugo-build.outputs.build_success == 'true'
    uses: peter-evans/create-pull-request@v5
    with:
    token: ${{ secrets.GITHUB_TOKEN }}
    commit-message: "🤖 Update related posts automatically"
    title: "🤖 Auto-update related posts"
    body: |
        ## 🤖 Automated Related Posts Update
        
        This PR automatically updates the related posts in markdown files based on content similarity.
        
        ### Changes:
        - Updated related posts in frontmatter
        - Refreshed similarity vectors
        
        **Generated by:** GitHub Actions
        **Triggered by:** Push to main branch
    branch: auto-update-related-posts
    delete-branch: true
    draft: false

このステップを実行するには、対象のレポジトリのActionsにPRの権限を渡す必要がある。

Repo > Settings > Actions > General > Workflow permissions

Repo > Settings > Actions > General > Workflow permissions

こちらが結果

問題なさそうなら、簡単なテストを足してAuto Mergeでもいいかもしれない。ローカルにPullするのを忘れそうだけど。


  1. というか正確には、この"Related Posts"という項目を自動化したくて、類似度を計算することにした、という順番 ↩︎

  2. .git/hooks/pre-push と組み合わせても可能そう ↩︎

  3. メモの投稿はまとめてmainブランチに投げているため、いちいちPRにするのが面倒、というのもある ↩︎